На этом шаге мы рассмотрим несколько примеров использования итерационных методов решения уравнений.
Приведем несколько примеров использования рекурсии.
-- Демонстрация функции, возвращающей квадратный корень -- из вещественного числа с помощью метода Ньютона -------------------------------------------------- g x | x<0.0000000001 = 0 | True = mNewt x x 0.00001 ---------------------------------------- mNewt a x eps | abs d<eps = x-d | True = mNewt a (x-d) eps where d =(x*x-a)/(2.0*x) --------------------------------- -- Неудачные тестовые примеры: ---------------------------------------------- test = abs ((g 16)-4) < 0.000000001 && abs ((g 16.000001)-4) < 0.000001 && abs ((g 25.000001)-5) < 0.000001 && abs ((g 25.00000001)-5) < 0.000001
-- Демонстрация вычисления квадратного корня -- из числа A методом Ньютона -- -- A-x *x -- i i -- x =x + -------. -- i+1 i 2*x -- i -- -- Вызов функции: f A x0, -- где A - подкоренное выражение, -- x0 - начальное приближение к корню ----------------------------------------- f:: Double -> Double -> Double f a x | p a x = g2 a x | True = f a (g2 a x) where g2 a x = x+(a-x*x)/(2.0*x) p a x = abs (x-g2 a x)<0.00001 ---------------------------------------- -- Неудачные тестовые примеры: -------------------------------------------------- test = abs ((f 16 4.2)-4) < 0.000000001 && abs ((f 16.000001 4.2)-4) < 0.000001 && abs ((f 25.000001 5.1)-5) < 0.000001 && abs ((f 25.00000001 5.1)-5) < 0.000001
-- Демонстрация вычисления кубического корня -- из числа A методом Ньютона -- -- 2 -- x =x +(A/x -x )/3 -- i+1 i i i -- -- Вызов функции: f A x0, -- где A - подкоренное выражение, -- x0 - начальное приближение к корню ----------------------------------------- f:: Double -> Double -> Double f a x | p a x = g2 a x | True = f a (g2 a x) where g2 a x = x+(a/x/x-x)/3.0 p a x = abs (x-g2 a x)<0.00001 ------------------------------------------ -- Неудачные тестовые примеры: ---------------------------------------------------- test = abs ((f 27 3.2)-3) < 0.000000001 && abs ((f 27.000001 3.2)-3) < 0.000001 && abs ((f 125.000001 5.1)-5) < 0.000001 && abs ((f 125.00000001 5.1)-5) < 0.000001 && abs ((f (6*6*6) 45.0)-6) < 0.000001
-- Демонстрация вычисления элемента последовательности -- -- x =f(x ), x0=a, -- k+1 k -- -- до тех пор, пока |x -x |<eps, eps>0 -- k+1 k ---------------------------- -- Первый способ -------------------------------------------- fun1:: Double -> Double -> Integer -> Double fun1 a x k | k==0 = x | True = fun1 a (x+(a-x*x)/(2.0*x)) (k-1) ---------------------------------------------------- -- Второй способ ------------------------------------------ fun2 a n x0 = take n (iterate (fun3 a) x0) where fun3 a x = x+(a-x*x)/(2.0*x) -- ************************************* -- Неудачные тестовые примеры: ------------------------------ test1 = fun1 144 5 100 test11 = fun1 625 30 100 ------------------------ test2 = fun2 144 10 5 test21 = fun2 625 10 30
На следующем шаге мы приведем задачи для самостоятельного решения.