Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. open Printf
  2. open Bigarray
  3. type vec = Odepack.vec
  4. let vec a = Array1.of_array float64 fortran_layout a
  5. let grav = 9.81
  6.  
  7. let matA ms mt th i l=
  8. let a= Lacaml_D.Mat.make 2 2 0. in
  9. a.{1,1} <- ms+.mt;
  10. a.{1,2} <- mt*.l*.(cos th);
  11. a.{2,1} <- mt *.l*.(cos th);
  12. a.{2,2} <- i+.mt*.l**2.;
  13. a
  14.  
  15. let matG f ms mt l v i =
  16. let g t x dx th dth =
  17. let tmp = matA ms mt th i l in
  18. Lacaml_D.getri tmp;(*inversion de A*)
  19. let tmp1 = Lacaml_D.Mat.make 2 1 0. in
  20. tmp1.{1,1} <- (f t x dx th dth) -. v*.dx +. ms*.l*.(sin th) *. (dth)**2.;
  21. tmp1.{2,1} <- -.ms*.grav*.l*.(sin th);
  22. let tmp2 = Lacaml_D.gemm tmp tmp1 in
  23. tmp2 in
  24. (fun t x dx th dth -> g t x dx th dth)
  25.  
  26. let vecU x x0 th0 =
  27. let u = vec [|x0;0.;th0;0.|] in
  28. u
  29.  
  30. (*ms = masse segway
  31. mt = masse tige
  32. v = coef de frottement du segway
  33. l = distance du point de rotation au centre de masse de la tige
  34. i = moment inertie de la tige
  35. f est la fonction*)
  36. let solve ms mt v l i f =
  37. let g = matG f ms mt l v i in
  38. let newf t a b=
  39. let newg = g t a.{1} a.{2} a.{3} a.{4} in
  40. b.{1} <- a.{2};
  41. b.{2} <- newg.{1,1};
  42. b.{3} <- a.{4};
  43. b.{4} <- newg.{2,1};
  44. in
  45. let var x0 th0 t =
  46. let u = vecU x0 th0 in
  47. let tmp = vec (Odepack.lsoda newf u 0.) in
  48. let tmp1 = vec [|tmp.{2};tmp.{4}|] in
  49. tmp1 in
  50. (fun x0 th0 t -> var x0 th0 t)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement