Mam takie równanie:
x(0) = 0;
dx/dt = x(t) + t;
rozwiązanie jawne to: x(t)=e^t-t-1;
Próbuję zaimplementować algorytm Runge-Kutty, niby coś działa, ale jak sprawdzam z wolframalpha to coś jest chyba nie tak. Nie mogę namierzyć błędu.
Mój obecny kod:
public class Main {
double function(double t, double x) {
return x+t;
}
public static void main(String args[]) {
//warunek poczatkowy x=0
double x = 0;
//krok
int step = 0.25;
for(double t = 0; t < 3.0 ; t+=step) {
//obliczenie kroku runge-kutta
for(int i = 0; i < d; i++) {
//pomijam warunek poczatkowy
if(t==0) continue;
double k1 = function(t, x)*step;
double k2 = function(t+0.5*dt, x + 0.5*k1)*step;
double k3 = function(t+0.5*dt, x + 0.5*k2)*step;
double k4 = function(t+dt, x+k3)*step;
x = x + (k1+2*k2+2*k3+k4)/6;
}
//obliczenie wyniku wg wzoru wyjsciowego dla sprawdzenia
double wynik = Math.pow(Math.E,t) - t -1;
System.out.println("t: "+t+" = "+String.format("%5f", (x)) + " dobry: " + String.format("%5f", wynik));
}
}
}