我试图模拟一个有一点不同的振荡系统:我想让它使用一个特定的运动方程( O.D.E.)当物体向上运动时,另一个运动方程是当物体向下运动时。为了求解这些方程,我使用了Scypi中的ODEINT。
例如,让我们考虑经典的质量弹簧系统。我试图诱导系统在身体向上运动时使用外部激励的运动方程,在物体向下运动时使用简单的运动方程。
def function (x,t):
F0 = 10.00
w = 1.00
m = 2.00
c = 1.00
k = 20.00
s = x[0]
dsdt = x[1]
if x[1] >= 0:
d2sdt2 = (F0*np.sin(w*t)-c*dsdt-k*s)/m
else:
d2sdt2 = (-c*dsdt-k*s)/m
result = [dsdt,d2sdt2]
return result
initial = [3.00,0.00]
t = np.linspace(0.00,10.00,101)
y = odeint(function, initial, t)结果表明,只有第二个运动方程作用于物体(Results Obtained)。我预计当身体向上移动时,由于外力的作用,会出现更混乱的运动模式。
有没有更好的方法实现这一点?
发布于 2020-04-15 14:05:06
只需添加一些参数来增加内部步骤的密度和输出的密度
t = np.linspace(0.00,10.00,301)
y = odeint(function, initial, t, hmax=0.1, atol = 1e-8, rtol=1e-10)并且不使用虚线给出了该图

下半场的纠结清晰可见。
因此,您的代码是正确的,但您需要考虑到,ODE求解器是为平滑的右侧构建的,从数学方法开始,直到并特别是针对最佳步长的预测器。因为在这里右侧有局部不可预测的非平滑变化,所以必须告诉求解器不要使用非常大的步长,因为这可能会跳过模型阶段的变化并返回。
另外,对于平滑绘图,整个水平轴上100个点的输出密度通常太小。根据绘图的最终“打印”大小,使用200到600点。
https://stackoverflow.com/questions/61220296
复制相似问题