2013-09-19 2 views
0

Где мой недостаток в следующем коде?Что случилось с реализацией этого метода Ньютона в Схеме?

(define (newtons-method2 f guess n) 
(define (newton-transform f) 
(lambda (x) 
    (- x (/ (f x) ((der f 0.5) x))))) 
(let ((next (newton-transform guess))) 
(if (= 0 n) 
    next 
    (newtons-method2 (f next (- n 1)))))) 

Метод назван «ньютон-method2», потому что это была моя вторая попытка написания метода Ньютона в схеме

Моя производная функция выглядит следующим образом:

(define (der f h) 
(lambda (x) 
(/ (- (f(+ x h)) (f x)) 
    h))) 
+0

http://codereview.stackexchange.com/questions/1401/scheme-cube-root-newtons-method –

+0

http://codereview.stackexchange.com/questions/1396/scheme-use-newtons-method-to -compute-sqrtx –

+2

Вы не сказали нам, почему вы считаете, что код неправильный. Какой результат вы получаете? –

ответ

2

Есть вероятно, несколько проблем, я нашел их:

(newtons-method2 (f next (- n 1)) 
-> 
(f next (- n 1)) 

это оценка f с параметрами next и n-1, но вы хотите передать все 3 в качестве параметров:

(newtons-method2 f next (- n 1)) 

Будьте осторожны со скобками, они коренным образом изменить то, что делает программа. Просто потому, что они балансируют, это не значит, что программа делает что-то значимое.

0.5 для дельты - огромное значение и, вероятно, вызовет проблемы при расчете приближений. как насчет 0,00001?

Учитесь делать правильный отступ, поэтому аргументы выстраиваются под друг друга. Опять же, это связано с круглыми скобками. Прочитать свой код почти невозможно.

Кроме того, здесь хорошая реализация с объяснением от SICP лекций (настоятельно рекомендуется, блестящий): http://www.youtube.com/watch?v=erHp3r6PbJk&list=PL8FE88AA54363BC46 (с 43:14)

+0

Любая идея сейчас почему я получаю # , когда компилирую? Что означает эта компиляция? –

1

Вы не просили, но здесь альтернативный метод для вычисления квадратный корень:

(define (root n) 
    (if (< n 1) (/ (root (* n 4)) 2) 
    (if (<= 4 n) (* (root (/ n 4)) 2) 
     (let ((x (/ (+ 2. n) 2))) 
     (let ((x (/ (+ x (/ n x)) 2))) 
      (let ((x (/ (+ x (/ n x)) 2))) 
      (let ((x (/ (+ x (/ n x)) 2))) 
       (let ((x (/ (+ x (/ n x)) 2))) 
       (let ((x (/ (+ x (/ n x)) 2))) 
        x))))))))) 

Это нормализует н в диапазоне от 1 < = п < 4 затем разворачивает петлю и выполняет пять итераций, с начальной оценкой 2, которое является среднее геометрическое диапазона; можно доказать, что пять итераций достаточны для арифметики с двойной точностью, поскольку n, как известно, находится в ограниченном диапазоне. Используемая формула обусловлена ​​Heron, которая предшествовала методу Ньютона к 16 векам.

Смежные вопросы