常微分方程數值解法 python實現

2021-09-05 13:12:27 字數 4298 閱讀 6921

研究生課程《應用數值分析》結課了,使用python簡單記錄了下常微分方程數值解法。

y_=y_i+h_i f(x_i,y_i) \\ y_0=y(a) \end \right .

y'=x-y+1 & 0\leq x \leq 1 \\ y(0)=1 \end \right .

, yi:'

.format

(xi,yi)

) xi, yi = xi+h, y

return res

res = euler_forward(f,a=

0,b=

1,ya=

1,h=

0.1,verbose=

true

)

xi:0.00, yi:1.000000

xi:0.10, yi:1.000000

xi:0.20, yi:1.010000

xi:0.30, yi:1.029000

xi:0.40, yi:1.056100

xi:0.50, yi:1.090490

xi:0.60, yi:1.131441

xi:0.70, yi:1.178297

xi:0.80, yi:1.230467

xi:0.90, yi:1.287420

xi:1.00, yi:1.348678

y_=y_i+\frac(k_1+2k_2+k_3) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frach,y_i+\frack_1) & \\ k_3 = hf(x_i+h,y_i-k_1+2k_2) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end \right .

⎩⎪⎪⎪⎪⎨

⎪⎪⎪⎪

⎧​yi

+1​=

yi​+

61​(

k1​+

2k2​

+k3​

)k1​

=hf(

xi​,

yi​)

k2​=

hf(x

i​+2

1​h,

yi​+

21​k

1​)k

3​=h

f(xi

​+h,

yi​−

k1​+

2k2​

)y0​

=y(a

),i=

0,1,

⋯,n−

1​​ y_=y_i+\frac(k_1+2k_2+2k_3+k_4) & \\ k_1 = hf(x_i,y_i) & \\ k_2 = hf(x_i+\frach,y_i+\frack_1) & \\ k_3 = hf(x_i+\frach,y_i+\frack_2) & \\ k_4 = hf(x_i+h,y_i+k_3) & \\ y_0=y(a),i=0,1,\cdots,n-1 \\ \end \right .

⎩⎪⎪⎪⎪⎪

⎪⎨⎪⎪

⎪⎪⎪⎪

⎧​yi

+1​=

yi​+

61​(

k1​+

2k2​

+2k3

​+k4

​)k1

​=hf

(xi​

,yi​

)k2​

=hf(

xi​+

21​h

,yi​

+21​

k1​)

k3​=

hf(x

i​+2

1​h,

yi​+

21​k

2​)k

4​=h

f(xi

​+h,

yi​+

k3​)

y0​=

y(a)

,i=0

,1,⋯

,n−1

​​

def

runge_kutta

(f,a=

0,b=

1,ya=

1,h=

0.1,verbose=

true):

'''四階龍格庫塔法

args

----------

f: callable function

需要求解的函式

a: float

求解區間起始值

b:float

求解區間終止值

ya:float

起始條件,ya=y(a)

h:float

求解步長(區間[a,b]n等分)

verbose:logical,default is true

顯示迭代結果

returns

----------

res:list like

返回向前尤拉發求解的結果

'''res =

xi = a

yi = ya

while xi <= b:

# 在求解區間範圍

k1 = h * f(xi, yi)

k2 = h * f(xi + h/

2, yi + k1/2)

k3 = h * f(xi + h/

2, yi + k2/2)

k4 = h * f(xi + h, yi + k3)

y = yi +1/

6*(k1 +

2*k2 +

2*k3 + k4)

if verbose:

print

('xi:, yi:'

.format

(xi,yi)

) xi, yi = xi+h, y

return res

res = runge_kutta(f,a=

0,b=

1,ya=

1,h=

0.1,verbose=

true

)

xi:0.00, yi:1.0000000000

xi:0.10, yi:1.0048375000

xi:0.20, yi:1.0187309014

xi:0.30, yi:1.0408184220

xi:0.40, yi:1.0703202889

xi:0.50, yi:1.1065309344

xi:0.60, yi:1.1488119344

xi:0.70, yi:1.1965856187

xi:0.80, yi:1.2493292897

xi:0.90, yi:1.3065699912

xi:1.00, yi:1.3678797744

y_p=y_i+hf(x_i,y_i) & \\ y_ = y_i+\frac[f(x_i,y_i)+f(x_i,y_p)] &i=0,1,\cdots ,n-1 \\ y_0=y(a) \\ \end \right .

⎩⎨⎧​yp

​=yi

​+hf

(xi​

,yi​

)yi+

1​=y

i​+2

h​[f

(xi​

,yi​

)+f(

xi​,

yp​)

]y0​

=y(a

)​i=

0,1,

⋯,n−

1​求解初值問題

y'=-y &(0 \leq x \leq 1) \\ y(0)=1 \\ \end \right .

, yi:'

.format

(xi,yi)

) xi, yi = xi+h, y

return res

res = improved_euler(f,a=

0,b=

1,ya=

1,h=

0.1,verbose=

true

)

xi:0.00, yi:1.000000

xi:0.10, yi:0.905000

xi:0.20, yi:0.819025

xi:0.30, yi:0.741218

xi:0.40, yi:0.670802

xi:0.50, yi:0.607076

xi:0.60, yi:0.549404

xi:0.70, yi:0.497210

xi:0.80, yi:0.449975

xi:0.90, yi:0.407228

xi:1.00, yi:0.368541

常微分方程的數值解法系列一 常微分方程

在慣性導航以及vio等實際問題中利用imu求解位姿需要對imu測量值進行積分得到需要的位置和姿態,其中主要就是求解微分方程。但之前求解微分方程的解析方法主要是應用於一些簡單和特殊的微分方程求解中,對於一般形式的微分方程,一般很難用解析方法求出精確解,只能用數值方法求解。該系列主要介紹一些常用的常微分...

常微分方程

微分方程這裡,感覺難度明顯上來了。核心思路,消去微分 分離變數法,想方設法分離變數 齊次微分方程 對於無法直接分離變數的方程,如果是y和x的次數一樣,並且不含常數項。可以可以化為齊次,變數代換求解 一階線性微分方程 常數變易法。常數變易法我覺得關鍵是變和易,因為先當作乙個常數0,是比較容易解決的。然...

常微分方程數值解上機

二步顯式 adams 法和gear 法求解,y 0 1,步長分別為h 0.1和h 0.05 1.程式文字 二步顯式 adams法 clc y 1 1 h 0.1 y 2 y 1 2 h y 1 3 h n 1 h fori 2 n y i 1 y i 3 h y i h y i 1 3 h endt...