这个牛顿方法在Scheme中实现有什么问题?

时间:2013-09-19 22:14:51

标签: recursion scheme newtons-method

以下代码中我的缺陷在哪里?

(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))))))

该方法名为“newtons-method2”,因为这是我在方案中编写牛顿方法的第二次尝试

我的衍生功能如下:

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

2 个答案:

答案 0 :(得分:2)

可能有几个问题,我找到了这些:

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

这是使用参数fnext评估n-1,但您希望将所有3作为参数传递:

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

小心括号,它们从根本上改变了程序的功能。仅仅因为他们平衡,并不意味着该计划有任何意义。

0.5对于delta是一个巨大的值,并且在计算近似值时可能会出现问题。怎么样0.00001?

学会做适当的缩进,所以参数排列在彼此之下。同样,这与括号有关。几乎不可能阅读你的代码。

此外,这是一个很好的实现,并附有SICP讲座的解释(强烈推荐,精彩):http://www.youtube.com/watch?v=erHp3r6PbJk&list=PL8FE88AA54363BC46(从43:14开始)

答案 1 :(得分: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)))))))))

n 标准化为范围1&lt; = n &lt; 4然后展开循环并执行五次迭代,初始估计值为2,即范围的几何平均值;可以证明五次迭代对于双精度算术是足够的,因为已知 n 在有限范围内。使用的公式是由Heron引起的,它比牛顿方法早16个世纪。