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

📄 fresnel.cpp

📁 有VC++数值积分计算矩形衍射屏的菲涅耳衍射图像。
💻 CPP
字号:
//计算单个矩形孔的菲涅耳衍射
#include "math.h"
#include "conio.h"
#include "iostream.h"
#include "fstream.h"
//全局变量
#define	pi 3.1415927
#define lambda	0.0006328
#define A	1.0
#define B	100
#define C	0.0
#define D	1.0
//菲涅耳积分
double Fun_cos(double);
double Fun_sin(double);
double Fun_sinc(double);
//振幅函数
double Fun_ER(double,double,double,double,double,double);
double Fun_EV(double,double,double,double,double,double);
//物面光强
double Fun_E0(double,double);
//坐标变换
double Fun_xi_1(double,double,double);
double Fun_xi_2(double,double,double);
double Fun_eta_1(double,double,double);
double Fun_eta_2(double,double,double);
int main()
{
	double x0,y0,Lx,Ly,lx,ly;
	double ER[200][200];
	double EV[200][200];
	double I;
	int i,j;
	ofstream fout("data.txt");
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++)
		{
			ER[i][j]=0;
			EV[i][j]=0;
		}
	}
//	cout<<"输入中心点(x0,y0),矩形的边长一半(Lx,Ly),观察屏的半边长lx,ly"<<endl;
//	cin>>x0>>y0>>Lx>>Ly>>lx>>ly;
//	cout<<endl;
//	cout<<"你输入的数据是:"<<endl;
//	cout<<"中心点坐标:"<<"("<<x0<<","<<y0<<")"<<endl;
//	cout<<"矩形半边长:"<<"Lx="<<Lx<<",Ly="<<Ly<<endl;
//	cout<<"观察屏的半边长:"<<"lx="<<lx<<","<<"ly="<<ly<<endl;
	lx=10;ly=10;
	x0=0;
	y0=-5;
	Lx=5;
	Ly=0.005;
	while(y0>=-5&&y0<5)
	{
		y0=y0+0.005;
	//	Lx=sqrt(25-y0*y0);
		for(i=0;i<200;i++)
		{
			for(j=0;j<200;j++)
			{
				if((i<2*lx/0.1)&&(j<(2*ly/0.1)))
				{
					double tempR=Fun_ER(x0,y0,Lx,Ly,lx-i*0.1,ly-j*0.1);
					double tempV=Fun_EV(x0,y0,Lx,Ly,lx-i*0.1,ly-j*0.1);
					ER[i][j]=ER[i][j]+tempR;
					EV[i][j]=EV[i][j]+tempV;
					//cout<<I[i][j]<<endl;
				}

			}


		}
		y0=y0+0.005;
	}

	//cout<<Fun_I(x0,y0,Lx,Ly,0,0)<<endl<<Fun_I(x0,y0,Lx,Ly,-5,0)<<endl<<Fun_I(x0,y0,Lx,Ly,5,0)<<endl;
	if(!fout)
	{
		cout<<"Can't open out put file\n";
		return 1;
	}
	
	for(i=0;i<200;i++)
	{
		for(j=0;j<200;j++)
		{
			if((i<2*lx/0.1)&&(j<(2*ly/0.1)))
			{
				I=ER[i][j]*ER[i][j]+EV[i][j]*EV[i][j];

				fout<<I<<" ";
			}

		}
		fout<<endl;
		
	}

	fout.close();
	return 0;
}


//-------------------------------------------------------------------------------------
//计算像场的振幅函数
//输入变量为:
//矩形物象的中心点(x_0,y_0)
//矩形边长的一半L_x,L_y
//像点的坐标(x,y)
//输出变量为像点的振幅实部
double Fun_ER(double x_0,double y_0,double L_x,double L_y,double x,double y)
{
	double E_R,C1,C2,S1,S2;
	C1=Fun_cos(Fun_xi_2(x_0,L_x,x))-Fun_cos(Fun_xi_1(x_0,L_x,x));
	S2=Fun_sin(Fun_eta_2(y_0,L_y,y))-Fun_sin(Fun_eta_1(y_0,L_y,y));
	C2=Fun_cos(Fun_eta_2(y_0,L_y,y))-Fun_cos(Fun_eta_1(y_0,L_y,y));
	S1=Fun_sin(Fun_xi_2(x_0,L_x,x))-Fun_sin(Fun_xi_1(x_0,L_x,x));
	E_R=C1*C2-S1*S2;
	return E_R;
}
//输入变量为:
//矩形物象的中心点(x_0,y_0)
//矩形边长的一半L_x,L_y
//像点的坐标(x,y)
//输出变量为像点的振幅虚部
double Fun_EV(double x_0,double y_0,double L_x,double L_y,double x,double y)
{
	double E_V;
	double C1,C2,S1,S2;
	C1=Fun_cos(Fun_xi_2(x_0,L_x,x))-Fun_cos(Fun_xi_1(x_0,L_x,x));
	S2=Fun_sin(Fun_eta_2(y_0,L_y,y))-Fun_sin(Fun_eta_1(y_0,L_y,y));
	C2=Fun_cos(Fun_eta_2(y_0,L_y,y))-Fun_cos(Fun_eta_1(y_0,L_y,y));
	S1=Fun_sin(Fun_xi_2(x_0,L_x,x))-Fun_sin(Fun_xi_1(x_0,L_x,x));
	E_V=C1*S2+S1*C2;
	return E_V;
}
//-------------------------------------------------------------------------
//计算坐标为像点坐标是的输入面的复振幅U0(x/A,y/A)
//输入变量像点坐标(x,y)
//输出变量为输入面在该点的复振幅
//--------------------------------------------------------------
//计算正弦菲涅耳函数积分
double Fun_sin(double x)
{
	double return_sin;
	double mx;
	mx=fabs(x);
	if(mx<=sqrt(2))
	{
		return_sin=mx*sin(0.5567*exp(-(1.5545*mx-1.9941)*(1.5545*mx-1.9941)));
	}
	else
	{
		return_sin=0.5-(1-0.049*exp(-2*(mx-sqrt(2))))*cos(pi/2*mx*mx)/(pi*mx);
	}

	if(x<0)
	{
		return -return_sin;
	}
	else
	{
		return return_sin;
	}

}
//-----------------------------------------------------------------
//计算余弦菲涅耳函数积分
double Fun_cos(double x)
{
	double return_cos;
	double mx;
	mx=fabs(x);
	if(mx<=1)
	{
		return_cos=mx*cos(0.6855*mx*mx);
	}
	else
	{
		return_cos=0.5+(1-0.121*exp(-2*(mx-1)))/(pi*mx)*sin(pi/2*mx*mx);
	}
	if(x<0)
	{
		return -return_cos;
	}
	else
	{
		return return_cos;

	}
}
//----------------------------------------------------------------------
//计算sinc函数积分
double Fun_sinc(double x)
{
	double return_sinc;
	double mx;
	mx=fabs(x);


	if(mx<1)
	{
		return_sinc=(1-cos(pi*mx))/(3.39-3.39*pow(mx-1,1.6));
	}
	else
	{
		return_sinc=0.5+(1-0.1103*exp(-(mx-1)))/(pi*pi*mx)*cos(pi*(mx-1));
	}


	if(x<0)
	{
		return -return_sinc;
	}
	else
	{
		return return_sinc;
	}
}
//------------------------------------------------------------------------
//坐标变换
double Fun_xi_1(double x_0,double L_x,double x)
{
	return sqrt(2.0/fabs(lambda*B*A))*(A*(x_0-L_x)-x);
}
double Fun_xi_2(double x_0,double L_x,double x)
{
	return sqrt(2/fabs(lambda*B*A))*(A*(x_0+L_x)-x);
}
double Fun_eta_1(double y_0,double L_y,double y)
{
	return sqrt(2/fabs(lambda*B*A))*(A*(y_0-L_y)-y);
}
double Fun_eta_2(double y_0,double L_y,double y)
{
	return sqrt(2/fabs(lambda*B*A))*(A*(y_0+L_y)-y);
}

⌨️ 快捷键说明

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