/**
  复化Simpson积分  
                                                                  m-1                   m-1
 复化Simpson公式: Tn = (h/3) *  { f(a)/2  +  4 * ∑ f ( x2i  + 2 * ∑ f ( x2i+1 ) +  f(b)/2 )} 
                                                                  i=0                     i=1
 步长: h=b-a/n,  n=2*m

 属性: 数值积分法

《数值计算方法与算法》-2 Editon -科学出版社 P55
   
 代码维护:2007.04.20   pengkuny
**/ 

#include<iostream>
#include
<cmath>

using namespace std;

#define f(x) (sin(x))  //举例函数
#define epsilon 0.00001  //精度

//复化Simpson公式
float Simpson(float aa, float bb, long n)
{//aa,bb:端点  n,分区数
    if (!(n%2)) //保证n为偶数
        n = n+1;
    
long m = n/2;

    
float sum = 0;
    
float h = (bb-aa)/n; //步长

    
float sum1 = 0, sum2 = 0;
    
for (long i=0; i<m; i++)
    
{
        sum1 
+= f(aa + (2*i+1)*h);
    }

    
for (long i=1; i<m; i++)
    
{
        sum2 
+= f(aa + (2*i)*h);
    }


    sum 
= f(aa) + f(bb) + 2*sum2 + 4*sum1;

    
return (h*sum/3);
}



int main()
{
    
float a,b;
    
long n;
    cout
<<"复化Simpson积分,请输入积分范围a,b:"<<endl;
    cin
>>a>>b;
    cout
<<"请输入分割区间数n:"<<endl;
    cin
>>n;

    cout
<<"积分结果:"<<Simpson(a, b, n)<<endl;

    system(
"pause");
    
return 0;
}


 

posted on 2007-04-20 10:55 哈哈 阅读(1498) 评论(3)  编辑 收藏 引用

评论:
# re: 复化Simpson积分 2007-11-26 20:13 | 网友
题目中的精度好像没有用  回复  更多评论
  
# re: 复化Simpson积分 2008-12-28 20:30 |
@网友
i重复初始化了  回复  更多评论
  
# re: 复化Simpson积分 2009-09-05 11:22 | zh
保证n为偶数,书写错误!上面的n变为恒是奇数了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理