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

 
(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)
0.24669648000000022
0.24966666666666754

可见,增加 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 ""