C++实现简单积分计算,关于辛普森有点问题…
辛普森那个类的算法我这样写有点问题,但是我说不出来哪里错了…
得出的结果是:
1.00783
0.999978
0.968591
请按任意键继续. . .
希望帮忙看看~
#include <iostream>
#include <cmath>
using namespace std;
class Base
{
protected:
double result, a, b, step;//result积分值,a积分下限,b积分上限,step步长即公式中,step=(b-a)/n
int n;//分区数即公式中的n
public:
virtual double fun(double x) = 0;//被积函数,声明为纯虚函数,由子类引入
virtual void integrate(){}
Base(double aa=0, double bb=0, int nn=100):a(aa),b(bb),n(nn),result(0.0){}
void print()
{
cout<<result<<endl;
}
};
class Rectangle:public Base
{
public:
Rectangle(double aa=0, double bb=0, int nn=100):Base(aa,bb,nn) {}
virtual double fun(double x)
{
return sin(x);
}
virtual void integrate()
{
step=(b-a)/(double)n;
for(double i=a;i<=b;i=i+step)
{
result=result+fun(i);
}
result=result*step;
}
};
class Ladder:public Base
{
public:
Ladder(double aa=0, double bb=0, int nn=100):Base(aa,bb,nn) {}
virtual double fun(double x)
{
return sin(x);
}
virtual void integrate()
{
step=(b-a)/(double)n;
double temp=0.0;
for(double i=a+step;i<=b-step;i=i+step)
{
temp=temp+2*fun(i);
}
result=(fun(a)+temp+fun(b))*step/2.0;
}
};
class Simpson:public Base
{
public:
Simpson(double aa=0, double bb=0, int nn=100):Base(aa,bb,nn) {}
virtual double fun(double x)
{
return sin(x);
}
virtual void integrate()
{
step=(b-a)/(double)n;
double odd_temp=0.0;
double even_temp=0.0;
for(double i=a+step;i<=b-step;i=i+2*step)
{
odd_temp=odd_temp+4*fun(i);
}
for(double i=a+2*step;i<=b-2*step;i=i+2*step)
{
even_temp=even_temp+2*fun(i);
}
result=(fun(a)+fun(b)+odd_temp+even_temp)*step/3.0;
}
};
测试代码如下
输出是:
1.00783
0.999978
0.999999
int main()
{
Base* bp;
bp = new Rectangle(0.0, 3.14159/2.0, 100);
bp-> integrate();
bp->print();
bp = new Ladder(0.0, 3.14159/2.0, 100);
bp-> integrate();
bp->print();
bp = new Simpson(0.0, 3.14159/2.0, 100);
bp-> integrate();
bp->print();
return 0;
}
C++ 类 辛普森
[解决办法]
暂时没看出来,除了 for 里面 double i ,为什么不用整形迭代器,你定义了两个变量,完全可以在同一个循环中完成累加。还有,那些 temp 为什么不加完后再成乘 4 和 2 。
辛普森算法的精髓是 1424241 ,两端 1 ,中间 4 2交替,所以共有 2 + 2n + 1 个点