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