1.29

练习 1.29: 辛普森规则是另一种比上面所用规则更精确的数值积分方法。采用辛普森规则,函数f在范围a和b之间的定积分的近似值是:

h3[y0+4y1+2y2+4y3+2y4+...+2yn2+4yn1+yn] \frac{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)y_k=f(a+kh) (增大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 的确可以提高精度。但是同样的增加步长,辛普森规则的精度不如 abf=[f(a+dx2)+f(a+dx+dx2)+f(a+2dx+dx2)+...]dx\int^{b}_{a} f = [f(a + \frac{dx}{2}) + f(a + dx + \frac{dx}{2}) + f(a + 2dx + \frac{dx}{2}) + ...]dx 方法的精度。

results matching ""

    No results matching ""