计算方法实验(二):龙贝格积分法

Romberg积分法数学原理

利用复化梯形求积公式、复化辛普生求积公式、复化柯特斯求积公式的误差估计式计算积分 ∫ a b f ( x ) d x \int_{a}^{b}{f(x)dx} abf(x)dx。记 h = b − a n h = \frac{b - a}{n} h=nba x k = a + k ⋅ h x_{k} = a + k \cdot h xk=a+kh k = 0 , 1 , ⋯   , n k = 0,1,\cdots,n k=0,1,,n,其计算公式:

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

T 2 n = 1 2 T n + 1 2 h ∑ k = 1 n f ( x k − 1 2 h ) T_{2n} = \frac{1}{2}T_{n} + \frac{1}{2}h\sum_{k = 1}^{n}{f(x_{k} - \frac{1}{2}h}) T2n=21Tn+21hk=1nf(xk21h)

S n = 1 3 ( 4 T 2 n − T n ) S_{n} = \frac{1}{3}(4T_{2n} - T_{n}) Sn=31(4T2nTn)

C n = 1 15 ( 16 S 2 n − S n ) C_{n} = \frac{1}{15}(16S_{2n} - S_{n}) Cn=151(16S2nSn)

R n = 1 63 ( 64 C 2 n − C n ) R_{n} = \frac{1}{63}(64C_{2n} - C_{n}) Rn=631(64C2nCn)

一般地,利用龙贝格算法计算积分,要输出所谓的 T − T - T数表

T 1 T 2 S 1 T 4 S 2 C 1 T 8 ⋮ S 4 ⋮ C 2 ⋮ R 1 ⋮ ⋱ \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} T1T2T4T8S1S2S4C1C2R1

核心代码

#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;
}

详细报告

  • 9
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用龙贝格积分法计算积分的 Python 代码示例: ```python def f(x): # 定义被积函数 return x**2 + 2*x + 1 def adaptive_quad(func, a, b, tol=1e-5): # 定义递归函数 c = (a + b) / 2 h = b - a fa, fb, fc = func(a), func(b), func(c) S1 = h / 6 * (fa + 4 * fc + fb) c1 = (a + c) / 2 c2 = (c + b) / 2 fd, fe = func(c1), func(c2) S2 = h / 12 * (fa + 4 * fd + 2 * fc + 4 * fe + fb) if abs(S2 - S1) < 15 * tol: return S2 + (S2 - S1) / 15 else: return adaptive_quad(func, a, c, tol / 2) + adaptive_quad(func, c, b, tol / 2) a, b = 0, 1 # 积分区间 print(adaptive_quad(f, a, b)) # 输出积分结果 ``` 在这个代码示例中,我们首先定义了被积函数 `f(x)`。然后,我们定义了一个递归函数 `adaptive_quad(func, a, b, tol)`,它使用龙贝格积分法计算积分。 在递归函数中,我们首先计算出积分区间的中点 `c` 和区间长度 `h`,然后计算出在区间两端和中点处的函数值 `fa`、`fb` 和 `fc`。接下来,我们使用这些函数值来计算一个三阶近似积分 `S1`。 然后,我们计算出在区间四分点处的函数值 `fd` 和 `fe`,并使用这些函数值来计算一个五阶近似积分 `S2`。 最后,我们检查五阶近似积分和三阶近似积分之间的差别是否小于误差容限 `tol` 的 15 倍。如果是,我们返回五阶近似积分加上一个微小的修正;否则,我们递归地计算积分区间的左半部分和右半部分,将误差容限减半,并将左半部分和右半部分的积分结果相加。 最后,我们在主程序中定义积分区间 `a` 和 `b`,并使用递归函数 `adaptive_quad()` 计算积分,并输出积分结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值