[英]How to solve a differential equation with a non-constant coefficient using Python ?
假設有一個關於彈力繩長度的方程(用 x 表示),它取決於 object 的質量,例如播放器(用 m 表示)。
假設彈力繩的自然長度為30米,即起始position為x(0)=-30。
彈力繩的長度方程由下式給出:
x''(m) = g + b/m*x(m) -a1/m*x'(m) - a2*|x'(m)|*x'(m)
其中g, a1, a2
是常數; b
是一個步驟 function:當x<0
時b = -k
(另一個常數),當x>=0
0 時b = 0
0 。
import numpy as np
from scipy.integrate import odeint
g = 9.8
a1, a2 = 0.6, 0.8
k = 20
b = [-k, 0]
def dx_dt(x, m):
if x[0]>=0:
return [x[1], g+b[0]/m*x[0]-a1/m*x[1]-a2/m*np.abs(x[1])*x[1]]
else:
return [x[1], g+b[1]/m*x[0]-a1/m*x[1]-a2/m*np.abs(x[1])*x[1]]
init = [[-30, 0], [-40, 0.0001]]
m = np.linspace(1, 100, 10000)
fig, ax = plt.subplots(1, 2, sharey=True, figsize=(6, 4))
for i in range(len(init)):
xs = odeint(dx_dt, init[i], m)
ax[i].plot(m, xs[:, 0], 'r-')
ax[i].set_xlabel('mass (m)')
ax[i].set_ylabel('length (x)')
ax[i].set_xlim(xmin, xmax)
ax[i].set_ylim(ymin, ymax)
ax[i].set_title('init={}'.format(init[i]))
正確答案應該是正弦曲線
但是上面代碼的結果是
代碼有問題嗎?
將長度坐標x
更改為向上,沒有跳線的電線在 position 0 處的 rest 處,因此對於x<0
,電線的行為類似於 Z2A2D595E6ED9A0B24F027F2B63B134D6。 然后重力也指向下方。 修改后的 ODE function 是
def dx_dt(x, t, m):
acc = -g-a1/m*x[1]-a2/m*np.abs(x[1])*x[1]
if x[0] < 0: acc -= k/m*x[0]
return [x[1], acc]
繪制 3 個不同的質量
for i,ini in enumerate(init):
for m in masses:
xs = odeint(dx_dt, ini, t, args=(m,))
ax[i].plot(t, xs[:, 0], label="m=%.2f"%m)
然后給出圖片
例如,如果第一種情況下的地面高度為-80m
,總高度為110m
,則跳線的質量必須小於 90kg。 對於更精確的陳述,使用內插和外推或數值求解器來找到x'(t)=0
的第一次時間和當時x(t)=ground
的臨界質量。
顯然,在任何情況下,跳線都不會重新進入“自由落體”階段x>0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.