变步长的梯形公式计算积分.算法基本分析:输入a,b(积分上下限),n为积分区间等分数,eps为计算精度,我这里1/2e-6,代表0.5乘以10的负6次方.变步长梯形求积算法计算积分,本题目取的例子为数值书131面的例子2,f(x)= sin(x)/x,下面给出代码:
ps:略微更新纠正一下,复合梯形公式和复合simpson公式是不一样的:
复合梯形公式:
复合simpson公式(这个我们数值书131面有算法描述):
我这个就是梯形公式,一张别人写的算法描述:
我写的代码逻辑比较模糊,当时懒得修改:网上有一篇别人写的梯形公式算法逻辑比较清晰,可以看看:http://www.cnblogs.com/quantumplan/archive/2014/03/07/3586429.html
/********************************************
> File Name: Ladder.c
> Author:chendiyang
> School:WUST_CST_1501班
> Myblog:www.chendsir.com
> Mail:[email protected]
> Created Time: 2017年05月5日 星期五 21时19分21秒
************************************************************************/
#include <stdio.h>
#include <math.h>
//本题目取的例子为数值书131面的例子2,f(x)= sin(x)/x
#define m 100 //积分区间等分数,偶数不宜过大
#define a 0.000000001 //分母是0,a计算的时候不能为0,所以我们只能无限接近于0,否则会计算不出值
#define b 1.0 //积分上限
#define eps 0.5e-6 //计算的精度
double f(double x)//我们的积分函数,如果是其他的就在return里面改
{
return sin(x)/x;//值得注意的是以e为底的指数函数如何表示呢,C语言用exp()函数表示
} //比如以e为底的指数函数e的-x*x,则exp(-x*x)表示
int main()
{
int n=m;
int i;
double T,H,T1,T2;
double h=(b-a)/n;//积分步长
T=(f(a)+f(b))/2;
for(i=1;i<n;i++)
T+=f(a+h*i);
T*=h;
T2=T;
T1=T2+100;
do
{
T1=T2;
for(i=0,H=0;i<n;i++)
H+=f(a+h*i+h/2);
H*=h;
T2=(T1+H)/2;
h=h/2;
n=n*2;
}while(fabs(T1-T2)>3*eps);
printf("T=%lf\n",T2);
return 0;
}
运行结果:
结果和书上的是一样的,只不过书上的精确度更高些.