欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-07 09:50:15
...

数值分析C++实现Romberg积分算法
算法描述
其算法的伪代码为:数值分析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;
}

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

相关标签: 数值分析

上一篇: Linux常用指令

下一篇: java8的optional