freeCodeCamp/guide/chinese/mathematics/simpsons-rule/index.md

3.5 KiB
Raw Blame History

title localeTitle
Simpson's Rule 辛普森的规则

辛普森的规则

在数值分析中辛普森的规则是数值积分的方法_定积分的数值逼近_ 。

辛普森的规则近似于形式的整合,

哪里,

  • f(x)称为_被积函数_
  • a =整合的下限
  • b =整合的上限

辛普森的1/3规则

Simpson's Rule

如上图所示,被积函数f(x)由二阶多项式近似;二次插值是P(x)

接近,

(ba)/2替换为h ,我们得到,

如您所见,上述表达式中有1/3 。这就是为什么,它被称为辛普森的1/3规则

如果某个函数在某些点上具有高度振荡或缺乏导数,则上述规则可能无法产生准确的结果。处理此问题的一种常见方法是将间隔[a,b]分解为许多小的子间隔。然后将辛普森的规则应用于每个子区间将结果相加以产生整个区间内积分的近似值。这种方法被称为_复合辛普森的规则_ 。

假设区间[a,b]被分成n个子区间, n是偶数。然后复合Simpson的规则给出

其中x j = a + jh j = 0,1...n-1n其中h =ba/ n ;特别地, x 0 = ax n = b

例:

取下面给出的积分值取n = 8。

在C ++中实现Simpson的1/3规则如下

#include<iostream> 
 #include<cmath> 
 using namespace std; 
 
 float f(float x) 
 { 
    return x*sin(x);    //Define the function f(x) 
 } 
 
 float simpson(float a, float b, int n) 
 { 
    float h, x[n+1], sum = 0; 
    int j; 
    h = (ba)/n; 
 
    x[0] = a; 
 
    for(j=1; j<=n; j++) 
    { 
        x[j] = a + h*j; 
    } 
 
    for(j=1; j<=n/2; j++) 
    { 
        sum += f(x[2*j - 2]) + 4*f(x[2*j - 1]) + f(x[2*j]); 
    } 
 
    return sum*h/3; 
 } 
 
 int main() 
 { 
    float a,b,n; 
    a = 1;      //Enter lower limit a 
    b = 4;      //Enter upper limit b 
    n = 8;      //Enter step-length n 
    if (n%2 == 0) 
        cout<<simpson(a,b,n)<<endl; 
    else 
        cout<<"n should be an even number"; 
    return 0; 
 } 

辛普森的3/8规则

辛普森的3/8规则类似于辛普森的1/3规则。唯一的区别在于这里插值是一个三次多项式。 3/8规则大约是1/3规则的两倍但它使用了一个以上的函数值。

辛普森的3/8规则规定

(ba)/3替换为h ,我们得到,

对于n个区间Simpson的3/8规则n应该是3的倍数

其中x j = a + jh j = 0,1...n-1n其中h =ba/ n ;特别地, x 0 = ax n = b

更多信息:

  1. 辛普森的规则
  2. 辛普森的1/3规则