数值分析C++实现Romberg积分算法

在这里插入图片描述
算法描述
其算法的伪代码为:在这里插入图片描述
具体的算法:
(1)定义一个二维数组R[n][n]用于存储每次积分的值
(2)首先计算 R[1][1]=(b-a)*(f(a)+f(b))/2;
(3)从j =2开始遍历做以下步骤,直到j=n停止遍历
3.1计算步长h =(b-a)/2^(j-1),计算R[j][1]=
3.2从i =1开始,每次i自增1直到i = 2^(j-2),计算 f(a+(2i-1)h)的累加和sum1。
3.3 计算R[j][1]=R[j-1][1]/2 + h
sum1;
3.4从k =2开始每次k自增1,遍历重复以下操作:
3.4.1 计算R[j][k] = (4^(k-1) *R[j][k-1]-R[j-1][k-1])/(4^(k-1)-1)
(4)打印输出R[j][k]的积分值
源程序代码及运行结果截图

#include<iostream>
#include<vector>
#include<math.h>
#include<iomanip>
#include<string>
using namespace std;
#define MAX  100
float  R[MAX][MAX];
/*
@to do:  获取自变量x对应的函数值
@param x 
*/
float getRombergFuntion(float x) {
	return log(x);
}
/*
@to do:自定义实现x的y的整数次幂的结果
@param x: x
@param y: y
@return 返回x的y次幂的结果int
*/
int pow(int x,int y)
{
	int result = 1;
	for (int  i = 0; i < y; i++)
	{
		result = result * x;
	}
	return result;
}
/*
@to do:获取荣贝格算法的n行打印数据
@param a:积分下限
@param b:积分上限
@param n:要打印的行数
*/
void getRombergValue(float a,float b,int n) 
{
	//获取初始值
	R[1][1] = (b-a)*(getRombergFuntion(a)+ getRombergFuntion(b))/2;
	//步长h
	float h = 0.0f;
	for (int  i = 2; i <= n; i++)
	{
		//计算当前步长
		h = (b - a) / pow(2,i-1);
		float sum = 0.0f;
		for (int j = 1; j <= pow(2, i- 2);j++) 
		{
			sum += getRombergFuntion(a+(2*j -1)*h)*h;
		}
		R[i][1] = 0.5*R[i - 1][1] + sum;
		for (int  k = 2; k <= i; k++)
		{
			R[i][k] = (pow(4, k - 1)*R[i][k-1]-R[i-1][k-1])/(pow(4,k-1)-1);
		}
	}

	for (int  i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			cout << R[i][j] << " ";
		}
		cout << endl;
	}
}


int main()
{
	//测试数据求lnx在区间[1,2]上的积分,并输出四行lnx积分的数据
	getRombergValue(1,2,4);
	system("pause");
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌意随影

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值