[英]Solve non-linear non homogeneous differential equation with python (Duffing oscillator)
我嘗試使用odeint
求解 Duffing 方程:
def func(z, t):
q, p = z
return [p, F*np.cos(OMEGA * t) + Fm*np.cos(3*OMEGA * t) + 2*gamma*omega*p - omega**2 * q - beta * q**3]
OMEGA = 1.4
T = 1 / OMEGA
F = 0.2
gamma = 0.1
omega = -1.0
beta = 0.0
Fm = 0
z0 = [1, 0]
psi = 1 / ((omega**2 - OMEGA**2)**2 + 4*gamma**2*OMEGA**2)
wf = np.sqrt(omega**2 - gamma**2)
t = np.linspace(0, 100, 1000)
sol1 = odeintw(func, z0, t, atol=1e-13, rtol=1e-13, mxstep=1000)
當F = gamma = beta = 0
時,我們有一個由兩個線性齊次方程組成的系統。 這很簡單!
但是當F not equal 0
時,系統變得非齊次。 問題是數值解與解析解不一致:
圖1
數值解沒有考慮方程的非齊次解。
我無法弄清楚是否可以在這里使用solve_bvp
function。 你可以幫幫我嗎?
插入常數,方程變為
x'' + 2*c*x' + x = F*cos(W*t)
一般解形式為
x(t)=A*cos(W*t)+B*sin(W*t)+exp(-c*t)*(C*cos(w*t)+D*sin(w*t))
w^2=1-c^2
對於特定的解決方案
-W^2*(A*cos(W*t)+B*sin(W*t))
+2*c*W*(B*cos(W*t)-A*sin(W*t))
+ (A*cos(W*t)+B*sin(W*t))
=F*cos(W*t)
(1-W^2)*A + 2*c*W*B = F
-2*c*W*A + (1-W^2)*B = 0
對於初始條件,需要
A+C = 1
W*B-c*C+w*D=0
在 python 代碼中
F=0.2; c=0.1; W=1.4
w=(1-c*c)**0.5
A,B = np.linalg.solve([[1-W*W, 2*c*W],[-2*c*W,1-W*W]], [F,0])
C = 1-A; D = (c*C-W*B)/w
print(f"w={w}, A={A}, B={B}, C={C}, D={D}")
與 output
w=0.99498743710662, A=-0.192, B=0.056, C=1.192, D=0.04100554286257586
繼續
t = np.linspace(0, 100, 1000)
u=odeint(lambda u,t:[u[1], F*np.cos(W*t)-2*c*u[1]-u[0]], [1,0],t, atol=1e-13, rtol=1e-13)
plt.plot(t,u[:,0],label="odeint", lw=3);
plt.plot(t,A*np.cos(W*t)+B*np.sin(W*t)+np.exp(-c*t)*(C*np.cos(w*t)+D*np.sin(w*t)), label="exact");
plt.legend(); plt.grid(); plt.show();
導致精確擬合
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.