数字积分
有些复杂的功能,或者有些简单的功能,但是找不到原始功能。在这种情况下,我们可以使用一些方法来近似积分值。
这里有三个近似的正交公式

这里我们介绍可变步长的复杂梯形算法和Romberg算法
可变步长复杂梯形算法
基本原理是使用梯形公式来计算正交区间中的积分。如果精度不够,我们将间隔长度分成两半,进行更详细的描述,然后重复计算。直到此计算结果与上一次计算的结果之间的差达到精度为止。

可变步长复数梯形公式
double VariableStepSize(double (*f)(double),double a,double b,double e)
{//f为求积函数,a和b为求积区间,e是精确要求
long long i,times=1;//用来记录增加节点的个数
double ans,t,sum;
ans=(f(a)+f(b))*(b-a)/2;//利用梯形公式粗略计算积分
double numerator,denominator=1;
do//至少循环一次
{
t=ans;
// printf("t=%.7lf\n",t);
sum=0;
numerator=1; denominator*=2;
for(i=0;i=0);//满足精度要求以后退出
return ans;
} Romberg算法
Romberg算法利用梯形公式,Simpson公式和Curtes公式之间的关系逐渐提高精度


Romberg算法
double Longberg(double (*f)(double),double a,double b,double e)
{//f为求积函数,a和b为求积区间,e是精确要求
int i,j,k=1;//每次递推都可以推导一行
int times=1;
double sum;
double table[10][10]={0};//递推的二维矩阵,简单地固定位10*10
double coef[10][2]={0};//用来保存系数,比如说4/3,16/15
double LastLeft,LastRight;//记录推导一行中最后两个数,用以判断精度
double numerator,denominator=1;//分子分母
table[0][0]=( f(a)+f(b)*(b-a) )/2; numerator=4;
for(i=1;i<10;i++)
{
coef[i][0]=numerator/(numerator-1);//前一个系数,比如说4/3
coef[i][1]=(-1)/(numerator-1);//后一个系数,比如说-1/3
numerator*=4;
}//End for-i
do
{
sum=0;
numerator=1; denominator*=2;
for(i=0;i=0);//满足精度则退出
return LastRight;
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-370930-1.html
还有心情在对中国说三道四
一分钱没有
智商越来越低