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 :
Interface Function2D :
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; } }
sur le bête test :
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); }
et ça m'imprime :
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);
or je devrais avoir (0,0) , (2.5 , 3.125) , (5 , 12.5) , (7.5 , 28.125) , (10, 50)
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]
ou des trucs très proches tout du moins...
Qu'est-ce qui ne fonctionne pas???
Partager