(七)计算机数值方法之Romberg求积算法

本文介绍了一个使用C++编写的Romberg算法来求解定积分问题的示例,通过逐次逼近提高精度,适用于解决数学中的积分计算。给出的代码片段展示了如何输入积分范围、精度和函数类型,并给出了预期输出和实际结果。
摘要由CSDN通过智能技术生成

数学问题:

利用Romberg算法求解定积分方程:

\int_{0}^{1}x^{2}\sin \frac{1}{x}dx,eps=10^{-7}

解决代码:

#include<iostream>
#include<cmath>
#include<vector>
#include <math.h>
#include<iomanip>
using  namespace  std;
double  RombergIntegral(double  a, double  b, double eps, int n);
double  f(double  x, int num);
vector < vector < double >>  T; // 用于存储T表

int main()
{
    string laug;
    double a1, b1; double eps; int num;
    cin >> laug;
    cin >> a1 >> b1;
    cin >> eps;
    cin >> num;
    cout << fixed << setprecision(6) << RombergIntegral(a1, b1, eps, num) << endl;
    return   0;

}

double  RombergIntegral(double a, double b, double eps, int n)
{
    int  k(0);
    double  h = b - a;
    vector < double >  temp;
    
    T.push_back(temp);
    T[0].push_back(h * (f(a, n) + f(b, n)) / 2);
    for (k = 1; 1; ++k)
    {
        T.push_back(temp);
        T[0].push_back(0.5 * T[0][k - 1]);
        for (int i = 0; i < pow(2, k - 1); ++i)
        {
            T[0][k] += 0.5 * h * (f(a + h / 2 + i * h, n));
        }
        for (int i = 1; i <= k; ++i)
        {
        T[i].push_back((pow(4, i) * T[i - 1].back() - T[i - 1][k - i]) / (pow(4, i) - 1));
        }
            
        h /= 2;
        double  temp = T[k].back();
        if (fabs(T[k].front() - T[k - 1].front()) < eps)  break;
    }
    cout << k << endl;
    return  T[k].back();

}


double  f(double  x, int num) // 要求的积分函数
{
    if (num == 1)
        return  pow(x, 2) * sin(1 / x);
    if (num == 2)
        return  sin(x);
    if (num == 3)
        return  pow(x, 3) + cos(x * x);
}



使用方法:

第一行是1个字符串,为算法函数名称:RombergIntegral

第二行是2个数字,第一个为积分下限:a,第二个为积分上限:b,a、b中间用一个空格相连(注意:如果下限为0,请改为0.0000001,上限同样)

第三行是1个精度数,为积分精度:eps

第四行是1个数,为被积函数表达式的序号:funNum

测试输入:

RombergIntegral

0.0000001 1

1e-7

1

预期输出:

13

0.286530

问题解决:

计算结果为:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值