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

📄 sy_3.cpp

📁 课程设计
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include <iomanip.h>

double e=0.00000005;

double f1(double x)
{
	return (-2)/(x*x-1);	
}

double f2(double x)
{
	return 4/(x*x+1);	
}

double f3(double x)
{
	return pow(3,x);	
}

double f4(double x)
{
	return x*exp(x);	
}

void Tixing(int a,int b,double M,double (*f)(double x))
{
	double w,s;
	w=fabs((-1)*(b-a)*(b-a)*(b-a)*M/12/e);
	s=sqrt(w);
	int n;
	n=int(ceil(s))+1;
	double *x=new double[n+1];
	double h=double(b-a)/n;
	x[0]=a;x[n]=b;
	for(int i=1;i<n;i++)
	{
		x[i]=x[i-1]+h;
		
	}
	double *y=new double[n+1];
	for(int j=0;j<n+1;j++)
	{
		y[j]=f(x[j]);
		
	}
	
	double T=h/2*(y[0]+y[n]);
	for(i=1;i<n;i++)
	{
		T=T+h*y[i];

	}
	
	cout<<"   "<<"用复化梯形公式求得:"<<"T="<<setprecision(10)<<T<<endl;
	delete[]x;
	delete[]y;
}

void Simpson(int a,int b,double M,double (*f)(double x))
{
	double w,s;
	w=sqrt(fabs((-1)*(b-a)*(b-a)*(b-a)*(b-a)*(b-a)*M/180/16/e));
	s=sqrt(w);
	int n,m;
	n=int(ceil(s)+1);
	m=2*n;
	//cout<<n<<endl;
	double h=double(b-a)/n;
	double *x=new double[m+1];
	x[0]=a;x[m]=b;
	for(int i=1;i<m;i++)
	{
		x[i]=x[i-1]+h/2;
		//cout<<x[i]<<"\t";
	}
	double *y=new double[m+1];
	for(int j=0;j<m+1;j++)
	{
		y[j]=f(x[j]);
		//cout<<y[j]<<"\t";
	}
	double S=h/6*(y[0]+y[m]);
	for(i=1;i<m;i++)
	{
		if(i%2==1)
			S=S+4*h/6*y[i];
		else
			S=S+2*h/6*y[i];
		//cout<<S<<"\t";
	}
	cout<<"   "<<"用复化Simpson公式求得:"<<"S="<<setprecision(10)<<S<<endl;
	delete[]x;
	delete[]y;
}

void Romberg(int a,int b,double (*f)(double x))
{
	int n=1;
	double T[10];
	T[0]=(b-a)*(f(a)+f(b))/2;
	for (int i=1;i<10;i++)
	{
		double h=(b-a)/pow(2,i);
		T[i]=h*(f(a)+f(b))/2;
		for (int j=1;j<pow(2,i);j++)
		{
			T[i]+=h*f(a+h*j);
		}

	}

	double S[9];
	S[0]=4*T[1]/3-T[0]/3;
	for (i=1;i<9;i++)
	{
		S[i]=4*T[i+1]/3-T[i]/3;
	}
	
	double C[8];
	C[0]=16*S[1]/15-S[0]/15;
	for (i=1;i<8;i++)
	{
		C[i]=16*S[i+1]/15-S[i]/15;
	}
	double R[7];
	R[0]=64*C[1]/63-C[0]/63;
	for (i=1;i<7;i++)
	{
		R[i]=64*C[i+1]/63-C[i]/63;
		if (fabs(R[i]-R[i-1])<e)
			break;
	}
	cout<<"   "<<"用Romberg公式求得"<<"R="<<setprecision(10)<<R[i]<<endl;
}

void main()
{
	cout<<"相对误差限为1*10^(-7)/2,分别用复化梯形公式、复化Simpson公式、Romberg公式计算:"<<endl;
	cout<<endl;
	cout<<"用三种方法解(-2)/(x*x-1)从2到3的积分:(即求ln(2/3),精确解为-0.405465108)"<<endl;
	Tixing(2,3,1,f1);
	Simpson(2,3,5,f1);
	Romberg(2,3,f1);
	cout<<endl;
	cout<<"用三种方法解4/(x*x+1)从0到1的积分:(即求圆周率π,精确解为3.141592654)"<<endl;
	Tixing(0,1,5,f2);
	Simpson(0,1,1,f2);
	Romberg(0,1,f2);
	cout<<endl;
	cout<<"用三种方法解3的x次方从0到1的积分:(即求2/ln3,精确解为1.820478453)"<<endl;
	Tixing(0,1,2.5,f3);
	Simpson(0,1,2,f3);
	Romberg(0,1,f3);
	cout<<endl;
	cout<<"用三种方法解x乘e的x次方从1到2的积分:(即求e的平方,精确解为7.389056099)"<<endl;
	Tixing(1,2,18,f4);
	Simpson(1,2,20,f4);
	Romberg(1,2,f4);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -