Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- open Printf
- (*Création du tableau RK4 composé de
- tau, b et a comme vu au cours *)
- let tau = [|0.;0.5;0.5;1.|]
- let b = [|1./.6.;1./.3.;1./.3.;1./.6.|]
- let a = [|[||];
- [|0.5|];
- [|0.;0.5|];
- [|0.;0.;1.|]|]
- (*Multiplication d'un tableau par un float k*)
- let mult k a = Array.map (fun i -> k*.i) a
- (*Addition de 2 tableaux de même taille*)
- let add a1 a2 =
- if a1 = [||] then
- a2
- else if a2 = [||] then
- a1
- else
- let arr = Array.make (Array.length a1) 0. in
- for i = 0 to (Array.length a1)-1 do
- arr.(i) <- a1.(i) +. a2.(i)
- done;
- arr
- (*évaluation de f au temps t*)
- let rk4 f u t n =
- let k = Array.make 4 [||] and
- h = t/. float_of_int n and
- u_i = ref u in
- let t_i = ref 0. in
- for i = 0 to n do
- (*calcul des k_j*)
- k.(0) <- mult h (f (!t_i +. tau.(0) *. h) !u_i);
- for j = 1 to 3 do
- let res = ref [||] in
- (*somme des vecteurs a_jl*k_l quand l < j*)
- for l = 0 to j-1 do
- res := add !res (mult a.(j).(l) k.(l))
- done;
- res := add !u_i !res;
- k.(j) <- mult h (f (!t_i +. tau.(j) *. h) !res);
- done;
- (*Somme de b_j*k_j*)
- let tmp = ref [||] in
- for j = 0 to 3 do
- tmp := add !tmp (mult b.(j) k.(j))
- done;
- u_i := add !u_i !tmp;
- t_i := !t_i +. h;
- (* printf "ui1: %g ui2: %g\n" !u_i.(0) !u_i.(1) *)
- done;
- !u_i
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement