-- 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
-- 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
-> (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) )
-- 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]
-> 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
-- Examples:
--
-- Atkinson, p. 67.
+--
-- >>> let f x = x^6 - x - 1
-- >>> let Just root = secant_method f (1/10^9) 2 1
-- >>> root