✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
此代码用于进行物理光学的计算机仿真。
其主要功能为:
(1) 动态模拟电磁波在空间中的传播;
(2) 对菲涅尔公式进行分析(主要是绘制反/透射系数、反/透射率、全反射时的相位跃变随入射角变化而变化的图像);
(3) 对不同种类的材料进行柯西公式拟合,绘制色散曲线图;
⛄ 代码
function Fresnel_1 (n1,n2)
基于Matlab模拟菲涅尔公式%{
此函数用于绘制反射系数(rs,rp)/透射系数(ts,tp)随入射角变化而变化的图像
功能:
输入界面两侧介质折射率来绘制ts、tp、rs、tp随入射角变化的图像;并在相应位置
标注半波损失、布儒斯特角、临界角等关键量
理量:
n1、n2:界面两侧介质折射率
theta:入射角;
theta_B:布儒斯特角;
theta_C:临界角;
rs:s波反射系数;
rp:p波反射系数;
ts:s波透射系数;
tp:p波透射系数;
%}
%% 清理窗口:
close all;
n1=1;
n2=1.5;
%% 初始数据:
theta = 0:0.1:90; % 设置入射角范围0-90度
a = theta*pi/180; % 角度转化为弧度
[~,n] = size(a); %计算矩阵a大小便于循环
%% 反射系数与透射系数公式输入:
% 首先判断光从波疏介质射向波密介质还是从波密介质射向波疏介质:
if n1 < n2
% 若从波疏介质射往波密介质,其反射与透射系数一直为实数:
rs = (n1*cos(a)-n2*sqrt(1-(n1/n2*sin(a)).^2))./(n1*cos(a)+n2*sqrt(1-(n1/ ...
n2*sin(a)).^2)); % s波反射系数
rp = (n2*cos(a)-n1*sqrt(1-(n1/n2*sin(a)).^2))./(n2*cos(a)+n1*sqrt(1-(n1/ ...
n2*sin(a)).^2)); % p波反射系数
ts = 2*n1*cos(a)./(n1*cos(a)+n2*sqrt(1-(n1/n2*sin(a)).^2)); % s波透射系数
tp = 2*n1*cos(a)./(n2*cos(a)+n1*sqrt(1-(n1/n2*sin(a)).^2)); % p波透射系数
else if n1 > n2
% 若从波密介质射往波疏介质,需将其分段:
C = asin(n2/n1); % 计算临界角
theta_C = C*180/pi; % 弧度转化为角度
for i=1:n
if a(i) < C
% 当入射角小于临界角,为实数:
rs(i) = (n1*cos(a(i))-n2*sqrt(1-(n1/n2*sin(a(i))).^2))./(n1*cos(a(i))+n2*sqrt(1-(n1/ ...
n2*sin(a(i))).^2)); % s波反射系数
rp(i) = (n2*cos(a(i))-n1*sqrt(1-(n1/n2*sin(a(i))).^2))./(n2*cos(a(i))+n1*sqrt(1-(n1/ ...
n2*sin(a(i))).^2)); % p波反射系数
ts(i) = 2*n1*cos(a(i))./(n1*cos(a(i))+n2*sqrt(1-(n1/n2*sin(a(i))).^2)); % s波透射系数
tp(i) = 2*n1*cos(a(i))./(n2*cos(a(i))+n1*sqrt(1-(n1/n2*sin(a(i))).^2)); % p波透射系数
else
% 当入射角小于临界角,需计算其模值:
rs(i) = 1;
rp(i) = 1;
ts(i) = 2*n1;
tp(i) = 2*n1;
end
end
end
end
%% 图像绘制:
plot(theta,rs,theta,rp,theta,ts,theta,tp,'Linewidth',1);
axis([0 90 -1 1]); % 设置区间
title(['入射/透射系数随入射角的变化 ; ','n_1 = ',num2str(n1),', n_2 = ',num2str(n2)]);
xlabel('\theta_1');
ylabel('coefficient');
legend('r_s','r_p','t_s','t_p');
%% 布儒斯特角的标注:
B = atan(n2/n1); % 求解布儒斯特角
theta_B = B*180/pi; % 角度转化为弧度
line([theta_B,theta_B],[-1,0],'color','black','LineStyle','--', ...
'Linewidth',0.01,'HandleVisibility','off')
line([0,90],[0,0],'color','black','LineStyle','--','Linewidth',0.01, ...
'HandleVisibility','off') % 绘制两条直线对布儒斯特角的位置定标
text(theta_B,-1,'\theta_B'); % 在x坐标轴上标注布儒斯特角
%% 对半波损失/临界角进行标注:
% 首先判断光从波疏介质射向波密介质还是从波密介质射向波疏介质:
if n1 < n2
% 若从波疏介质射往波密介质,则将发生半波损失,将其标注在[0,0]处
text(0,0,'Half-wave Loss','FontSize',15);
else if n1 > n2
% 若从波密介质射往波疏介质,则将发生全反射现象,下面对其进行标注:
axis([0 90 -1 2*n1]); % 重新选择作图区间
C = asin(n2/n1); % 计算临界角
theta_C = C*180/pi; % 弧度转化为角度
line([0,90],[1,1],'color','black','LineStyle','--','Linewidth', ...
0.01,'HandleVisibility','off') % 绘制两条直线对临界角的位置定标
line([theta_C,theta_C],[-1,2*n1],'color','black','LineStyle', ...
'--','Linewidth',0.01,'HandleVisibility','off')
text(theta_C,-1,'\theta_C'); % 在x坐标轴上标注临界角
line([0,theta_C],[2*n2,2*n2],'color','black','LineStyle','--', ...
'Linewidth',0.01,'HandleVisibility','off') % 定标ts模值
end
end
end
⛄ 运行结果
⛄ 参考文献
[1] 王莉, 杨会静, 段芳芳. 用MATLAB模拟菲涅耳直边衍射[J]. 唐山师范学院学报, 2008, 30(005):131-132.
[2] 王艳. 菲涅耳圆屏衍射的Matlab模拟[J]. 长治学院学报, 2021, 38(5):6.
[3] 仲志国, 李硕, 李婧,等. 基于Matlab的菲涅尔直边衍射仿真与GUI设计[J]. 南阳师范学院学报, 2012, 11(12):3.
⛳️ 代码获取关注我
❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料