计算机程序的构造和解释 练习题1.29

看到这种算数题,果断翻出高数书,回忆一下辛普森规则,其实它就是抛物线法求定积分的近似值。当然求定积分的近似值还有矩形法和梯形法,说到定积分,有同学可能已经忘了这是什么东东了,定积分说简单点,就是求函数曲线在[a,b]这个区间,与x轴围城的面积大小,也就是f(x) 跟 x 轴所围成的面积。
在这里插入图片描述
辛普森规则其实就是用抛物线去求曲线的近似面积,假设我们把[a,b]分为n份,每一份的距离都是(a-b)/n,我们把它计做h,为了方便计算,我们先取(a,ya)、(m,yb)、(b,yc)三个点,有以下公式:
P ( x ) = p x 2 + q x + r y a = p a 2 + q a + r y b = p m 2 + q m + r y c = p b 2 + q b + r a = m h b = m + h P(x) = px^2+qx+r\\ y_a=pa^2+qa+r\\ y_b=pm^2+qm+r\\ y_c=pb^2+qb+r\\ a = m - h\\ b = m + h\\
根据公式可以推导出:
y a 2 y b + y c = 2 p h 2 y_a-2y_b+y_c = 2ph^2
根据牛顿-莱布尼兹公式,P(x)在[a,b]的定积分就为P(x)的原函数在(a,b)两点的差值即:
为了便于运算,我们假设m刚好为0,(a,ya)、(m,yb)、(b,yc)三个点就变成(-h,ya)、(0,yb)、(h,yc)
a b f ( x ) d x = F ( b ) F ( a ) a b f ( p x 2 + q x + r ) d x = [ 1 3 p x 3 + 1 2 p x 2 + x r ] a b = 1 3 h 3 + 1 2 p h 2 + h r 1 3 p ( h ) 3 1 2 p ( h ) 2 ( h ) r = 2 3 h 3 + 2 h r = 1 3 h ( 2 p h 2 + 6 r ) = 1 3 h ( y a 2 y b + y c + 4 y b ) = 1 3 h ( y a + 4 y b + y c ) \int_a^bf\left(x\right)dx=F\left(b\right)-F\left(a\right)\\ \int_a^bf\left(px^2+qx+r\right)dx=\left[\frac13px^3+\frac12px^2+xr\right]_a^b\\=\frac13h^3+\frac12ph^2+hr-\frac13p\left(-h\right)^3-\frac12p\left(-h\right)^2-\left(-h\right)r\\=\frac23h^3+2hr\\=\frac13h\left(2ph^2+6r\right)\\=\frac13h\left(y_a-2y_b+y_c+4y_b\right)\\=\frac13h\left(y_a+4y_b+y_c\right)\\
然后我们将每个区域的面积求出来
F 0 = 1 3 h ( y 0 + 4 y 1 + y 2 ) F 1 = 1 3 h ( y 2 + 4 y 3 + y 4 ) F 2 = 1 3 h ( y 4 + 4 y 5 + y 6 ) . . . . . . . . F m = 1 3 h ( y n 2 + 4 y n 1 + y n ) . F_0 = \frac13h\left(y_0+4y_1+y_2\right)\\ F_1 = \frac13h\left(y_2+4y_3+y_4\right)\\ F_2 = \frac13h\left(y_4+4y_5+y_6\right)\\........\\ F_m= \frac13h\left(y_{n-2}+4y_{n-1}+y_n\right)\\.
我们得到最终的公式,也就是辛普森规则
F = 1 3 h ( y 0 + 4 y 1 + 2 y 2 + 4 y 3 + 2 y 4 + 4 y 5 + . . . . . . . . . + 2 y n 2 + 4 y n 1 + y n ) F = \frac13h\left(y_0+4y_1+2y_2+4y_3+2y_4+4y_5+.........+2y_{n-2}+4y_{n-1}+y_n\right)
然后我们开始写按照辛普森规则编写程序

#lang racket

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a ) next b))))
(define (inc n) (+ n 1))
(define (cube n) (* n n n))

(define (simpson-inregral f a b n)
  (let ((h (/ (- b a) n)))
    (define (simpson-term k)
      (* (cond ((or (= k 0) (= k n)) 1)
               ((even? k) 2 )
               (else 4 )) (f (+ a (* k h)))))
      (if (odd? n) (simpson-inregral f a b (+ n 1)) (/ (* (sum simpson-term 0 inc n) h) 3.0))))

(simpson-inregral cube 0 1 1000)
(simpson-inregral cube 0 1 10)

运行结果:

0.25
0.25

结果比书中的计算要精确。

发布了27 篇原创文章 · 获赞 1 · 访问量 475

猜你喜欢

转载自blog.csdn.net/holybird0213/article/details/104764062