繁体   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