Romberg求积分算法

// Integral-romberg方法求积分.cpp : 定义控制台应用程序的入口点。
//
/*
romberg方法求积分
方法也称为逐次分半加速法。它是在梯形公式,simpson公式和newton-cotes公式之间的关系的基础上,
构造出一种加速计算积分的方法。作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。
在等距基点的情况下,用计算机计算积分值通常都采用吧区间逐次分半的方法进行。
这样,前一次分割得到的函数值在分半以后仍然可以被利用,并且易于编程。
 
运行结果如下:
输入:
0 
3.14159 
输出:Romberg- -12.0703
增加迭代次数或提高精度时,程序运行
得到的结果几乎没有什么变化。可以看到,
和Simpson方法运行的结果基本一致,但
Romberg法速度更快、精度更高
 
 
*/
 
#include "stdafx.h"
 
 
 
#include<iostream>
#include<math.h>
#define epsilon 0.00001
#define COUNT 100
using namespace std;
 
double fun(double x)
{
    return x*x;
}
 
double Romberg(double a,double b)
{
    int m ,n;
    double h,x,s,q,ep;
    double p,*R =new double[COUNT];
         
            h=b-a;
            R[0]= h*(fun(a)+ fun(b))/2.0;
            m=1;
            n=1;
            ep=epsilon+1.0;
            while ((ep >= epsilon)&& (m <COUNT))
            {
                p = 0.0;
            {
                for(int i=0;i<n;i++)
                {
                    x = a+ (i+0.5)*h ;
                    p= p + fun(x);
                }
                    p= (R[0]+ h*p)/2.0;
                    s = 1.0;
                    for(int k=1;k<=m;k++)
                    {
                        s = 4.0*s;
                        q= (s*p-R[k-1])/(s-1.0);
                            R[k-1]= p;
                            p =q;
                    }
                    p=fabs(q -R[m-1]);
                    m =m + 1;
                    R[m-1]= q;
                    n = n + n;
                    h = h/2.0;
                }
                return (q);
            }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    double a,b;
    cout<<"Input a,b:a为下限,b为上限"<<endl;
    cin>>a>>b;
    cout<<"Romberg="<<Romberg(a,b)<<endl;
    system("pause");
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值