25 lines
587 B
Haskell
25 lines
587 B
Haskell
dv
|
|
:: Floating a
|
|
=> a -> a -> a
|
|
dv = (. sqrt) . (*)
|
|
|
|
fy t = 1 / 16 * (4 + t ^ 2) ^ 2
|
|
|
|
rk4
|
|
:: (Enum a, Fractional a)
|
|
=> (a -> a -> a) -> a -> a -> a -> [(a, a)]
|
|
rk4 fd y0 a h = zip ts $ scanl (flip fc) y0 ts
|
|
where
|
|
ts = [a,h ..]
|
|
fc t y =
|
|
sum . (y :) . zipWith (*) [1 / 6, 1 / 3, 1 / 3, 1 / 6] $
|
|
scanl
|
|
(\k f -> h * fd (t + f * h) (y + f * k))
|
|
(h * fd t y)
|
|
[1 / 2, 1 / 2, 1]
|
|
|
|
task =
|
|
mapM_
|
|
(print . (\(x, y) -> (truncate x, y, fy x - y)))
|
|
(filter (\(x, _) -> 0 == mod (truncate $ 10 * x) 10) $
|
|
take 101 $ rk4 dv 1.0 0 0.1)
|