在1-DOF质量弹簧系统中实现半隐式后向欧拉

时间:2010-10-09 18:50:11

标签: algorithm simulation interpolation

我有一个简单的(质量)弹簧系统,有两个与弹簧相连的点。一个点固定在天花板上,所以我想用数值方法计算第二个点的位置。所以,基本上我得到第二个点的位置和它的速度,并且想要知道这两个值在一次步骤之后如何更新。

以下力量对该点产生影响:

  • 引力,由-g * m
  • 给出
  • 弹簧力,由k * (l - L)给出,其中k为刚度,l为当前长度,L为初始长度
  • 阻尼力,由-d * v
  • 给出

总结一下,这导致了

  • F = -g * m + k * (l - L)
  • Fd = -d * v

申请示例显式欧拉,可以推导出以下内容:

  • newPos = oldPos + dt * oldVelocity
  • newVelocity = oldVelocity + dt * (F + Fd) / m,使用F = m * a

但是,我现在想要使用半隐式后向欧拉,但无法准确地找出从哪里派生雅可比人。

1 个答案:

答案 0 :(得分:14)

因此,首先考虑完全隐式方法,然后转向半隐式方法,这可能是最简单的。

隐含的欧拉会(让我们称之为eqn(1)):

newPos = oldPos + dt * newVelocity
newVelocity = oldVelocity + dt * (-g * m + k*(newPos - L) - d*newVelocity)/m

现在让我们只测量相对于L的位置,这样我们就可以摆脱-kL术语。重新安排我们最终

(newPos, newVelocity) - dt * (newVelocity, k/m newPos - d/m newVelocity) = (oldPos, oldVelocity - g*dt)

并将其置于矩阵形式

((1,-dt),(k/m, 1 - d/m)).(newPos, newVelocity) = (oldPos, oldVelocity -g*dt)

\left ( \begin{array}{cc} 1 & -\Delta t \ \frac{k}{m} & 1 - \frac{d}{m}\end{array} \right ) \left ( \begin{array}{c} x^\mathrm{new} \ v^\mathrm{new} \end{array} \right ) = \left ( \begin{array}{c} x^\mathrm{old} \ v^\mathrm{old} - g \Delta t\end{array} \right )

如果您了解矩阵中的所有内容以及RHS上的所有内容,您只需要求解向量(newPos,newVelocity)。您可以使用任何Ax = b求解器执行此操作(在这种简单情况下,手动高斯消除)。但是既然你提到了雅可比人,那么你可能希望通过Newton-Raphson迭代或类似方法来解决这个问题。

在这种情况下,你基本上是要解决等式的零点

((1,-dt),(k/m, 1-d/m)).(newPos, newVelocity) - (oldPos, oldVelocity -g*dt) = 0

也就是说,f(newPos,newVelocity)=(0,0)。您有一个先前的值用作起始猜测(oldPos,oldVelocity)。现在你只想迭代

(x,v) n + 1 =(x,v) n + f((x,v) n )/ f'((x,v) n

直到你得到足够好的答案。这里,

f(newPos,newVel) = ((1,-dt),(k/m, 1-d/m)).(newPos, newVelocity) - (oldPos, oldVelocity -g*dt)

和f'(newPos,newVel)是对应矩阵的雅可比行列式

((1,-dt),(k/m, 1-d/m))

通过半隐式的过程是相同的,但更容易一点 - 并非eqns(1)中的所有RHS术语都是新的数量。它通常采用的方式是

newPos = oldPos + dt * newVelocity
newVelocity = oldVelocity + dt * (-g * m + k*oldPos - d*newVelocity)/m

例如,速度取决于位置的旧时间值,以及速度的新时间值上的位置。 (这与“越级”整合非常相似。)你应该能够通过这个稍微不同的方程组很容易地完成上述步骤。基本上,上面矩阵中的k / m项就会消失。