数值作业:变步长梯形求积算法计算积分C语言实现

来源:互联网 发布:php中switch case语句 编辑:程序博客网 时间:2024/05/10 10:48

变步长的梯形公式计算积分.算法基本分析:输入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:1441353519@qq.com      > 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;  }  

运行结果:


结果和书上的是一样的,只不过书上的精确度更高些.


0 0
原创粉丝点击