Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Итерирование (хвостовая рекурсия)
- let iter f i a b =
- let rec iter' a acc =
- if a > b then acc
- else iter' (a+1) (f a acc)
- iter' a i
- // Функция возведения в степень
- let pow x n = iter (fun _ acc -> x*acc) 1. 1 n
- // function to compute (вариант №14)
- let f x = ((x*2. - 3.)/(pow (x - 1.) 2))
- let a = 0.1
- let b = 0.6
- let n = 10
- // Реализация Тейлора в "лоб"
- let taylor_naive x = iter (fun i acc -> acc - (float(i) + 3.)*(float(pow x (int i)))) 0. 0 50
- // Функция для получения i-ого элемента ряда тейлора
- let taylorElem x i = (float(i) + 3.)*(float(pow x (int i)))
- // Константа для определения точности
- let epsilon = 0.00000001
- // Зависимость текущего элемента от предыдущего, X(n = F(X(n-1))
- let taylorDependence i prev x = ((i + 3.)/(i + 2.))*prev*x
- // Эффективная реализация Тейлора
- let taylor x =
- let rec evaluateNext prev acc i =
- if((taylorElem x i) > epsilon)
- then evaluateNext (taylorDependence i prev x) (acc + taylorDependence i prev x) (i+1.)
- else acc
- evaluateNext -3. -3. 1.
- let main =
- for i=0 to n do
- let x = a+(float i)/(float n)*(b-a)
- printfn "%5.2f %10.6f %10.6f %10.6f" x (f x) (taylor_naive x) (taylor x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement