2-3、定積分を計算するための反復法

先生王Xiaohuaからのコンテンツ

これは、ハードコアの一種だった、理解することが最初の操作を行い、問題を解決するために、メインの反復手順を使用する方法を学びます

 

二つの一般的な数値積分アルゴリズム、それぞれ、台形ルール方法ステップと可変ステップサイズシンプソン式になってきています。私たちは、台形公式を達成するために、複合台形式の方法の実現には、可変ステップサイズを複合台形公式を導出する台形則で始まります。

同様に、シンプソン式可変ステップサイズ法は、シンプソンの公式、アルゴリズム第1の複合シンプソン式方法から開始し、次にプロセス変数ステップ長シンプソンの公式を実装することです

 

メソッドの台形式

 

 

方法化合物台形式
台形定積分式誤差が許容できないほど大きくなる場合、場合区間[a、b]は比較的大きいです。各セル間内台形のための台形式のN小さな間隔、次いで面積、及び結果を合計することによって得られた台形の全ての小領域に分割大部分場合、誤差が大きく化合物である、低減されます台形式。この分割後、各セル間の長さは「ステップ」、すなわち、ステップ=(B-A)/ Nと呼ばれています。細かい積分区間が分割され、実際の値が得られ台形公式近似法により近いです。

 

 

double trapezium(std::function<double(double)> func, double a, double b, int n)
{
    double step = (b - a) / n;
    double sum = (func(a) + func(b)) / 2.0;

    for (int j = 1; j < n; j++)
    {
        double xj = a + j*step;
        sum = sum + func(xj);
    }

    sum *= step;

    return sum;
}

 

变步长梯形公式法
为了提高迭代计算的效率,人们想出了一种利用迭代思想的变步长梯形公式法。在对定积分图形的内接梯形分割的时候,每个迭代都把上一个迭代分割的梯形再平均分割成两个小梯形。随着迭代次数增加,逐步增加梯形分割的个数,使得梯形分割沿积分自变量方向的步长由粗到细,逐步变化,就是所谓的变步长。每个迭代计算一次小梯形面积的和,并与上个迭代计算的小梯形面积的和做比较,若相邻两次迭代的差值达到精度要求,则退出迭代计算,否则就对当前的所有小梯形继续分割,进行下次迭代计算。如图(2)所示,每次分割得到的两个小梯形的面积之和都比分割前的大梯形面积更接近曲线的积分值。

double vs_trapezium(std::function<double(double)> func, double a, double b, double eps)
{
    int n = 1;   //初始分割一个大梯形
    double t1 = (b - a) * (func(a) + func(b)) / 2.0; //用梯形公式计算初始梯形的面积
    double diff = eps + 1.0;
    do
    {
        n = 2 * n;    //梯形分割加倍
        double t = trapezium(func, a, b, n);  //用复合梯形公式法计算 n 个小梯形的面积之和
        diff = std::fabs(t1 - t);      //计算两次迭代的结果差值
        t1 = t; //更新迭代变量
    } while (diff >= eps);

    return t1;
}

 

辛普森公式法

复合辛普森公式法

double simpson(std::function<double(double)> func, double a, double b, int n)
{
    double s1, s2;
    int i;

    double step = (b - a) / n;
    s1 = s2 = 0;
    for (i = 1; i < n; i++)
    {
        s2 += func(a + step * i);   //xi 求和
    }
    for (i = 1; i <= n; i++)
    {
        s1 += func(a + step * i - step / 2);  //(xi - step/2)求和
    }

    double s = step * (func(a) + func(b) + 4 * s1 + 2 * s2) / 6.0;

    return s;
}

 

可变长辛普森公式法
和梯形公式一样,复合辛普森公式也可以改造为变步长辛普森公式法。改造的方法就是使用迭代法的思想,通过改变区间个数 n 使得步长 step 也跟着变化,当迭代差值符合精度要求时即可停止迭代。算法的迭代变量仍然是每次分割后的小区间上使用辛普森公式计算的插值曲线面积之和,迭代关系则非常简单,就是用本迭代的迭代变量代替上个迭代的迭代自变量的值,迭代终止条件就是两个迭代的迭代变量之差小于精度值。迭代变量的初始值就是在区间 [a,b] 上应用辛普森公式计算最大的区间面积。用一个变量 n 表示当前迭代分割小梯形的个数,n 的值每个迭代增加一倍。而每次分割后的小区间面积和的计算可由第 2-2 课中给出的复合辛普森公式算法 simpson() 函数计算,迭代算法的整体结构与变步长梯形法类似。

double vs_simpson(std::function<double(double)> func, double a, double b, double eps)
{
    int n = 1;   //初始分割一个大梯形
    double s1 = (b - a) * (func(a) + func(b) + 4 * func((a + b) / 2.0)) / 6.0; //计算初始梯形的面积
    double diff = eps + 1.0;
    do
    {
        n = 2 * n;    //梯形分割加倍
        double t = simpson(func, a, b, n); //用复合辛普森公式计算 n 个小梯形的面积之和
        diff = std::fabs(s1 - t);      //计算两次迭代的结果差值
        s1 = t; //更新迭代变量
    } while (diff >= eps);

    return s1;
}

 

おすすめ

転載: www.cnblogs.com/orxx/p/10956871.html