Advertisement
Guest User

q2.ml

a guest
Mar 19th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.61 KB | None | 0 0
  1. open Printf
  2.  
  3. let good_enough a b prec =
  4.     ( (abs_float (a -. b)) -. (abs_float (b))) <= prec
  5.  
  6. (*c'est original mais ca marche pas des masses*)
  7. let rec euler eps fa fb t1 t2 t =
  8.     if (good_enough t1 t eps) && (good_enough t2 t eps) then
  9.         let fat1 = fa t1 in
  10.         let fbt1 = fb t1 in
  11.         let fat2 = fa t2 in
  12.         let fbt2 = fb t2 in
  13.         let xt1 = Matrix.compute_x fat1 fbt1 (Lacaml_D.Mat.dim1 fat1) (Lacaml_D.Mat.dim2 fat1) in
  14.         let xt2 = Matrix.compute_x fat2 fbt2 (Lacaml_D.Mat.dim1 fat2) (Lacaml_D.Mat.dim2 fat2) in
  15.         let mat = Lacaml_D.Mat.add xt1 xt2 in
  16.         let hi = Lacaml_D.Mat.make (Lacaml_D.Mat.dim1 mat) (Lacaml_D.Mat.dim1 mat) (1./.(abs_float (t1-.t2))) in
  17.         Lacaml_D.Mat.mul mat hi
  18.  
  19.     else
  20.         let new_t = (t1+.t2)/.2. in
  21.         if new_t > t then
  22.             euler eps fa fb t1 new_t t
  23.         else
  24.             euler eps fa fb new_t t2 t
  25.  
  26.  
  27. let deriv fa fb t fda fdb =
  28.     let a = fa t in
  29.     let b = fb t in
  30.     let aT = Matrix.transpose a in
  31.     let da = fda t in
  32.     let db = fdb t in
  33.     let adT = Matrix.transpose a in
  34.     let x = Matrix.compute_x a b (Lacaml_D.Mat.dim1 a) (Lacaml_D.Mat.dim2 a) in
  35.     let left_member = Lacaml_D.gemm aT a in
  36.     let adTb = Lacaml_D.gemm adT b in
  37.     let aTdb = Lacaml_D.gemm aT db in
  38.     let adTax = Lacaml_D.gemm (Lacaml_D.gemm adT a) x in
  39.     let aTdax = Lacaml_D.gemm (Lacaml_D.gemm aT da) x in
  40.     let right_member = Lacaml_D.Mat.sub (Lacaml_D.Mat.sub (Lacaml_D.Mat.add adTb aTdb) adTax) aTdax in
  41.     Lacaml_D.gesv left_member right_member;
  42.     right_member
  43.  
  44. let print a =
  45.     printf "%f\n" a
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement