⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 积分.cpp

📁 插值,常微分方程的初值,非线性方程的跟的求解,拟合,微分,线性方程组的求解,积分的实现
💻 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 + -