簡體   English   中英

如何使用 Python 求解具有非常數系數的微分方程?

[英]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<0b = -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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM