作为这个问题的答案:
练习1.29辛普森法则是一种比上述方法更精确的数值积分方法。利用辛普森法则,将a与b之间函数f的积分近似为(h / 3) * (y_0 + 4y_1 + 2y_2 + 4y_3 + 2y_4 + 2y_(n-2) + 4y_(n-1) + y_n ),其中h= (b - a)/n为偶数n,yk = f(a + kh).(n的增加提高了近似的精度。)定义一个以参数f、a、b和n作为参数的过程,并返回使用Simpson规则计算的积分的值。使用您的过程在0到1之间集成多维数据集(n= 100和n= 1000),并将结果与上面显示的积分过程的结果进行比较。
我编写了以下解决方案:
(define (sum term a next b)
(define (iter a result)
(if (> a b)
result
(iter (next a) (+ (term a) result)))
) (iter a 0))
(define (simpsons-rule f a b n)
(let ((h (/ (- b a) n)))
(define (y_k k) (f (+ a (* k h))))
(define (even n) (= (remainder n 2) 0))
(define (term n) (* (if (even n) 2.0 4.0) (y_k n)))
(define (next n) (+ n 1))
(* (/ h 3.0) (+ (y_k 0.0) (sum term 0.0 next (- n 1.0)) (y_k n)))))
(define (cube x) (* x x x))你认为如何?
发布于 2011-03-31 13:41:59
当您调用sum时,请确保以1开头(而不是0)。否则,您将得到+2 y_0 h/ 3的错误。如果是(simpsons-rule cube 1 2 1000),则此错误为0.000666.
重写该系列的另一种方法是将偶数项和奇数项组合在一起,不包括第一项和最后一项。
(h / 3) * (y_0 + y_n +4* (y_1 + y_3 +.+y_n 1)+2* (y_2 + y_4 +.+ y_n-2))
这给了我们另一个可能的实现:
(define (simpsons-rule f a b n)
(define h (/ (- b a) n))
(define (y-k k) (f (+ a (* k h))))
(define (next n) (+ n 2))
(* (/ h 3.0) (+ (y-k 0) (y-k n) (* 4 (sum y-k 1 next (- n 1))) (* 2 (sum y-k 2 next (- n 2))))))https://codereview.stackexchange.com/questions/1538
复制相似问题