X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FODE%2FIVP.hs;h=615c668367bd6a26e22567ed0f70a0f90da6e7c0;hb=d9089a0f219795b9f4ff7f8b5576cef678fbe36d;hp=d4876ded2dfe4994bdfb4c7841be7ef84d0a930a;hpb=6bee43b14215e788215751b468f2d1beeb55134b;p=numerical-analysis.git diff --git a/src/ODE/IVP.hs b/src/ODE/IVP.hs index d4876de..615c668 100644 --- a/src/ODE/IVP.hs +++ b/src/ODE/IVP.hs @@ -1,4 +1,5 @@ {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE RebindableSyntax #-} -- | Numerical solution of the initial value problem, -- @@ -12,7 +13,11 @@ module ODE.IVP where import Misc (partition) - +import NumericPrelude hiding (abs) +import qualified Algebra.Field as Field +import qualified Algebra.ToInteger as ToInteger +import qualified Algebra.ToRational as ToRational +import qualified Algebra.RealField as RealField -- | A single iteration of Euler's method over the interval -- [$x0$, $x0$+$h$]. @@ -26,7 +31,7 @@ import Misc (partition) -- >>> eulers_method1 x0 y0 f h -- 2.0 -- -eulers_method1 :: (RealFrac a, RealFrac b) +eulers_method1 :: (Field.C a, ToRational.C a, Field.C b) => a -- ^ x0, the initial point -> b -- ^ y0, the initial value at x0 -> (a -> b -> b) -- ^ The function f(x,y) @@ -35,7 +40,7 @@ eulers_method1 :: (RealFrac a, RealFrac b) eulers_method1 x0 y0 f h = y0 + h'*y' where - h' = fromRational $ toRational h + h' = fromRational'$ toRational h y' = (f x0 y0) @@ -48,6 +53,7 @@ eulers_method1 x0 y0 f h = -- -- Examples: -- +-- >>> import Algebra.Absolute (abs) -- >>> let x0 = 0.0 -- >>> let xN = 1.0 -- >>> let y0 = 1.0 @@ -59,7 +65,11 @@ eulers_method1 x0 y0 f h = -- >>> head ys == y0 -- True -- -eulers_method :: forall a b c. (RealFrac a, RealFrac b, Integral c) +eulers_method :: forall a b c. (Field.C a, + ToRational.C a, + Field.C b, + ToInteger.C c, + Enum c) => a -- ^ x0, the initial point -> b -- ^ y0, the initial value at x0 -> a -- ^ xN, the terminal point @@ -102,7 +112,7 @@ eulers_method x0 y0 xN f n = -- >>> ys == ys' -- True -- -eulers_methodH :: (RealFrac a, RealFrac b) +eulers_methodH :: (RealField.C a, ToRational.C a, Field.C b) => a -- ^ x0, the initial point -> b -- ^ y0, the initial value at x0 -> a -- ^ xN, the terminal point