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

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

我的导数函数如下:

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

2 回答 2

2

可能有几个问题,我发现了这些:

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

f这是使用参数next和进行评估n-1,但您希望将所有 3 个作为参数传递:

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

小心括号,它们从根本上改变了程序的作用。仅仅因为它们平衡,并不意味着该程序做了任何有意义的事情。

delta 的 0.5 是一个巨大的值,在计算近似值时可能会导致问题。0.00001 怎么样?

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

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

于 2013-09-19T22:24:06.327 回答
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 <= n < 4 的范围,然后展开循环并执行五次迭代,初始估计值为 2,这是该范围的几何平均值;有可能证明五次迭代对于双精度算术是足够的,因为已知n在有限的范围内。使用的公式来自Heron,它比牛顿的方法早了 16 个世纪。

于 2013-09-20T16:01:19.710 回答