Więc to chyba najłatwiej zobaczyć, jak to idzie z najpierw należy rozważyć metodę całkowicie niejawną, a następnie przejść do niejako pośrednio.
niejawny Euler musiałaby (nazwijmy te eqn (1)):
newPos = oldPos + dt * newVelocity
newVelocity = oldVelocity + dt * (-g * m + k*(newPos - L) - d*newVelocity)/m
Na razie niech po prostu zmierzyć pozycje w stosunku do L, dzięki czemu możemy pozbyć się tego -KL perspektywie. Przekształcając możemy skończyć z
(newPos, newVelocity) - dt * (newVelocity, k/m newPos - d/m newVelocity) = (oldPos, oldVelocity - g*dt)
i oddanie, które w postaci macierzowej
((1,-dt),(k/m, 1 - d/m)).(newPos, newVelocity) = (oldPos, oldVelocity -g*dt)
Jeżeli wiesz wszystko na matrycy, a wszystko na RHS, i po prostu trzeba rozwiązać dla wektora (newPos, newVelocity). Możesz to zrobić przy pomocy dowolnego rozwiązania Ax = b (eliminacja gaussowska ręcznie działa w tym prostym przypadku). Ale ponieważ wspomniałeś o Jacobianach, prawdopodobnie chcesz rozwiązać ten problem, używając iteracji Newtona-Raphsona lub czegoś podobnego.
W takim przypadku, jesteś w istocie chce rozwiązać zera równania
((1,-dt),(k/m, 1-d/m)).(newPos, newVelocity) - (oldPos, oldVelocity -g*dt) = 0
co znaczy, F (newPos, newVelocity) = (0,0).Masz poprzednią wartość do użycia jako początkowe odgadnięcie, (oldPos, oldVelocity). Teraz po prostu chcesz iteracyjne na
(x, v) n + 1 = (x, v) n + f ((x, v) n)/f '((x, v) n)
, dopóki nie uzyskasz wystarczająco dobrej odpowiedzi. Tutaj
f(newPos,newVel) = ((1,-dt),(k/m, 1-d/m)).(newPos, newVelocity) - (oldPos, oldVelocity -g*dt)
oraz f "(newPos, newVel) jest jakobian odpowiada matrycy
((1,-dt),(k/m, 1-d/m))
przechodzi proces dla pół-niejawny jest taka sama, ale trochę łatwiej - nie wszyscy terminy RHS w eqns (1) to nowe ilości. Jak to się zwykle robi to
newPos = oldPos + dt * newVelocity
newVelocity = oldVelocity + dt * (-g * m + k*oldPos - d*newVelocity)/m
np prędkość zależy od starej wartości czasowej pozycji i pozycji na nowej wartości czasowej prędkości. (Jest to bardzo podobne do integracji "leapfrog"). Powinieneś być w stanie wykonać powyższe kroki całkiem łatwo dzięki temu nieco odmiennemu zestawowi równań. Zasadniczo, k/m termin w macierzy powyżej spada.
usunięto tag sprężyny, ponieważ jest on powiązany z ramą Java Spring –