本人初學者,零基礎入門(大二數學基礎),因此本教程還算比較舒適,但是也免不了有錯誤,還請批評指正。
數值積分
數值積分,是用於求定積分的近似值的一種方法。在數學分析中,有很多計算給定函數的定積分是不可行的,而數值積分是利用黎曼積分等數學定義,用數值逼近的方法近似計算給定的定積分值。藉助計算機和編程,數值積分可以快速而有效地計算複雜的積分。
歐拉方法
歐拉方法是一種數值積分方法,又稱爲歐拉折線法,是用折線來逼近曲線的一種方法。
例如dxdy=f(x,y),可以轉化爲yn+1−yn=f(xn,yn)h,其中h則爲折線的步長。
由泰勒公式y(x+h)=y(x)+y′(x)h+o(h),可以看出歐拉公式實際上是泰勒公式的離散形式。很顯然,h越小,歐拉方法的結果越精確,h越大,結果越不精確。
但是h較大時,除了不精確之外,還會導致使用歐拉方法得到的值不收斂,即不穩定。
歐拉方法分爲顯式積分和隱式積分兩種形式,其中顯式積分條件穩定,隱式積分無條件穩定:
彈簧質點系統
在清楚了數值積分的解決方法之後,我們使用它來解決一個最簡單的物理模擬問題——彈簧質點系統。
彈簧質點系統中主要有彈力和阻力。
總結彈力和阻力的計算公式如下:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧f(xa)s=−ks∣∣xa−xb∣∣xa−xb(∣∣xa−xb∣∣−l)f(xa)d=−kd∣∣xa−xb∣∣xa−xb(xa′−xb′)⋅∣∣xa−xb∣∣xa−xb
顯式方法
⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧ft=∑b=0nf(xa)s+∑b=0nf(xa)dvt+dt=vt+dt∗mftxt+dt=xt+dt∗vt
顯式方法直接實現即可。
隱式方法
⎩⎪⎪⎨⎪⎪⎧vt+dt=vt+dt∗mft+dtxt+dt=xt+dt∗vt+dt
隱式方法需要進行特殊的推導。
由泰勒公式的一階展開,可以得到f的近似:
ft+dt=ft+∂x∂f△x+∂v∂f△v
代入上式,可以求得△v的表示形式爲:
△v=vt+dt−vt=dt∗mft+dt
△v=mdt∗(ft+∂x∂f△x+∂v∂f△v)
將△x也表示爲△v的式子:
△x=xt+dt−xt=dt∗vt+dt=dt∗(vt+△v)
代入上式,消去△x:
△v=mdt∗(ft+dt∗∂x∂f(vt+△v)+∂v∂f△v)
展開括號:
△v=mdt∗ft+mdt2∂x∂fvt+mdt2∂x∂f△v+mdt∂v∂f△v
移項:
△v−mdt2∂x∂f△v−mdt∂v∂f△v=mdt∗ft+mdt2∂x∂fvt
整理:
(1−mdt2∂x∂f−mdt∂v∂f)△v=mdt(ft+dt∗∂x∂fvt)
別忘了我們操作的是一個矩陣:
(I−Mdt2∂x∂f−Mdt∂v∂f)△v=Mdt(ft+dt∗∂x∂fvt)
兩邊乘以M:
(M−dt2∂x∂f−dt∂v∂f)△v=dt(ft+dt∗∂x∂fvt)
解隱式積分需要求解上述的線性方程組,並解出△v。
其中∂x∂f和∂v∂f的計算方法在參考文獻中寫的很清楚,這裏直接給出結果:
雅克比迭代
在隱式方法中,最終需要求解的線性方程組往往是一個巨大的稀疏矩陣,因此很難通過矩陣求逆的方式求解,這裏介紹最簡單的迭代求解線性方程組的方法——雅克比迭代。
實例代碼
彈簧質點系統的顯式方法
彈簧質點系統的隱式方法
代碼由python語言以及taichi框架編寫而成。
單擊鼠標添加質點,相鄰質點自動添加彈簧,其中紅色彈簧表示伸長中,綠色彈簧表示收縮中。
公式和求導部分參考
隱式方法推導部分參考
雅克比迭代部分參考