4.16.2016

Как вычислить квадратный корень? Метод Ньютона. Lisp Scheme

Как в компьютере реализуется вычисление квадратного корня. Рассмотрим пример с использованием метода Ньютона либо метод последовательных приближений, который основан на том, что имея некоторое неточное значение y для квадратного корня из числа x, мы можем с помощью простой манипуляции получить более точное значение  (более близкое к настоящему квадратному корню).


Например мы можем вычислить корень из 2 следующим образом: предположим, что начальное приближение равно 1.


Реализация метода Ньютона на Lisp (Scheme):


(define (square x)(* x x))

(define (average x y)
  (/ (+ x y) 2))

(define (improve guess x)
  (average guess (/ x guess)))

(define (good-enough? guess x)
  (< (abs(-(square guess) x)) 0.001))


(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))

(define (sqrt x)
  (sqrt-iter 1.0 x))

Разберем все процедуры по полочкам:


1) Возведение числа в квадрат (define (square x)(* x x))

2) Узнаем среднее число
(define (average x y)
  (/ (+ x y) 2))

3) Улучшение значения приближения с помощью взятия среднего между ним и частным покоренного числа и старого значения приближения.
(define (improve guess x)
  (average guess (/ x guess)))

4) Если приближение достаточно хорошо походит для наших целей, то процесс закончен; если нет, мы должны повторить его с улучшены значением приближения. guess - приближение.
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))

5) Обобщим код:
(define (sqrt x)
  (sqrt-iter 1.0 x))


Пример работы программы:

Комментариев нет:

Отправить комментарий