1.29
练习 1.29: 辛普森规则是另一种比上面所用规则更精确的数值积分方法。采用辛普森规则,函数f在范围a和b之间的定积分的近似值是:
其中 h=(b-a)/n,n是某个偶数,而 (增大n能提高近似值的精度)。请定义一个具有参数f、a、b和n,采用辛普森规则计算并返回积分值的过程。用你的函数求出cube在0和1之间的积分(用n=100和n=1000),并将得到的值与上面用 integral 过程所得到的结果比较。
(define (cube x) (* x x x))
(cube 3)
(define (sum term a next b)
(if (> a b)
0
(+ (term a) (sum term (next a) next b))))
(define (integral f a b dx)
(define (add-dx x) (+ x dx))
(* (sum f (+ a (/ dx 2.0)) add-dx b) dx)
)
(integral cube 0 1 0.001)
(define (cube x) (* x x x))
(define (sum-product term a next b next-product)
(if (> a b)
0
(+ (* (next-product a) (term a)) (sum-product term (next a) next b next-product))))
(define (logreturn x) x)
(define (even x) (< (remainder x 2) 0.5))
(define (integral2 f a b n)
(define (h a b n) (/ (- b a) n))
(define (add-h x) (+ x (h a b n)))
(define (next x)
(cond ((= x a) (logreturn 1))
((= x b) (logreturn 1))
((even (/ (* n (- x a)) (- b a))) (logreturn 2))
(else (logreturn 4)))
)
(* (/ (h a b n) 3) (sum-product f a add-h b next))
)
(integral2 cube 0 1 100)
(integral2 cube 0 1 1000)
可见,增加 n 的确可以提高精度。但是同样的增加步长,辛普森规则的精度不如 方法的精度。