複製鏈接
請複製以下鏈接發送給好友

辛普森公式

鎖定
辛普森(Simpson)公式是牛頓-科特斯公式當n=2時的情形,也稱為三點公式。利用區間二等分的三個點來進行積分插值。其科特斯係數分別為1/6,4/6,1/6。
中文名
辛普森公式
別    名
三點公式
應用學科
立體幾何
科特斯係數
1/6,4/6,1/6

辛普森公式應用

立體幾何中用來求擬柱體體積的公式。

辛普森公式公式內容

擬柱體的高(兩底面α,β間的距離)為H,如果用平行於底面的平面γ去截該圖形,所得到的截面面積是平面γ與平面α之間距離h的不超過3次的函數,那麼該擬柱體的體積V為
V = H (S_1 + 4S_0 + S_2) /6.
式中,S_1和S_2是兩底面的面積,S_0是中截面的面積(即平面γ與平面α之間距離h=H/2時得到的截面的面積)。
事實上,不光是擬柱體,其他符合條件(所有頂點都在兩個平行平面上、用平行於底面的平面去截該圖形時所得到的截面面積是該平面與一底之間距離的不超過3次的函數)的立體圖形也可以利用該公式求體積

辛普森公式計算實例

例1:計算底面積為S、高為h的柱體的體積。
解:此題中S_1 = S_0 = S_2 = S,H = h,所以V = H (S_1 + 4S_0 + S_2) /6 = h (S + 4S + S) /6 = S h。
例2:計算底面積為S、高為h的錐體的體積。
解:此題中S_1 = S,S_0 = S /4,S_2 = 0,H = h,所以V = H (S_1 + 4S_0 + S_2) /6 = h (S + 4S /4 + 0) /6 = S h /3。
例3:計算半徑為r的球的體積。
解:此題中S_1 = S_2 = 0,S_0 = πr^2,H = 2r,所以V = H (S_1 + 4S_0 + S_2) /6 = 2r (0 + 4πr^2 + 0) /6 = 4πr^3 /3。

辛普森公式公式證明

只需要證明根據公式算出來的體積和用積分算出來的體積相等即可。
截面面積是截面高h的不超過3次的函數:f(h)= ah^3 + bh^2 + ch + d。
那麼,
利用積分計算體積,可以得到(積分限為0~h):
V = ∫ f(x) dx
= ah^4 /4 + bh^3 /3 + ch^2 /2 +dh;
利用公式計算體積,可以得到:
V = H (S_1 + 4S_0 + S_2) /6
= h ( f(0) + 4f(h/2) + f(h) ) /6
= h [ d + 4 (ah^3 /8 + bh^2 /4 + ch /2 + d) + (ah^3 + bh^2 + ch + d) ]/6
= ah^4 /4 + bh^3 /3 + ch^2 /2 +dh。
因此兩式相等,公式得證。
Remark:當函數f(h)次數高於或等於4次時,公式一般不成立。這隻需驗證f(h)=h^4時公式不成立即可。

辛普森公式C++代碼實現

//此代碼以 f(x) = sin(x)  為例子,簡單給出Simpson積分公式的應用
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
double fun(double x)
{
    return sin(x);//這裏可以添加其他函數
}
double Simpson(double (*f)(double),double a,double b,int n)//Simpson 求積分法
{
    const double h = (b-a)/n;
    double s = f(a) + f(b);
    for (int i = 1; i < n; i+=2)s += 4 * f(a + i * h);
    for (int i = 2; i < n - 1; i+=2)s += 2 * f(a + i * h);
    return S*h/3.0;
}
int main() {
    double a,b;
    int n;//要劃分的份數
    cout << "請輸入積分上/下限 a,b:";
    cin >> a >> b;//積分上下限
    cout << endl << "請輸入劃分分數 :";
    cin >> n;//以二次曲線逼近的方式取代矩形或梯形的積分公式,所以劃分越多越趨於精確值。
    cout << "sin(x)在[a,b]內的近似數值積分為: " << Simpson(fun,a,b,n) << endl;
    return 0;
}
/*
運行結果如下:
請輸入積分上/下限 a,b: 0  3.1415
請輸入劃分分數 :1000
sin(x) 在[a,b]內的近似數值積分為: 2
//該方法主要用來求定積分的近似解,劃分越多代碼運行效率就會越小,求出來的值越趨於精確值。
*/