用matlab模拟光在折射率不匹配的介质中传播时的光强轴向变化图
时间: 2023-12-14 20:36:20 浏览: 257
在Matlab中模拟光在折射率不匹配的介质中传播时的光强轴向变化图,可以使用Fresnel公式计算光线的反射和折射,然后通过计算光强度的衰减来模拟光在介质中传播时的强度变化。
以下是一个简单的Matlab代码示例,演示了光线从空气进入折射率为1.5的玻璃中的情况。您可以根据需要修改折射率和光线的起点和方向:
```matlab
% 定义折射率
n1 = 1.0; % 空气
n2 = 1.5; % 玻璃
% 定义入射光线的起点和方向
p0 = [0, 0];
d0 = [1, 0];
% 定义玻璃的边界
xmin = -1;
xmax = 1;
ymin = -1;
ymax = 1;
% 定义步进距离
step = 0.01;
% 初始化光线的位置和方向
p = p0;
d = d0;
% 初始化光线的强度
intensity = 1;
% 计算光线在介质中传播的轨迹和强度变化
while (p(1) >= xmin && p(1) <= xmax && p(2) >= ymin && p(2) <= ymax)
% 计算光线与边界的交点
[p, d] = intersect_boundary(p, d, xmin, xmax, ymin, ymax);
% 计算光线在当前位置的折射和反射
[d_reflect, d_refract, intensity_reflect, intensity_refract] = fresnel(p, d, n1, n2);
% 更新光线的方向和强度
d = d_refract;
intensity = intensity * intensity_refract;
% 在当前位置绘制光线的强度
plot(p(1), p(2), 'o', 'MarkerSize', intensity*20, 'MarkerFaceColor', 'b', 'MarkerEdgeColor', 'none');
% 更新光线的位置
p = p + d * step;
end
% 定义函数:计算光线与边界的交点
function [p, d] = intersect_boundary(p, d, xmin, xmax, ymin, ymax)
if (d(1) > 0)
t_x = (xmax - p(1)) / d(1);
elseif (d(1) < 0)
t_x = (xmin - p(1)) / d(1);
else
t_x = Inf;
end
if (d(2) > 0)
t_y = (ymax - p(2)) / d(2);
elseif (d(2) < 0)
t_y = (ymin - p(2)) / d(2);
else
t_y = Inf;
end
if (t_x < t_y)
p = p + d * t_x;
d = [-d(1), d(2)];
else
p = p + d * t_y;
d = [d(1), -d(2)];
end
end
% 定义函数:计算光线在当前位置的折射和反射
function [d_reflect, d_refract, intensity_reflect, intensity_refract] = fresnel(p, d, n1, n2)
% 计算入射角和折射角
cos_theta1 = -d(2);
sin_theta1 = d(1);
sin_theta2 = n1/n2*sin_theta1;
if (sin_theta2 > 1)
sin_theta2 = 1;
end
cos_theta2 = sqrt(1 - sin_theta2^2);
% 计算反射和折射的方向
d_reflect = [d(1)*cos_theta1 + d(2)*sin_theta1, -d(1)*sin_theta1 + d(2)*cos_theta1];
d_refract = [d(1)*cos_theta2 - d(2)*sin_theta2, d(1)*sin_theta2 + d(2)*cos_theta2];
% 计算反射和折射的强度
intensity_reflect = 0.04 + 0.96*(1 - cos_theta1)^5;
intensity_refract = 1 - intensity_reflect;
end
```
该代码将在坐标轴范围内绘制光线的轨迹,并使用光线的强度来调整光线的大小。您可以根据需要修改代码来适应不同的介质和光源设置。
阅读全文