[数值算法]积分算法之Simpson算法

[数值算法]积分算法之Simpson算法

       Simpson算法来源于Newton-Cotes公式,是一种插值型求积算法.在高阶时数值的稳定性较差,故常用的是比较低较的几种情况.

       算法的具体实现还是相当简单的:(在这里列举三阶和四阶的情况)

       /*Simpson Algorithm

                            Made by EmilMatthew 05/8/12

*/

Type2 simpson3(Type2 buttom,Type2 up,Type2 (*arguF)(Type2))

{

       Type2 x;/*The node answer,should be print out*/

       Type2 ans;/*The ans*/

       int iteratorNum=0;

       int iterLimit=4;

       int k;/*The argu of iter num*/

       int sList[]={1,3,3,1};

 

       assertF(arguF!=NULL,"in simpson3 arguF is NULL");

      

       /*init the data*/

              x=0;

              ans=0;

              k=0;

       /*Core Program*/

       while(iteratorNum<iterLimit)

       {

              x=buttom+k*(up-buttom)/3;

              ans+=sList[k]*(*arguF)(x);         

              k++;

              iteratorNum++;

       }

       ans*=(up-buttom)/8;

      

       return ans;     

}

 

Type2 simpson4(Type2 buttom,Type2 up,Type2 (*arguF)(Type2))

{

       Type2 x;/*The node answer,should be print out*/

       Type2 ans;/*The ans*/

       int iteratorNum=0;

       int iterLimit=5;

       int k;/*The argu of iter num*/

       int sList[]={7,32,12,32,7};

 

       assertF(arguF!=NULL,"in simpson3 arguF is NULL");

      

       /*init the data*/

              x=0;

              ans=0;

              k=0;

       /*Core Program*/

       while(iteratorNum<iterLimit)

       {

              x=buttom+k*(up-buttom)/4;

              ans+=sList[k]*(*arguF)(x);         

              k++;

              iteratorNum++;

       }

       ans*=(up-buttom)/90;

      

       return ans;     

}

 

/*Test Program*/

#include "MyAssert.h"

#include "Simpson.h"

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

 

#define p1  0.0306

#define miu 0.0075

#define fi  0.0122

Type2 testF1(Type2 x);

 

char *inFileName="inputData.txt";

/*

       input data specification

       a,b, the limitation of the jifen qujian

*/

 

char *outFileName="outputData.txt";

#define DEBUG 1

 

void main(int argc,char* argv[])

{

       FILE *inputFile;/*input file*/

       FILE *outputFile;/*output file*/

 

       double startTime,endTime,tweenTime;/*time callopsed info*/

       float a,b;/*read in limitation of the jifen qu jian*/

       double tmpAns;

       float i;/*iter num*/

 

       /*input file open*/

       if(argc>1)strcpy(inFileName,argv[1]);

       assertF((inputFile=fopen(inFileName,"rb"))!=NULL,"input file error");

       printf("input file open success/n");

      

       /*outpout file open*/

       if(argc>2)strcpy(outFileName,argv[2]);

       assertF((outputFile=fopen(outFileName,"wb"))!=NULL,"output file error");

       printf("output file open success/n");

      

       /*Read info data*/

       fscanf(inputFile,"%f,%f,",&a,&b);

       printf("read in data info:%f,%f./n",a,b);

      

#if  DEBUG

       printf("/n*******start of test program******/n");

       printf("now is runnig,please wait.../n");

       startTime=(double)clock()/(double)CLOCKS_PER_SEC;

       fprintf(outputFile,"[");

       /******************Core program code*************/

                            tmpAns=simpson4(-2,1,&testF1);

                            printf("%f",tmpAns);

                            fprintf(outputFile,"%f ",tmpAns);

       /******************End of Core program**********/

       fprintf(outputFile,"];");

       endTime=(double)clock()/(double)CLOCKS_PER_SEC;

       tweenTime=endTime-startTime;/*Get the time collapsed*/

       /*Time collapsed output*/

       printf("the collapsed time in this algorithm implement is:%f/n",tweenTime);

       fprintf(outputFile,"the collapsed time in this algorithm implement is:%f/r/n",tweenTime); 

       printf("/n*******end of test program******/n");

#endif

 

       printf("program end successfully,/n you have to preess any key to clean the buffer area to output,otherwise,you wiil not get the total answer./n");

       getchar();/*Screen Delay Control*/

       return;

}

 

#define p1  0.0306

#define miu 0.0075

#define fi  0.0122

 

Type2 testF1(Type2 x)

{

       return 3*x-9*x*x;

}

 

在用一些积分函数进行严格测试后,竟发现Float类型在精度计算时根本毫无招架之力.必用用Double.

<The Art of C Numberic Programing>一书的第一章中提到数值的计算精度一直是程序员和科学工作者之间的鸿沟,今天实践后方有感悟.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值