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

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


运行结果:


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


猜你喜欢

转载自blog.csdn.net/Chen_dSir/article/details/71257631