用c++求定积分的近似值 功能需求: 1)输入区间的左右端点2)采用矩形法、抛物线法分别求出自定义函数的定积

2025-03-09 20:58:42
推荐回答(1个)
回答1:

正好前几天帮另一位朋友写过
#include

using namespace std;

class MatJF
{
public:
MatJF();
int choice();
//friend double funtion1(double x);
double def_integral(double (*p)( double x ));
double Simpson(double(*fun)(double));

private:
double a,b; //a、b分别为积分区间的上下限
int n ; //n为要输入的等份 即 区间分成的份数
int flag;

};

int MatJF::choice()
{
int rtnflg = 0;
cout << "选择积分方式:1、矩阵法, 2、抛物线法" << endl;
cin >> rtnflg;

return rtnflg;
}

double MatJF::Simpson(double(*fun)(double))
{// 抛物线法求定积分
double k,simp,s1,s2=0.0;
double h=(b-a)/n;
s1=fun(b+h/2);
for(k=1;k<=n-1;k++)
{
s1+=fun(a+k*h+h/2);
s2+=fun(a+k*h);
}
simp=h/6*(fun(a)+4*s1+2*s2+fun(b));

return simp;
}
//******求第一个公式的积分值******

double funtion1(double x)
{
double fx ;
fx = x * x - 5 * x + 1;

return fx ;
}

MatJF::MatJF()
{
cout << "请输入区间的等分数" << endl;
cin >> n;

cout << "请输入积分区间的上下限(中间用空格隔开)" << endl;
cin >> a >> b;
}

// 调用函数求通用积分公式
double MatJF::def_integral(double (*p)( double x ))
{
double y1,y2 ; //积分区间a、b对应的函数值
double per_len ,height ;
double area , fx = 0.0 ;
int i ;

per_len = ( b - a ) / n ; //等分成n分

y1 = (*p)( a ) ;

for( i = 1 ; i <= n ; i++ )
{
b = a + per_len ; //单位区间长度
y2 = (*p)(b) ;
height = (y1 + y2 ) / 2.0 ; //高
area = per_len * height ; //每一等份长度对应的面积
a = b ; //下限右移
y1 = y2 ; //右移
fx = fx + area ; //面积之和为积分的值
}

return fx;

}

//*****主函数**************

int main(void)
{
MatJF mstjf = MatJF();
double resJiFen = 0.0;
if (mstjf.choice() == 1)
{
resJiFen = mstjf.def_integral(funtion1);
}
else
{
resJiFen = mstjf.Simpson(funtion1);
}

cout << "积分值为:" << resJiFen << endl;

return 0;
}

关于函数f(x)你在function1里面随便更改就好了