jckuri

RungeKutta4.hs

Sep 1st, 2015
713
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- https://www.wolframalpha.com/input/?i=y%27%3D-2*x%2B3*y-5
  2.  
  3. (t0,y0) = (0,1)
  4. h = 0.01
  5.  
  6. type Function = Double -> Double
  7.  
  8. yt :: Function
  9. yt t = (y0 - 17/9) * (exp $ 3*t) + 2*t/3 + 17/9
  10.  
  11. type Function2 = Double -> Double -> Double
  12.  
  13. yt1 :: Function2
  14. yt1 t y = -2*t + 3*y - 5
  15.  
  16. rk4 :: Function2 -> Double -> (Double,Double) -> (Double,Double)
  17. rk4 f h (tn,yn) =
  18.  (tn1,yn1)
  19.  where
  20.   k1 = f tn yn
  21.   k2 = f (tn + h/2) (yn + h*k1/2)
  22.   k3 = f (tn + h/2) (yn + h*k2/2)
  23.   k4 = f (tn + h) (yn + h*k3)
  24.   tn1 = tn + h
  25.   yn1 = yn + (k1 + 2*k2 + 2*k3 + k4) * h/6
  26.  
  27. printIteration (tn,yn) =
  28.  putStrLn string >>
  29.  return (tn1,yn1)
  30.  where
  31.   string =
  32.    "t = " ++ show tn ++ ", RK4 y = " ++ show yn ++ ", y = " ++ show y ++
  33.    ", error = " ++ show error
  34.   (tn1,yn1) = rk4 yt1 h (tn,yn)
  35.   y = yt tn
  36.   error = abs $ y - yn
  37.  
  38. printIterations (tn,yn) finalT =
  39.  printIteration (tn,yn) >>= \(tn1,yn1) ->
  40.  if tn1 > finalT then
  41.   return ()
  42.  else
  43.   printIterations (tn1,yn1) finalT
  44.  
  45. main =
  46.  printIterations (t0,y0) 5
Advertisement
Add Comment
Please, Sign In to add comment