簡體   English   中英

用驅動力的 ODEINT 求解二階微分方程的問題

[英]Problem for solving a second order differential equation with ODEINT with a driven force

我需要你的幫助,因為我想為塔的運動編寫正弦激勵代碼。 問題是當我 plot 結果時,有一個看起來異常的正弦噪聲,我不知道它從哪里來......我確實期待更平滑的曲線,因為它通常是驅動的情況阻尼諧振子。 下面是運動方程式:

ddx1 + (f1/m1)*dx1 + (k1/m1)*x1 = omega^2*Em*sin(omega*t)

初始條件:x0 = 0 m 和 v0=dx0=0 m/s

這是我的代碼:

from math import *
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

#params
m1=264000000. # kg
f1 = 5000000. # kg/s
k1=225000000. # N/m
#initial displacement of the tower:
x0 = 0. # m
dx0 = 0. # m/s
N=1000000
duration=200
time = np.linspace(0, duration, N)

# Creating the excitation
#sinusoidal excitation
def entry(Em,f,t):
    omega = 2*np.pi*f
    return -omega**2*Em*np.sin(omega*t)

# Equation: ddx1 + (f1/m1)*dx1 + (k1/m1)*x1 = omega^2*Em*sin(omega*t)
# Solving
def dX(X,t):
    #X = [x1, dx1]
    A=np.array([[   0  ,    1  ],
                [-k1/m1, -f1/m1]])
    B=np.array([0, -entry(1,50,t)])
    dX=np.dot(A,X)+B
    return dX

result = odeint(dX,[x0,dx0],time)
plt.plot(time, result[:, 0])
plt.show()

這里有一些照片:第一張照片和放大時的照片

你能告訴我我的代碼有什么問題嗎?

預先感謝您的幫助!

[編輯] 我已經嘗試了較小頻率的代碼,它更符合我的預期。 我沒有想到的是,正如 JustLearning 指出的那樣,固有頻率和驅動頻率之間的差異非常重要,因此出現這些微振盪實際上是正常的。 關於參數的值,確實很重要,因為是台北塔的參數。 但由於每次都有所有這些數量的比率,我認為(但我可能是錯的)python 不會費心去計算。 我對此很陌生,所以感謝您如此迅速地回答並幫助我。

僅僅根據您的繪圖來評估您的 ODE 有什么問題可能並不明智。 為了檢查您的代碼在運行時是否有意義,您可能應該 go 進行收斂測試:選擇一個已知的解析解並檢查|numerical - analytic|的 L2 范數是否正確。 隨着時間步變小,它會按預期減少。

也就是說,僅通過查看繪圖中振盪之上的振盪,您看到的只不過是非強制阻尼振盪和強制項之間的疊加。 這個疊加頻率之所以如此微觀,是因為它大約是五十度! 比振盪器的自然+阻尼頻率大幾倍。 如果您將entry中的50更改為更小的值,比如 1,您會發現自然+阻尼振盪和強迫將以大致相似的頻率疊加。 嘗試使用 0.1 以獲得更具可比性的所有正在播放的振盪的疊加。

順便說一句,考慮到你非常瘋狂的大參數,你真的可能想要做一個收斂測試,如果不成功,嘗試一些可以處理剛性 ODE 的 ODE 求解器——這是 odeint 默認求解器大部分時間無法處理的!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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