
簡介PyFEM 是一套基于 Python 的彈塑性有限元計算程序包面向力學分析、結構仿真和數值計算學習者主要解決材料在載荷下的線彈性及塑性變形建模問題可應用于土木、機械與航空航天等工程場景。壓縮包共 88 個文件包括 61 個 Python 腳本、14 個 pro 工程算例、12 個 dat 數據文件及 1 份 PDF 說明手冊總大小僅 301KB目錄按源碼、文檔、示例分層組織方便對照查閱。已有 589 人學習下載。除主程序與安裝腳本外還提供多種彈塑性靜力/動力分析算例覆蓋網格構建、材料本構定義、邊界條件處理以及 Newton-Raphson、Riks 弧長法等非線性求解和結果后處理的完整流程。配合手冊與示例代碼既能幫助初學者從實際操作理解有限元原理也可供科研與工程人員在彈塑性計算中直接改寫復用。1. 彈塑性有限元不是把剛度矩陣換成塑性矩陣那么簡單在 pyfem 這類輕量級有限元程序里很多人剛接觸彈塑性計算時會有個直覺把材料本構從線彈性換成彈塑性再把彈性剛度矩陣替換成彈塑性矩陣問題就解決了。實際操作過就會發現計算根本不收斂或者結果跟理論解差得很遠。pyfem-1.0 里彈塑性有限元的實現核心不在于矩陣怎么組裝而在于每個積分點上應力應變狀態如何更新。我最初用 pyfem 算薄壁圓筒有限元問題時也踩過同樣的坑。本文基于 pyfem-1.0 的框架把彈塑性有限元的落地路徑拆開講清楚——本構積分怎么做、載荷增量怎么控制、塑性參數怎么標定以及最常見的不收斂問題出在哪一環。適合正在用或者打算用 pyfem 寫彈塑性算例的工程師和研究生。2. 從彈性到彈塑性pyfem 里本構更新那一步到底發生了什么2.1 為什么彈性剛度矩陣在塑性階段會失效有限元求解的核心方程是平衡方程彈塑性計算也不例外。在 pyfem 里整體剛度矩陣由每個單元的高斯積分點上的材料剛度貢獻組裝而成。彈性階段應力與應變的關系由廣義胡克定律唯一確定剛度矩陣恒定不變。一旦進入塑性階段應力狀態不再隨應變線性增長而是被屈服面約束住此時繼續用彈性剛度矩陣去計算得到的應力會超出屈服面物理上已經不成立了。pyfem-1.0 處理這個問題的方式是把非線性集中在材料本構積分層面。每個載荷增量步內程序給定應變增量然后調用材料子程序計算新的應力狀態。關鍵在于這個應力更新過程必須滿足兩個條件應力點最終落在屈服面上而且塑性流動方向正確。這本質上是一個約束優化問題常用算法是徑向返回映射Radial Return Mapping。理解了這一點去看 pyfem 的源碼結構就不會只盯著剛度矩陣找了。2.2 徑向返回映射pyfem 里塑性矯正的標準流程以經典的 J2 屈服準則von Mises為例pyfem 的應力更新流程分兩步走。第一步假設應變增量全部是彈性的計算試探應力trial stress。第二步檢查試探應力是否超出屈服面。如果沒超出說明還在彈性加載直接接受試探應力如果超出了就需要把應力拉回屈服面上。這個回拉過程叫塑性修正plastic corrector。# pyfem 中 J2 塑性徑向返回的核心邏輯簡化示意 def return_map(stress_old, dstrain, props): # 彈性試探步 stress_trial stress_old C_elastic dstrain # 計算偏應力 s deviatoric(stress_trial) s_norm norm(s) # 屈服函數值s_norm - yield_stress f_trial s_norm - sqrt(2/3) * sigma_y if f_trial 0: # 純彈性直接返回 return stress_trial, 0.0 # 塑性修正量等效應變增量 deq f_trial / (2*G 2/3 * H_prime) factor 1 - 3*G*deq / s_norm stress_new deviatoric(stress_trial) * factor mean(stress_trial) * I return stress_new, deq這個代碼片段里最關鍵的是塑性修正量的計算。分母里2*G 2/3*H_primeG 是剪切模量H_prime 是塑性硬化模量代表屈服應力隨等效塑性應變增長的速率。等效應變增量deq算出來后用因子factor把偏應力按比例縮小應力點就回到了屈服面上。這里注意徑向返回只修正偏應力部分靜水壓力部分不變因為 J2 屈服準則與靜水壓力無關。2.3 一致切線模量 vs 連續切線模量應力更新只是第一步。pyfem 要保證全局牛頓迭代二次收斂還需要給整體剛度矩陣提供一致的切線剛度矩陣。這里有個初學者容易忽略的細節切線模量有兩種取法數學上連續推導的連續切線模量和從離散化本構積分算法直接導出的 algorithmic一致切線模量。切線模量類型推導方式收斂階數pyfem 中的推薦做法連續切線模量由連續本構方程求導理論上二次收斂實際接近線性不推薦用于隱式分析一致切線模量對徑向返回算法本身求導保持牛頓法的二次收斂推薦收斂穩定pyfem-1.0 默認采用一致切線模量。原因是徑向返回算法本身是一種離散化近似如果切線剛度從連續模型推導與實際的應力更新算法不匹配相當于牛頓迭代用了錯誤的 Jacobian收斂速度會明顯下降。極端情況下即使載荷增量取得很小也可能出現反復迭代不收斂。所以在閱讀 pyfem 源碼時看到本構模塊里除了應力更新函數之外還配了一個 get_tangent 函數它的返回值是從更新算法求導得到的目的正是保證迭代的收斂性。提示如果修改 pyfem 的材料本構務必要同時更新切線模量的解析式。用有限差分求切線模量做調試可以但不適合用于正式計算因為數值擾動的舍入誤差足以破壞收斂精度要求。3. 用 pyfem-1.0 跑通第一個彈塑性算例3.1 最小輸入網格、材料與邊界條件怎么組織pyfem-1.0 的輸入組織方式很直白網格節點、單元連接關系、材料參數、邊界條件和載荷分別放在不同的輸入文件或者同一份結構化文件的不同部分。我習慣先把幾何模型想清楚再做網格劃分。pyfem 原生不帶復雜的網格生成器常見的做法是拿其他工具生成網格后轉成 pyfem 的格式。像梁、薄壁圓筒這類規則幾何手寫少量單元腳本完全可行也方便后續校準。彈塑性材料參數至少要給出彈性模量 E、泊松比 nu、初始屈服應力 sigma_y0以及硬化模量 H或者給出應力應變曲線上的若干點程序內部做線性插值。硬化模量 H 的值會影響屈服面隨塑性應變增長的速率。材料從彈性過渡到塑性的這一段的實際曲線就由 E、sigma_y0 和 H 三個參數決定。3.2 增量步與迭代參數的設置彈塑性是路徑相關材料非線性問題載荷必須按增量逐步施加。pyfem 的求解流程在每個增量步內做牛頓迭代。增量步大小怎么選直接決定收斂結果。增量步太大徑向返回的線性化誤差變大牛頓迭代發散的概率迅速上升增量步太小計算量浪費嚴重。# pyfem 求解控制參數示例 solvername newton_raphson n_inc 20 # 總增量步數 max_iter 15 # 每步最大迭代次數 tol 1.0e-8 # 收斂容差對單軸拉伸這類簡單算例20 個增量步通常足夠。對包含多單元、復雜邊界條件的模型我一般把增量步數提高到 50~100并且關注前幾步的迭代次數變化趨勢。如果剛開始幾步就出現迭代次數不降反升的情況不是容差問題而是增量步太大或者約束設置有誤。3.3 從結果文件里提取屈服面信息算完以后pyfem 會輸出每個積分點的應變分量、應力分量和等效塑性應變。檢查計算結果是否正確不要只看最后一步的應力值還要看完整應力-應變關系曲線。設計算例收集每個增量步結束后的應力分量和總應變分量畫出來的曲線應該具有明顯的三階段特征彈性階段斜率 E、屈服點曲線轉折、塑性流動階段斜率接近塑性模量。# 提取 pyfem 輸出文件中的應力應變信息示例路徑 column -t result_his.txt | awk {print $1, $2, $3} curve_data.txt如果得到的曲線在屈服點處出現突兀的跳變說明增量步設得太大屈服點附近的應力被過度修正。此時把 n_inc 調大重新算一遍。如果曲線彈性段斜率都不對問題不在本構而在于網格或積分方案——順序檢查單元類型選擇是否正確、材料參數是否讀錯單位。4. 彈塑性計算不收斂排查順序與參數修正4.1 先判斷是全局問題還是積分點問題pyfem 計算彈塑性問題失敗時終端報錯可能直接指向牛頓迭代不收斂或者剛度矩陣奇異。拿到報錯信息后有個高效順序可以遵循。第一步關掉塑性——把屈服應力設得遠高于計算應力跑同等的加載條件確認模型在線彈性下能正確收斂。如果彈性算不過去問題在網格、邊界條件或接觸設置跟本構無關。第二步恢復彈塑性參數但把載荷增量縮小到原來的五分之一確認能否收斂。如果縮小增量步后收斂正常核心問題是增量步過大或硬化參數設置不當。如果依然發散需要檢查積分點層面的應力更新是否存在異常。4.2 塑性參數標定不當引發的收斂問題硬化模量 H 的取值在 pyfem 彈塑性計算里比想象中敏感。H 太小材料近似理想塑性應力-應變曲線在屈服后近乎水平剛度矩陣趨近奇異牛頓迭代很容易因為矩陣條件數過大而失敗。H 太大屈服后材料仍急劇硬化塑性區擴展速度異常可能會導致誤判為彈性響應。理想塑性是數學上的極限情況在有限元實現中永遠需要引入一點點硬化來保證剛度矩陣非奇異。常見的處理方式是用一個很小的正數作為下限比如給 H 一個遠小于 E 的正值。如果問題的硬化模量確實趨近于零就需要改用位移控制加載代替力控制加載這樣在近理想塑性階段仍然能繼續推進計算。4.3 可能導致應力超屈服面的載荷步設置隱式分析的徑向返回方法對載荷增量有內在的容錯性但過大的載荷增量依然可能帶來兩個后果一是牛頓迭代整體發散二是應力更新后塑性應變增量為負值違背熱力學約束。前者收斂日志里很直觀后者比較隱蔽體現在等效塑性應變曲線出現下降段。錯誤現象可能原因檢查與修正應力-應變曲線屈服點震蕩增量步太大徑向返回修正過度減小最大增量步細化屈服點附近載荷等效塑性應變出現負增量卸載誤判為加載或硬化模量過小檢查加載歷史確保增量單調性全局迭代次數隨載荷增長反而增多硬化和實際物理曲線不符重新標定 H 與應力應變曲線局部積分點應力長期拉不回屈服面切線模量與應力更新不一致檢查 get_tangent 與 return_map 的一致性注意用位移控制加載時載荷增量直接體現為施加的位移增量。拐點出現在屈服開始的位移附近需要在該區域加密增量步這是 pyfem 彈塑性分析中最常用的收斂加速手段。5. 薄壁圓筒算例與驗證從 pyfem 到其他有限元環境的遷移5.1 薄壁圓筒的彈塑性解與 pyfem 計算結果對照薄壁圓筒受內壓是經典的彈塑性驗證算例因為它存在由平衡方程得到的解析解。令圓筒平均半徑為 r壁厚為 t受內壓 p 作用環向應力 σ_theta 近似等于 p·r/t。當這個值超過初始屈服應力時塑性區從內壁開始向外擴展。pyfem 計算結果的關鍵驗證點有兩個彈性段環向應變是否符合解析解屈服開始時的內壓值是否與理論預測一致。實現層面薄壁圓筒可以取一個小的扇形段建立平面應變模型徑向和環向分別劃分 2-3 個單元。太粗的網格會在壁厚方向捕捉不到塑性區梯度太細的網格對薄壁近似本身的意義不大。pyfem 跑完薄壁圓筒算例后把環向應變的計算值與解析解放在同一張圖上對比。5.2 用 MATLAB 做一個獨立的交叉驗證pyfem 的結果需要用不相關的本構實現做交叉驗證這正是涉及 MATLAB 有限元編程求解實例時常用的做法。不用 MATLAB 重新實現完整的有限元框架只需要在材料點上做單軸應力的彈塑性本構積分再把 pyfem 給的應變歷史作為輸入對比輸出的應力響應。% 以 pyfem 輸出的應變歷史為輸入復算單軸應力 E 210e3; H 2.1e3; sy 240; % 與 pyfem 輸入一致 strain_his dlmread(strain_history.txt); stress_out zeros(size(strain_his)); ep 0; stress 0; for i 1:length(strain_his) stress_trial stress E * (strain_his(i) - stress/E); if stress_trial sy H*ep dep (stress_trial - sy) / (E H); stress stress_trial - E * dep; ep ep dep; else stress stress_trial; end end這個腳本沒有涉及任何網格劃分代碼里的 E、H、sy 三個參數要與 pyfem 的輸入嚴格一致。如果兩條應力-應變曲線在塑性階段出現差異最常見的源頭是硬化模量的定義方式不同pyfem 里如果輸入的是真實應力-對數應變曲線MATLAB 腳本里就要用對應的切線斜率直接拿工程應力應變曲線的斜率來代會導致系統性偏差。5.3 在商業有限元仿真軟件里復現同一算例有限元仿真軟件之間的彈塑性結果對拍是校驗本構實現最可靠的手段之一。pyfem 的結果如果和成熟商業化軟件算出來的結果一致基本可以確認本構積分實現正確。商業軟件里建模薄壁圓筒時推薦直接使用軸對稱單元或平面應變單元以免三維實體單元的鎖死效應干擾對比。統一定義材料參數和加載曲線后通常關注三個量的一致性屈服點對應的載荷、塑性區的擴展軌跡目視對比塑性應變云圖、最大應力點的最終值。三個來源的結果如果差異在 1% 以內說明 pyfem 的材料子程序標定無誤。如果差異主要出現在大變形階段下一步需要核對硬化準則的類型。pyfem 里實現的隨動硬化與各向同性硬化在大變形加載下結果會有明顯差異這種差異不是 bug而是本構選擇不同。需要根據物理實驗選擇合適的硬化準則并將其顯式記錄在輸入文件中。最后有個可以立刻上手的技巧給自己保存好的彈塑性材料寫一個標準參數卡片把彈性模量、泊松比、屈服應力、硬化模量、硬化準則類型、增量步數這些信息固化成模板文件。每次新建項目只需要改參數值不用重新組織輸入結構能省掉大量的低級錯誤排查時間。本文還有配套的精品資源點擊獲取