KOD PONIŻEJ (midPoint) TO TEN SAM KOD CO W NECIE TYLKO TROCHĘ INACZEJ UŁOŻONY, ŻEBY BYŁ CZYTELNIEJSZY – NIE KOPIUJCIE JAK MACIE JUŻ Z NETA
// p - punkt, dt - czas od ostatnich obliczen ruchu [reguluje szybkosc symulacji]
void solveMidPoint(Punkt *p, float dt)
{
// KOMENTARZ
// wzory po przeksztalceniu na choc troche prostsza matematyke sa w 'LAB03 metody.pdf'
// glownie trzeba sie wzorowac na kodzie z 'solveEuler'
// i dorobic jego rozwiniecie w midPoint
// i jeszcze dluzsze rozwiniecie w RK4
// KOMENTARZ END
// y = pozycja w przestrzeni [zwana w kodzie 'r']
// t = predkosc i kierunek ruchu [zwana w kodzie 'v']
// troche zmiennych do trzymania wynikow obliczen
Wektor k1[2],k2[2];
Wektor y_k[2];
Wektor y_h[2];
Wektor yout[2];
// obliczanie k1 czyli: f(y , t)
y_h[0] = p->r; // ustawiam 'y'
y_h[1] = p->v; // ustawiam 't'
derivatives(y_h, yout, p); // magicznie sie liczy
k1[0] = yout[0]; // zapisuje wynik 'y' do kolejnych obliczen
k1[1] = yout[1]; // zapisuje wynik 't' do kolejnych obliczen
// obliczanie k2 czyli: f(y+(h/2)*k1 , t + h/2)
y_k[0] = y_h[0] + dt * 0.5 * k1[0]; // ustawiam 'y' uwzgledniajac wynik obliczen k1
y_k[1] = y_h[1] + dt * 0.5 * k1[1]; // ustawiam 't' uwzgledniajac wynik obliczen k1
derivatives(y_k, yout, p); // magicznie sie liczy
k2[0] = yout[0]; // zapisuje wynik 'y' do kolejnych obliczen
k2[1] = yout[1]; // zapisuje wynik 't' do kolejnych obliczen
// obliczam nowa pozycje i predkosc 'punktu'
// ze wzoru: y[n+1] = y[n] + k2 * h + O(h^3)
// to ostatnie '+ O(h^3)' znacz tyle,
// ze blad obliczen moze wyniesc maksymalnie 'h do 3' - dosc malo
// ale tego nie ma jak uwzglednic w obliczeniach
p->r = p->r + k2[0] * dt;
p->v = p->v + k2[1] * dt;
}
Kod RK4 jaki znalazłem w necie ma dość dużo błędów i naprawienie ich zajęło mi dużo czasu [o ile w ogóle poprawiłem je dobrze…], więc tym podzielę się dopiero jak oddam sam [możecie sami kombinować o co w tym chodzi lub oddać za tydzień za 50% pkt.].