Metoda Runge Kutta

0

Witam. Mam problem i nie wiem jak sobie z nim poradzić. Muszę przeprowadzić test tego kodu i nie wiem gdzie znajduje się błąd. Proszę o pomoc.

package javaapplication2;

import static java.lang.Math.*;
import java.util.function.BiFunction;

public class RungeKutta {

static void runge(BiFunction<Double, Double, Double> yp_func, double[] t,
        double[] y, double dt) {

    for (int n = 0; n < t.length - 1; n++) {
        double dy1 = dt * yp_func.apply(t[n], y[n]);
        double dy2 = dt * yp_func.apply(t[n] + dt / 2.0, y[n] + dy1 / 2.0);
        double dy3 = dt * yp_func.apply(t[n] + dt / 2.0, y[n] + dy2 / 2.0);
        double dy4 = dt * yp_func.apply(t[n] + dt, y[n] + dy3);
        t[n + 1] = t[n] + dt;
        y[n + 1] = y[n] + (dy1 + 2.0 * (dy2 + dy3) + dy4) / 6.0;
    }
}

static double calc_err(double t, double calc) {
    double actual = pow(pow(t, 2.0) + 4.0, 2) / 16.0;
    return abs(actual - calc);
}

public static void main(String[] args) {
    double dt = 0.10;
    double[] t_arr = new double[101];
    double[] y_arr = new double[101];
    y_arr[0] = 1.0;

    runge((t, y) -> t * sqrt(y), t_arr, y_arr, dt);

    for (int i = 0; i < t_arr.length; i++)
        if (i % 10 == 0)
            System.out.printf("y(%.1f) = %.8f Error: %.6f%n",
                    t_arr[i], y_arr[i],
                    calc_err(t_arr[i], y_arr[i]));
}

}

1

**Martin Kutta **urodził się w województwie opolskim, w powiecie kluczborskim, siedziba gminy miejsko-wiejskiej Byczyna.
http://kfm.po.opole.pl/kutta.html

0

wow. dzięki

0

Dokładnie ujmując mój problem, nie wiem do końca jakie testy mógłbym przeprowadzić na tym kodzie... byłbym wdzięczny za jakieś propozycje.

0

Metoda Rungego-Kutty polega na numerycznym obliczaniu całki oznaczonej. Jest bardziej dokładna od zwykłego całkowania Eulera. Także u ciebie kontroluj wynik z metody calc_err. Jeśli chodzi o błąd dopuszczalny, to już musisz sam sobie postawić granice - np całka ograniczona od 0 do 3 z funkcji 2x wynosi 9. Czy błąd rzędu 0,1 byłby duży? Raczej tak. Czy błąd rzędu 0,01 byłby duży? To zależy. Pokombinuj zamienić doubla na BigDecimal w celu uzyskania większej dokładności (aczkolwiek nie mówię że to tak musi być i koniec).

0

Tu nie chodzi o żadną całkę oznaczoną, a raczej o ewolucję w czasie równania różniczkowego - coś na kształt metody różnic skończonych, tyle że wyższego rzędu.
https://pl.wikipedia.org/wiki/Algorytm_Rungego-Kutty
W klasie masz przykład klasycznego RK4.

1 użytkowników online, w tym zalogowanych: 0, gości: 1