Шаг 61.
Основы языка Haskell. Сложные типы рекурсии на числовых структурах. Некоторые итерационные методы решения уравнений

    На этом шаге мы рассмотрим несколько примеров использования итерационных методов решения уравнений.

    Приведем несколько примеров использования рекурсии.

   -- Демонстрация функции, возвращающей квадратный корень
   -- из вещественного числа с помощью метода Ньютона
   --------------------------------------------------
   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          
Файл с примерами можно взять здесь.

    На следующем шаге мы приведем задачи для самостоятельного решения.




Предыдущий шаг Содержание Следующий шаг