MATLAB计算光的折射(二)

2023-11-11 02:30
文章标签 matlab 计算 折射

本文主要是介绍MATLAB计算光的折射(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

计算不同角度的能流反射率和能流透射率、相位变化。

从光疏到光密:

clear;
close all;n1 = 1;   %空气折射率
n2 = 1.45;%平板玻璃折射率
theta = 0:0.1:90;%角度从0到90
a = theta*pi/180;%角度转化为弧度
rp = (n2*cos(a)-n1*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
tp = (2*n1*cos(a))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
rs = (n1*cos(a)-n2*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));
ts = (2*n1*cos(a))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));Rp = abs(rp).^2;
Rs = abs(rs).^2;
Rn = (Rp+Rs)/2;Tp = n2*sqrt(1-(n1/n2)^2*(sin(a)).^2)./(n1*cos(a)).*abs(tp).^2;
Ts = n2*sqrt(1-(n1/n2)^2*(sin(a)).^2)./(n1*cos(a)).*abs(ts).^2;
Tn = (Tp+Ts)/2;subplot(1,2,1);
plot(theta,Rp,'-',theta,Rs,'-.',theta,Rn,'--','linewidth',2);
legend('R_p','R_s','R_n');
xlabel('\theta_i');
ylabel('Amplitude');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 0 1]);
grid on;subplot(1,2,2);
plot(theta,Tp,'-',theta,Ts,'-.',theta,Tn,'--','linewidth',2);
legend('T_p','T_s','T_n');
xlabel('\theta_i');
ylabel('Amplitude');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 0 1]);
grid on;

结果:

 

可以看出:
1、当入射角等于0时,能流反射率和能流透射率都不为0;
2、当入射角等于90时,能流反射率为1,能流透射率为0;
3、存在一个特殊角度(布鲁斯特角),使得Rp(p偏振的能流反射率为0),Tp等于1;
4、随着角度不断增大,Rn不断增大,Tn不断减少,但两者的和始终为1;

反过来从光密到光疏也是这样计算:

%从光密到光疏clear;
close all;n1 = 1.45;   %空气折射率
n2 = 1;%平板玻璃折射率
theta = 0:0.1:90;%角度从0到90
a = theta*pi/180;%角度转化为弧度
rp = (n2*cos(a)-n1*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
tp = (2*n1*cos(a))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
rs = (n1*cos(a)-n2*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));
ts = (2*n1*cos(a))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));Rp = abs(rp).^2;
Rs = abs(rs).^2;
Rn = (Rp+Rs)/2;Tp = n2*sqrt(1-(n1/n2)^2*(sin(a)).^2)./(n1*cos(a)).*abs(tp).^2;
Ts = n2*sqrt(1-(n1/n2)^2*(sin(a)).^2)./(n1*cos(a)).*abs(ts).^2;
Tn = (Tp+Ts)/2;subplot(1,2,1);
plot(theta,Rp,'-',theta,Rs,'-.',theta,Rn,'--','linewidth',2);
legend('R_p','R_s','R_n');
xlabel('\theta_i');
ylabel('Amplitude');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 0 1]);
grid on;subplot(1,2,2);
plot(theta,Tp,'-',theta,Ts,'-.',theta,Tn,'--','linewidth',2);
legend('T_p','T_s','T_n');
xlabel('\theta_i');
ylabel('Amplitude');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 0 1]);
grid on;

结果:

可以看出,此时的布鲁斯特角比较明显,且超过全反射角后,反射能流密度为1,投射能流密度为0;

为了进一步了解在全反射中的物理规律,我们绘制反射和投射率的相位变化图形:

clear;
close all;n2 = 1;   %空气折射率
n1 = 1.45;%平板玻璃折射率
theta = 0:0.1:90;%角度从0到90
a = theta*pi/180;%角度转化为弧度
rp = (n2*cos(a)-n1*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
tp = (2*n1*cos(a))./(n2*cos(a)+n1*sqrt(1-(n1/n2)^2*(sin(a)).^2));
rs = (n1*cos(a)-n2*sqrt(1-(n1/n2)^2*(sin(a)).^2))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));
ts = (2*n1*cos(a))./(n1*cos(a)+n2*sqrt(1-(n1/n2)^2*(sin(a)).^2));arp=angle(rp);
ars=angle(rs);
atp=angle(tp);
ats=angle(ts);figure(1);
subplot(1,2,1);
plot(theta,arp,'-',theta,ars,'--','linewidth',2);
legend('arg(r_p)','arg(r_s)');
xlabel('\theta_i');
ylabel('\phi');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 -3.5 3.5]);
grid on;subplot(1,2,2);
plot(theta,atp,'-',theta,ats,'--','linewidth',2);
legend('arg(t_p)','arg(t_s)');
xlabel('\theta_i');
ylabel('\phi');
title(['n_1=',num2str(n1),',n_2=',num2str(n2)]);
axis([0 90 -3.5 3.5]);
grid on;

结果:

 

其实从之前振幅透射率的变化图可以看出(大于0时相位相同,小于0时相差π相位)
但是这里需要注意的是,当入射角大于全反射角后,相位没有立刻突变,而是按照一定的趋势逐渐趋于某个值。
tp、ts逐渐趋近于-π/2
rp、rs逐渐趋近于-π
其他的变化率在小于全反射角是相位变化都为0,但是rp的相位相差π
半波损失:波从波疏介质射向波密介质时反射过程中,反射波在离开反射点时的振动方向相对于入射波到达入射点时的振动相反,或者说,反射波相对于入射波相位突变π,这种现象叫做半波损失
倏逝波:沿着z轴方向(入射面和界面的交线方向)传播,在x方向(垂直界线向光密介质内运动的方向)指数衰减的波。
穿透深度很小,仅有波长量级。
可能在z轴方向发生古斯汉欣位移,也是在波长量级。要求入射光束宽度很小。

来源《高等光学仿真——光波导、激光》

这篇关于MATLAB计算光的折射(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/386917

相关文章

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

uva 1342 欧拉定理(计算几何模板)

题意: 给几个点,把这几个点用直线连起来,求这些直线把平面分成了几个。 解析: 欧拉定理: 顶点数 + 面数 - 边数= 2。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

XTU 1237 计算几何

题面: Magic Triangle Problem Description: Huangriq is a respectful acmer in ACM team of XTU because he brought the best place in regional contest in history of XTU. Huangriq works in a big compa

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

计算数组的斜率,偏移,R2

模拟Excel中的R2的计算。         public bool fnCheckRear_R2(List<double[]> lRear, int iMinRear, int iMaxRear, ref double dR2)         {             bool bResult = true;             int n = 0;             dou

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };