顯式積分,隱式積分和彈簧質點系統(詳細公式推導和太極源碼)

本人初學者,零基礎入門(大二數學基礎),因此本教程還算比較舒適,但是也免不了有錯誤,還請批評指正。


數值積分

數值積分,是用於求定積分的近似值的一種方法。在數學分析中,有很多計算給定函數的定積分是不可行的,而數值積分是利用黎曼積分等數學定義,用數值逼近的方法近似計算給定的定積分值。藉助計算機和編程,數值積分可以快速而有效地計算複雜的積分。


歐拉方法

歐拉方法是一種數值積分方法,又稱爲歐拉折線法,是用折線來逼近曲線的一種方法。

例如dydx=f(x,y)\frac{dy}{dx}=f(x,y),可以轉化爲yn+1yn=f(xn,yn)hy_{n+1}-y_n=f(x_n,y_n)h,其中h則爲折線的步長。

由泰勒公式y(x+h)=y(x)+y(x)h+o(h)y(x+h)=y(x)+y^{'}(x)h+o(h),可以看出歐拉公式實際上是泰勒公式的離散形式。很顯然,h越小,歐拉方法的結果越精確,h越大,結果越不精確。

但是h較大時,除了不精確之外,還會導致使用歐拉方法得到的值不收斂,即不穩定。

歐拉方法分爲顯式積分和隱式積分兩種形式,其中顯式積分條件穩定,隱式積分無條件穩定:
在這裏插入圖片描述


彈簧質點系統

在清楚了數值積分的解決方法之後,我們使用它來解決一個最簡單的物理模擬問題——彈簧質點系統。

彈簧質點系統中主要有彈力和阻力。
在這裏插入圖片描述
在這裏插入圖片描述
總結彈力和阻力的計算公式如下:

{f(xa)s=ksxaxbxaxb(xaxbl)f(xa)d=kdxaxbxaxb(xaxb)xaxbxaxb \left\{ \begin{array}{c} \LARGE f(x_a)_s=-k_s\frac{x_a-x_b}{||x_a-x_b||}(||x_a-x_b||-l) \\ \\ \LARGE f(x_a)_d=-k_d\frac{x_a-x_b}{||x_a-x_b||}(x_a^{'}-x_b^{'})·\frac{x_a-x_b}{||x_a-x_b||} \end{array} \right.

顯式方法

{ft=b=0nf(xa)s+b=0nf(xa)dvt+dt=vt+dtftmxt+dt=xt+dtvt \left\{ \begin{array}{c} \LARGE f_t=\sum_{b=0}^n f(x_a)_s+\sum_{b=0}^nf(x_a)_d \\ \\ \LARGE v_{t+dt}=v_t+dt*\frac{f_t}{m} \\ \\ \LARGE x_{t+dt}=x_t+dt*v_t \end{array} \right.

顯式方法直接實現即可。

隱式方法

{vt+dt=vt+dtft+dtmxt+dt=xt+dtvt+dt \left\{ \begin{array}{c} \LARGE v_{t+dt}=v_t+dt*\frac{f_{t+dt}}{m} \\ \\ \LARGE x_{t+dt}=x_t+dt*v_{t+dt} \end{array} \right.

隱式方法需要進行特殊的推導。

由泰勒公式的一階展開,可以得到f的近似:

ft+dt=ft+fxx+fvv\LARGE f_{t+dt}=f_t+\frac{∂f}{∂x}△x+\frac{∂f}{∂v}△v

代入上式,可以求得△v的表示形式爲:

v=vt+dtvt=dtft+dtm\LARGE △v=v_{t+dt}-v_t=dt*\frac{f_{t+dt}}{m}

v=dtm(ft+fxx+fvv)\LARGE △v=\frac{dt}{m}*(f_t+\frac{∂f}{∂x}△x+\frac{∂f}{∂v}△v)

將△x也表示爲△v的式子:

x=xt+dtxt=dtvt+dt=dt(vt+v)\LARGE △x=x_{t+dt}-x_t=dt*v_{t+dt}=dt*(v_t+△v)

代入上式,消去△x:

v=dtm(ft+dtfx(vt+v)+fvv)\LARGE △v=\frac{dt}{m}*(f_t+dt*\frac{∂f}{∂x}(v_t+△v)+\frac{∂f}{∂v}△v)

展開括號:

v=dtmft+dt2mfxvt+dt2mfxv+dtmfvv\LARGE △v=\frac{dt}{m}*f_t+\frac{dt^2}{m}\frac{∂f}{∂x}v_t+\frac{dt^2}{m}\frac{∂f}{∂x}△v+\frac{dt}{m}\frac{∂f}{∂v}△v

移項:

vdt2mfxvdtmfvv=dtmft+dt2mfxvt\LARGE △v-\frac{dt^2}{m}\frac{∂f}{∂x}△v-\frac{dt}{m}\frac{∂f}{∂v}△v=\frac{dt}{m}*f_t+\frac{dt^2}{m}\frac{∂f}{∂x}v_t

整理:

(1dt2mfxdtmfv)v=dtm(ft+dtfxvt)\LARGE (1-\frac{dt^2}{m}\frac{∂f}{∂x}-\frac{dt}{m}\frac{∂f}{∂v})△v=\frac{dt}{m}(f_t+dt*\frac{∂f}{∂x}v_t)

別忘了我們操作的是一個矩陣:

(Idt2MfxdtMfv)v=dtM(ft+dtfxvt)\LARGE (I-\frac{dt^2}{M}\frac{∂f}{∂x}-\frac{dt}{M}\frac{∂f}{∂v})△v=\frac{dt}{M}(f_t+dt*\frac{∂f}{∂x}v_t)

兩邊乘以M:

(Mdt2fxdtfv)v=dt(ft+dtfxvt)\LARGE (M-dt^2\frac{∂f}{∂x}-dt\frac{∂f}{∂v})△v=dt(f_t+dt*\frac{∂f}{∂x}v_t)

解隱式積分需要求解上述的線性方程組,並解出△v。

其中fx\frac{∂f}{∂x}fv\frac{∂f}{∂v}的計算方法在參考文獻中寫的很清楚,這裏直接給出結果:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


雅克比迭代

在隱式方法中,最終需要求解的線性方程組往往是一個巨大的稀疏矩陣,因此很難通過矩陣求逆的方式求解,這裏介紹最簡單的迭代求解線性方程組的方法——雅克比迭代。

在這裏插入圖片描述
在這裏插入圖片描述


實例代碼

彈簧質點系統的顯式方法

彈簧質點系統的隱式方法

代碼由python語言以及taichi框架編寫而成。

單擊鼠標添加質點,相鄰質點自動添加彈簧,其中紅色彈簧表示伸長中,綠色彈簧表示收縮中。
在這裏插入圖片描述


公式和求導部分參考
隱式方法推導部分參考
雅克比迭代部分參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章