Bonour à tous, voilà j'ai un problème avec RK4 :

Soit le problème de Cauchy

d u(t) = f(t, u(t) )
u(t0) = u0

Je veux trouver la fonction u(t) en intégrant avec Runge Kutta d'ordre 4 en intégrant sur l'intervalle [t0, t1]

Je crée donc une classe RungeKutta2D qui va faire ça. Seulement voilà, avec de bêtes exemples ça marche pas :

sur [0, 10] : d u(t) = t , u(0) = 0
==> je voudrais qu'on me retourne la fonction u(t) = t² / 2 car d(t² / 2) = t mis ça me donne pas ça

Je travaille en Java

Classe qui fait RungeKutta :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
public class RungeKutta2D
{
    private double u0;
    private double t1;
    private double t0;
    private Function2D f;
 
    public RungeKutta2D(Function2D f, double t0, double t1, double u0)
    {
        this.f = f;
        this.t0 = t0;
        this.t1 = t1;
        this.u0 = u0;
    }        
 
    public Point2D.Double[] getRK4(int n)
    {
        Point2D.Double[] pts = new Point2D.Double[n];
        double ui = u0;
        pts[0] = new Point2D.Double(t0,u0);
        double h = (t1 - t0) / (n - 1);
 
        for (int i = 1; i < pts.length; i++)
        {
            double ti = t0 + i * h;
            double k1 = h * f.eval(ti, ui);
            double k2 = h * f.eval(ti + h/2 , ui + k1/2);
            double k3 = h * f.eval(ti + h/2 , ui+ k2/2);
            double k4 = h * f.eval(ti + h, ui + k3);
 
            ui += (1/6.) * (k1 + 2*k2 + 2*k3 + k4);
            pts[i] = new Point2D.Double(ti, ui);
        }
 
        return pts;
    }
}
Interface Function2D :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
public interface Function2D
{
            public double eval(double x, double y);
}
sur le bête test :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
public class RKTest
{
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        //si d u(t) = t alors f(t, u(t)) = t
        // => f : R² -> R : (x, y) ->  x
 
        //analytiquement, u(t) = x² / 2
 
        Function2D f = new Function2D()
        {
            public double eval(double x, double y)
            {
                return x;
            }
        };
 
        RungeKutta2D rk = new RungeKutta2D(f, 0, 10 , 0);
        Point2D.Double[] pts = rk.getRK4(5);
        for(Point2D.Double p : pts)
             System.out.println(p);
et ça m'imprime :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
Point2D.Double[0.0, 0.0]
Point2D.Double[2.5, 9.375]
Point2D.Double[5.0, 25.0]
Point2D.Double[7.5, 46.875]
Point2D.Double[10.0, 75.0]
or je devrais avoir (0,0) , (2.5 , 3.125) , (5 , 12.5) , (7.5 , 28.125) , (10, 50)
ou des trucs très proches tout du moins...

Qu'est-ce qui ne fonctionne pas???