Поэтому, вероятно, проще всего увидеть, как это происходит, если сначала рассмотреть полностью неявный метод, а затем перейти к полунеявному.
Неявный Эйлер имел бы (назовем это уравнением (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)
Где вы знаете все в матрице, и все в RHS, и вам просто нужно решить для вектора (newPos, newVelocity). Вы можете сделать это с помощью любого решателя Ax=b (исключение Гаусса вручную работает в этом простом случае). Но поскольку вы упоминаете якобианцев, вы, вероятно, хотите решить эту проблему с помощью итерации Ньютона-Рафсона или чего-то подобного.
В этом случае вы, по сути, хотите решить нули уравнения
((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'( (х,в)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))
Прохождение процесса для полунеявного является таким же, но немного проще - не все члены RHS в уравнениях (1) являются новыми величинами. Как это обычно делается, это
newPos = oldPos + dt * newVelocity
newVelocity = oldVelocity + dt * (-g * m + k*oldPos - d*newVelocity)/m
например, скорость зависит от старого временного значения положения, а положение — от нового временного значения скорости. (Это очень похоже на интеграцию «чехарда»..) Вы должны быть в состоянии довольно легко выполнить описанные выше шаги с этим немного другим набором уравнений. По сути, член k/m в приведенной выше матрице исчезает.
person
Jonathan Dursi
schedule
09.10.2010