計算方法實驗(二):龍貝格積分法

Romberg積分法數學原理

利用復化梯形求積公式、復化辛普生求積公式、復化柯特斯求積公式的誤差估計式計算積分abf(x)dx\int_{a}^{b}{f(x)dx}。記h=banh = \frac{b - a}{n}xk=a+khx_{k} = a + k \cdot hk=0,1,,nk = 0,1,\cdots,n,其計算公式:

Tn=12hk=1n[f(xk1)+f(xk)]T_{n} = \frac{1}{2}h\sum_{k = 1}^{n}\lbrack f(x_{k - 1}) + f(x_{k})\rbrack

T2n=12Tn+12hk=1nf(xk12h)T_{2n} = \frac{1}{2}T_{n} + \frac{1}{2}h\sum_{k = 1}^{n}{f(x_{k} - \frac{1}{2}h})

Sn=13(4T2nTn)S_{n} = \frac{1}{3}(4T_{2n} - T_{n})

Cn=115(16S2nSn)C_{n} = \frac{1}{15}(16S_{2n} - S_{n})

Rn=163(64C2nCn)R_{n} = \frac{1}{63}(64C_{2n} - C_{n})

一般地,利用龍貝格算法計算積分,要輸出所謂的TT -數表

T1T2S1T4S2C1T8S4C2R1\begin{matrix} T_{1} & & & \begin{matrix} & \\ \end{matrix} \\ T_{2} & S_{1} & & \begin{matrix} & \\ \end{matrix} \\ T_{4} & S_{2} & C_{1} & \begin{matrix} & \\ \end{matrix} \\ \begin{matrix} T_{8} \\ \vdots \\ \end{matrix} & \begin{matrix} S_{4} \\ \vdots \\ \end{matrix} & \begin{matrix} C_{2} \\ \vdots \\ \end{matrix} & \begin{matrix} \begin{matrix} R_{1} \\ \vdots \\ \end{matrix} & \begin{matrix} \\ \ddots \\ \end{matrix} \\ \end{matrix} \\ \end{matrix}

核心代碼

#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
#define N 20

int n;
long double a, b, e, T[N][N] = {{0.0}};

long double f(long double x) { return 1.0 / (1.0 + x); }
long double x(int i, long double h) { return a + h * i; }

int main() {
    scanf("%llf%llf%llf%d", &a, &b, &e, &n);
    int k = 0;
    for (; k < n; k++) {
        long double h = (b - a) / pow(2, k), sum = 0.0;
        for (int i = 1; i <= pow(2, k) - 1; i++) sum += f(x(i, h));
        T[k][0] = 0.5 * h * (f(a) + 2 * sum + f(b));
        for (int m = 1; m <= k; m++)
            T[k][m] =
                (pow(4, m) * T[k][m - 1] - T[k - 1][m - 1]) / (pow(4, m) - 1);
        for (int m = 0; m <= k; m++) printf("%.7Lf\t", T[k][m]);
        cout << endl;
        if (k > 0 && fabs(T[k][0] - T[k][k]) <= e) break;
    }
    return 0;
}

詳細報告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章