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

📄 重积分_070460.cpp

📁 利用计算机进行二重数值积分
💻 CPP
字号:
#include<math.h>
#include<iostream.h>
#include<iomanip.h>

long double f(long double x,long double y)
{
	return tan(x*x+y*y);
}


int ss(int r)
{
	int ssum=1;
	for(int i=1;i<=r;i++)
     ssum*=2;
	return ssum;
}

double T(int m,int n,long double a,long double b,long double c,long double d)
{
	long double Tsum=0;
	long double h=(b-a)/m;
	long double k=(d-c)/n;
	for(int i=0;i<=n-1;i++)
	{
		for(int j=0;j<=m-1;j++)
		{
		
			Tsum+=0.25*h*k*(f(a+i*h,c+j*k)+f(a+i*h,c+(j+1)*k)+f(a+(i+1)*h,c+j*k)+f(a+(i+1)*h,c+(j+1)*k));
		}
	}
	return Tsum;
	
}

double TT(long double T,int m,int n,long double a,long double b,long double c,long double d)
{
	long double TT1=0.0,TT2=0.0,TT3=0.0,TT4=0.0,TT5=0.0;
	for(int i=0;i<=m-1;i++)
		TT1+=f(a+(i+0.5)*(b-a)/m,c)+f(a+(i+0.5)*(b-a)/m,d);
	for(int j=0;j<=n-1;j++)
		TT2+=f(a,c+(j+0.5)*(d-c)/n)+f(b,c+(j+0.5)*(d-c)/n);
	for(int k1=0;k1<=m-1;k1++)
		for(int k2=1;k2<=n-1;k2++)
			TT3+=f(a+(k1+0.5)*(b-a)/m,c+k2*(d-c)/n);
	for(int l1=1;l1<=m-1;l1++)
		for(int l2=0;l2<=n-1;l2++)
			TT4+=f(a+l1*(b-a)/m,c+(l2+0.5)*(d-c)/n);
	for(int m1=0;m1<=m-1;m1++)
		for(int m2=0;m2<=n-1;m2++)
			TT5+=f(a+(m1+0.5)*(b-a)/m,c+(m2+0.5)*(d-c)/n);
	return 0.25*T+0.125*((b-a)/m)*((d-c)/n)*(TT1+TT2+2*(TT3+TT4+TT5));
}
long double waitui(long double t[20],long double t1[20],long double t2[20],long double t3[20],
				   long double a,long double b,long double c,long double d,int z,int x,int m,int n,double e)
{
	
	long double eps,eps1;
	int r=4;
    while(r<50)
	{
       t[r]=TT(t[r-1],ss(r-1)*m,ss(r-1)*n,a,b,c,d);
	   t1[r-1]=t[r]*4/3-t[r-1]/3;
	   t2[r-2]=t1[r-1]*16.0/15-t1[r-2]/15;
	   t3[r-3]=t2[r-2]*64.0/63-t2[r-3]/63;
	   eps=(t3[r-3]-t3[r-2])/255;
	   eps1=(t2[r-2]-t2[r-1])/63;
	   z=ss(r+1)*m;x=ss(r+1)*n;
	   r++;
	   if(fabs(eps)>e&&fabs(eps1)>e)
	   {
		  cout<<"在区间["<<a<<","<<b<<"],["<<c<<","<<d<<"]分别各等分"<<z<<","<<x<<endl;
		  return t3[r-4];}
	}
}

void main()
{	
    long double a=0.0,b=0.523598775,c=0,d=1.047197551,e,h,k;
	long double t[20],t1[20],t2[20],t3[20];
	int m=1,n=1,z=0,x=0;

    cout<<"输入区间划分初始间隔h,k的值:"<<endl;
	cin>>h>>k;
	cout<<"输入允许误差:"<<endl;
	cin>>e;
	m=(int)((b-a)/h);                                                                                                                                          
	n=(int)((d-c)/k);

	t[0]=T(m,n,a,b,c,d);
	t[1]=TT(t[0],m,n,a,b,c,d);
	t1[0]=t[1]*4.0/3-t[0]/3;
	if((fabs(t[1]-t[0])/3)<e)
	{cout<<"积分结果:"<<setprecision(10)<<t1[0]<<endl;z=ss(2)*m;x=ss(2)*n;
	cout<<"在区间["<<a<<","<<b<<"],["<<c<<","<<d<<"]分别各等分"<<z<<","<<x<<endl;}
	else{
		t[2]=TT(t[1],ss(1)*m,ss(1)*n,a,b,c,d);
		t1[1]=t[2]*4.0/3-t[1]/3;
		t2[0]=t1[1]*16.0/15-t1[0]/15;
		if((fabs(t1[1]-t1[0])/15)<e)
		{cout<<"积分结果:"<<setprecision(10)<<t2[0]<<endl;z=ss(3)*m;x=ss(3)*n;
	    cout<<"在区间["<<a<<","<<b<<"],["<<c<<","<<d<<"]分别各等分"<<z<<","<<x<<endl;}
		else{
		    t[3]=TT(t[2],ss(2)*m,ss(2)*n,a,b,c,d);
			t1[2]=t[3]*4.0/3-t[2]/3;
		    t2[1]=t1[2]*16.0/15-t1[1]/15;
			t3[0]=t2[1]*64.0/63-t2[0]/63;
			if((fabs(t2[1]-t2[0])/63)<e)
			{cout<<"积分结果:"<<setprecision(10)<<t3[0]<<endl;z=ss(4)*m;x=ss(4)*n;
			cout<<"在区间["<<a<<","<<b<<"],["<<c<<","<<d<<"]分别各等分"<<z<<","<<x<<endl;}
			else 
				cout<<"积分结果:"<<setprecision(10)<<waitui(t,t1,t2,t3,a,b,c,d,z,x,m,n,e)<<endl;
		}
	}
	
}
				














⌨️ 快捷键说明

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