📄 积分.cpp
字号:
///////////////////////////////////////////////////////////////////////////////////////////////
#include"myhead.h"
//////////////////////////////////////////////////////////////////////////////////////////////
void fun_5()
{
system("cls");//执行系统清屏命令
cout<<" ******************************************************************"<<endl
<<" * 积分 *"<<endl
<<" ******************************************************************"<<endl
<<" * 1、梯形公式: *"<<endl
<<" * 2、辛普生公式: *"<<endl
<<" * 3、牛顿-柯特斯公式: *"<<endl
<<" * 4、复化梯形公式: *"<<endl
<<" * 5、复化辛普生公式: *"<<endl
<<" * 6、复化牛顿-柯特斯公式: *"<<endl
<<" * 7、龙格-库塔公式: *"<<endl
<<" ******************************************************************"<<endl;
cout<<" 请选择一个数字(1-7):";
int ch=0;
cin>>ch;
switch(ch)
{
case 1:t();break;
case 2:x();break;
case 3:nt();break;
case 4:ft();break;
case 5:fx();break;
case 6:fnt();break;
case 7:lk();break;
}
system("pause");
}
////////////////////////////////////////////////////////////////////////////////////////
// 梯形公式的逐次分半法求积函数
double integral(double a, double b,double(*f)(double),double eps)
{
double n=1;
double h=(b-a)/2;
double Tn=h*(f(a)+f(b));
double T2n=0;
while(true)
{
double sumf=0;
for(int i=1;i<=n;++i)
{
sumf+=f(a+(2*i-1)*h);
}
T2n=Tn/2+h*sumf;
if(fabs(T2n-Tn)<3*eps)break;
Tn=T2n;
n*=2;
h/=2;
}
return T2n;
}
double func(double x)// 自定义的被积函数,只要满足下面的形式的函数就可以了:)
{
return (sqrt(1/PI)*exp(x/(-3)));//在这里修改你的被积函数
}
////////////////////////////////////////////////////////////////////
void t()
{
double a,b,eps;//输入的参数保存在此
printf(" 积分公式为:(sqrt(1/pi)*exp(x/(-3)))\n");
printf(" 请分别输入积分下界,积分上界和误差:");
scanf("%lf%lf%lf",&a,&b,&eps);//输入参数
printf(" 积分下界=%f,积分上界=%f,误差=%f\n",a,b,eps);//显示输入的数据
printf(" %s%f%s%f%s%.8f\n","sqrt(x)在[",a,",",b,"]的积分值为:",integral(a,b,func,eps));
}
////////////////////////////////////////////////////////////////////////////////////////////////
double f5(double x)
{
return (sqrt(1/PI)*exp(x/(-3)));
}
///////////////////////////////////////////////////////////////////////////////////////////////
double ff5(double x)
{
return ((sqrt(1/PI)*exp(x/(-3)))*(-3));
}
////////////////////////////////////////////////////////////////////////////////////////////////
void x( )
{
double a,b,y,yab;
cout<<" 积分公式为:sqrt(1/pi)*exp(x/(-3))"<<endl;
cout<<" 请输入积分的上限和下限:";
cin>>a>>b;
y=((b-a)*(f5(a)+4*f5((a+b)/2)+f5(b)))/6;
yab=ff5(b)-ff5(a);
cout<<setiosflags(ios::fixed)<<setprecision(5);
cout<<" 用辛卜生公式解的值为:"<<y<<endl;
cout<<" 准确解为:"<<yab<<endl;
return;
}
///////////////////////////////////////////////////////////////////////////////////////////
void nt( )
{ double a,b,y,yab;
double x[5];
int k;
cout<<" 积分公式为:sqrt(1/pi)*exp(x/(-3))"<<endl;
cout<<" 请输入积分的上限和下限:";
cin>>a>>b;
for(k=0;k<5;k++)
x[k]=a+((b-a)*k)/4;
y=((b-a)*(7*f5(x[0])+32*f5(x[1])+12*f5(x[2])+32*f5(x[3])+7*f5(b)))/90;
yab=ff5(b)-ff5(a);
cout<<setiosflags(ios::fixed)<<setprecision(8);
cout<<" 用牛顿-柯特斯公式解的值为:"<<y<<endl;
cout<<" 准确解为:"<<yab<<endl;
return;
}
////////////////////////////////////////////////////////////////////////////////////////////
void ft( )
{ double a,b,y[20],yab,h,sum;
int n,i,j;
cout<<" 积分公式为:sqrt(2/pi)*exp(x/(-2))"<<endl;
cout<<" 请输入积分的上限,下限和你要划分的小区间的个数:";
cin>>a>>b>>n;
yab=ff5(b)-ff5(a);
cout<<" 区间数"<<" "<<"步长"<<" "<<"用复化梯形公式解的值为:"<<endl;
for(i=1;i<=n;i++)
{ h=(b-a)/i;
sum=0;
for(j=1;j<=i-1;j++)
sum=sum+f5(a+j*h);
y[i]=(h*(f5(a)+2*sum+f5(b)))/2;
cout<<setiosflags(ios::fixed)<<setprecision(8);
cout<<" "<<i<<" "<<h<<" "<<y[i]<<endl;
}
cout<<setiosflags(ios::fixed)<<setprecision(5);
cout<<" 准确解为:"<<yab<<endl;
return;
}
//////////////////////////////////////////////////////////////////////////////////////////
void fx( )
{
double a,b,y[20],yab,h,sum1,sum2;
int n,i,j;
cout<<" 积分公式为:sqrt(1/pi)*exp(x/(-3))"<<endl;
cout<<" 请输入积分的上限,下限和你要划分的小区间的个数:";
cin>>a>>b>>n;
yab=ff5(b)-ff5(a);
cout<<" 区间数"<<" "<<"步长"<<" "<<"用复化辛卜生公式解的值为:"<<endl;
for(i=1;i<=n;i++)
{
h=(b-a)/i;
sum1=0;
sum2=0;
for(j=1;j<=i-1;j++)
sum1=sum1+f5(a+j*h);
for(j=0;j<=i-1;j++)
sum2=sum2+f5(a+j*h+h/2);
y[i]=(h*(f5(a)+2*sum1+4*sum2+f5(b)))/6;
cout<<setiosflags(ios::fixed)<<setprecision(5);
cout<<" "<<i<<" "<<h<<" "<<y[i]<<endl;
}
cout<<setiosflags(ios::fixed)<<setprecision(5);
cout<<" 准确解为:"<<yab<<endl;
return;
}
/////////////////////////////////////////////////////////////////////////////////////////////
void fnt( )
{ double a,b,y,yab;
double x[5];
int k;
cout<<" 积分公式为:sqrt(1/pi)*exp(x/(-3))"<<endl;
cout<<" 请输入积分的上限和下限:";
cin>>a>>b;
for(k=0;k<5;k++)
x[k]=a+((b-a)*k)/4;
y=((b-a)*(7*f5(x[0])+32*f5(x[1])+12*f5(x[2])+32*f5(x[3])+7*f5(b)))/90;
yab=ff5(b)-ff5(a);
cout<<setiosflags(ios::fixed)<<setprecision(8);
cout<<" 用牛顿-柯特斯公式解的值为:"<<y<<endl;
cout<<" 准确解为:"<<yab<<endl;
return;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void lk()
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -