数值积分 求积法
龙贝格、复化梯形算法
#include<iostream>
using namespace std;
#include<cmath>
//复化梯形公式
float f(float p) {
if (p == 0)
return 1;
return sin(p) / p;
};
//复化梯形公式先给定函数形式,将步长确定后Xk=low+k*h,分别代入计算可得到f(Xk)。代入公式计算即可得到积分值。
float complexledder(float low, float high,float n) {//low,high积分区间 n为等分数量
float x;
float h = (high - low) / n;
float sum;
sum = h * (f(low) + f(high)) / 2;
for (int i = 1; i < n; i++) {
x = low + i * h;
sum += h * f(x);
}
return sum;
}
//test case:
// f(x)=sin(x)/x n=8 0.945691
float Romberg(float low, float high, float n) {
float h = high - low;
float T;
T = (f(low) + f(high)) * h / 2;
float s = 0;
int i = 0;
while (1) {
float result = 0;
for (float j = 0; j < pow(2,i); j++) {
result += f( (j+(float)0.5)*h);
}
T = T / 2 + h * result / 2;
i++;
h = h / 2;
if (i == n + 1)
break;
}
return T;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
复化梯形公式比龙贝格法采样更少,没有做到整个区间均匀采样,会有相比较大的误差,但复化梯形算法更容易实现,减少了一些脑力活动。
龙贝格算法感觉精确度更高,里面的样本点采用了更多,精度更高,步长为1/2^k,采样数足够,在编程的时候遇到很大困难(功底不够),最后好在都能正确实现。

浙公网安备 33010602011771号