📄 fresnel.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 + -