以下代码中我的缺陷在哪里?
(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)))
答案 0 :(得分:2)
可能有几个问题,我找到了这些:
(newtons-method2 (f next (- n 1))
->
(f next (- n 1))
这是使用参数f
和next
评估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个世纪。