- -- The pair (xn, |x_{n} - x_{n+1}|) with
- -- |x_{n} - x_{n+1}| < epsilon. The pattern match on 'Just' is
- -- "safe" since the list is infinite. We'll succeed or loop
- -- forever.
- Just winning_pair = find (\(x, diff) -> diff < epsilon) pairs
+-- | Returns a list of ratios,
+--
+-- ||x^{*} - x_{n+1}|| / ||x^{*} - x_{n}||^{p}
+--
+-- of fixed point iterations for the function @f@ with initial guess
+-- @x0@ and @p@ some positive power.
+--
+-- This is used to determine the rate of convergence.
+--
+fixed_point_error_ratios :: (Vector a, RealFrac b)
+ => (a -> a) -- ^ The function @f@ to iterate.
+ -> a -- ^ The initial value @x0@.
+ -> a -- ^ The true solution, @x_star@.
+ -> Integer -- ^ The power @p@.
+ -> [b] -- ^ The resulting sequence of x_{n}.
+fixed_point_error_ratios f x0 x_star p =
+ zipWith (/) en_plus_one en_exp
+ where
+ xn = F.fixed_point_iterations f x0
+ en = map (\x -> norm_2 (x_star - x)) xn
+ en_plus_one = tail en
+ en_exp = map (^p) en