【发布时间】:2020-10-11 00:22:20
【问题描述】:
我有一个关于使用 RK4 求解二阶微分方程的问题,考虑到一阶导数的附加约束。我正在做here 所示的示例,并进行了一些修改
θ′′(t) + b θ′(t) + c sin(θ(t)) = 0
附加约束是:
当θi θ(i+1)θ′(i+1)=0.9θ′i,
其中 i 是 t 的步数,i+1 是 i 之后的一步。在现实世界中,它说当位移方向反转时,它的速度会降低到 90%。
如果y(t) = (θ(t), ω em>(t)),则方程为 ẏ = f(t,y),其中 f(t,y) = (y₂(t), -by₂(t) - cos(y₁(t)))。
在这个问题中,如果我想在 ω 或 θ′(t) (它们是同一件事)上添加约束,我应该如何修改代码? 这是我的代码不起作用。附加条件使 θ' 不连续。以下“自制”解决方案无法正确更新 θ′。我是 Python 新手,这是我的第一篇 StackOverflow 帖子。非常感谢任何指导。
def rungekutta4(f, y0, t, args=()):
n = len(t)
y = np.zeros((n, len(y0)))
y[0] = y0
for i in range(n - 1):
h = t[i+1] - t[i]
if y[i][0]*y[i+1][0]<0:
k1 = f(y[i], t[i], *args)
k2 = f(y[i] + k1 * h / 2., t[i] + h / 2., *args)
k3 = f(y[i] + k2 * h / 2., t[i] + h / 2., *args)
k4 = f(y[i] + k3 * h, t[i] + h, *args)
y[i+1] = y[i] + (h / 6.) * (k1 + 2*k2 + 2*k3 + k4)*0.9
else:
k1 = f(y[i], t[i], *args)
k2 = f(y[i] + k1 * h / 2., t[i] + h / 2., *args)
k3 = f(y[i] + k2 * h / 2., t[i] + h / 2., *args)
k4 = f(y[i] + k3 * h, t[i] + h, *args)
y[i+1] = y[i] + (h / 6.) * (k1 + 2*k2 + 2*k3 + k4)
return y
【问题讨论】:
-
您最后的修改没有意义。在分支条件中,您使用即将计算的未来值
y[i+1]。分支之间有什么区别,是函数应该不同,还是参数元组? -
你的情况在这两种表述中都没有多大意义。第一个测试是角度为零,钟摆垂直。可以在物理上安排在该位置上获得额外的摩擦。但是,仅具有与位置相关的摩擦系数不是更好吗?在第二个公式中,您说在速度为零的那一刻,您希望将其减少 10%。但是 10% 的零仍然是零。
-
嗨 Lutz,感谢您的 cmets。这不是典型的钟摆问题。它用于位置 theta 可以是正值或负值的摇摆/冲击。每当它的位置在正负之间变化时,我想通过将速度降低 10% 来减少它的能量。
标签: python math physics differential-equations runge-kutta