数值分析C++实现Romberg积分算法
程序员文章站
2022-06-07 09:50:15
...
算法描述
其算法的伪代码为:
具体的算法:
(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 + hsum1;
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;
}
上一篇: Linux常用指令
下一篇: java8的optional