X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FRoots%2FSimple.hs;h=815a64ca0d3407dc051c16875593cdf2cdeb3532;hb=b4dd59b1c20deab4381959d8cc8394ada113d286;hp=a6aa09e497ba841d2c3a8e0be2749aab27c72662;hpb=04f56a8882bb0c574b603f8c3fed9481ea934f7f;p=numerical-analysis.git diff --git a/src/Roots/Simple.hs b/src/Roots/Simple.hs index a6aa09e..815a64c 100644 --- a/src/Roots/Simple.hs +++ b/src/Roots/Simple.hs @@ -8,22 +8,34 @@ -- where f is assumed to be continuous on the interval of interest. -- -module Roots.Simple +module Roots.Simple ( + bisect, + fixed_point, + fixed_point_error_ratios, + fixed_point_iteration_count, + has_root, + newtons_method, + secant_method, + trisect ) where import Data.List (find) +import NumericPrelude hiding ( abs ) +import Algebra.Absolute ( abs ) +import qualified Algebra.Additive as Additive ( C ) +import qualified Algebra.Algebraic as Algebraic ( C ) +import qualified Algebra.Field as Field ( C ) +import qualified Algebra.RealField as RealField ( C ) +import qualified Algebra.RealRing as RealRing ( C ) -import Normed +import Normed ( Normed(..) ) +import qualified Roots.Fast as F ( + bisect, + fixed_point_iterations, + fixed_point_with_iterations, + has_root, + trisect ) -import qualified Roots.Fast as F - -import NumericPrelude hiding (abs) -import Algebra.Absolute (abs) -import qualified Algebra.Additive as Additive -import qualified Algebra.Algebraic as Algebraic -import qualified Algebra.Field as Field -import qualified Algebra.RealField as RealField -import qualified Algebra.RealRing as RealRing -- | Does the (continuous) function @f@ have a root on the interval -- [a,b]? If f(a) <] 0 and f(b) ]> 0, we know that there's a root in @@ -185,6 +197,7 @@ fixed_point_error_ratios f x0 x_star p = -- Examples: -- -- Atkinson, p. 60. +-- -- >>> let f x = x^6 - x - 1 -- >>> let f' x = 6*x^5 - 1 -- >>> tail $ take 4 $ newton_iterations f f' 2 @@ -195,8 +208,8 @@ newton_iterations :: (Field.C a) -> (a -> a) -- ^ The derivative of @f@ -> a -- ^ Initial guess, x-naught -> [a] -newton_iterations f f' x0 = - iterate next x0 +newton_iterations f f' = + iterate next where next xn = xn - ( (f xn) / (f' xn) ) @@ -271,6 +284,7 @@ iterate2 f x0 x1 = -- Examples: -- -- Atkinson, p. 67. +-- -- >>> let f x = x^6 - x - 1 -- >>> take 4 $ secant_iterations f 2 1 -- [2.0,1.0,1.0161290322580645,1.190577768676638] @@ -280,8 +294,8 @@ secant_iterations :: (Field.C a) -> a -- ^ Initial guess, x-naught -> a -- ^ Second initial guess, x-one -> [a] -secant_iterations f x0 x1 = - iterate2 g x0 x1 +secant_iterations f = + iterate2 g where g prev2 prev1 = let x_change = prev1 - prev2 @@ -296,6 +310,7 @@ secant_iterations f x0 x1 = -- Examples: -- -- Atkinson, p. 67. +-- -- >>> let f x = x^6 - x - 1 -- >>> let Just root = secant_method f (1/10^9) 2 1 -- >>> root