基于matlab实现的光折射反射(不同界面)程序

news2025/2/26 19:13:19

完整程序:

 

%平面电磁波在不同介质界面上入射、反射、折射仿真

%ReadMe!!!在下述说明的用户输入区内输入入射角和两介质折射率,
%输出反射折射示意图与反射折射系数随入射角变化的曲线
%—————————————————————————————————————

%——————————用户输入区起始——————————%
theta1 = 30;                                %请输入入射角(大于0且小于等于90°)
n1 = 1.5;                                     %请输入介质1的折射率
n2 = 1;                                   %请输入介质2的折射率
%——————————用户输入区结束——————————%

flag = 0;                                   %表示仿真状态,0代表正常入射,1代表垂直入射,2代表全反射
format short
if theta1 == 0                              %垂直入射
    flag = 1;
elseif sind(theta1)*n1/n2 >= 1              %满足全反射条件
    flag = 2;
else                                        %其他通常情况的折射反射
    flag = 0;
end

if flag == 0                                %当不满足全反射条件时
    theta2 = asind(sind(theta1)*n1/n2);     %求出折射角theta2
    rs = -sind(theta1-theta2)/sind(theta1 + theta2);                            %s波反射系数
    ts = 2*sind(theta2)*cosd(theta1)/sind(theta1+theta2);                       %s波折射系数
    rp = tand(theta1-theta2)/tand(theta1+theta2);                               %p波反射系数
    tp = 2*sind(theta2)*cosd(theta1)/(sind(theta1+theta2)*cosd(theta1-theta2)); %p波折射系数
elseif flag == 2                            %当满足全反射条件时
    rs=1;rp=1;tp=3;ts=2;    
elseif flag == 1                            %当垂直入射
    theta2 = 0;
    rs=-1;rp=-1;tp=0;ts=0; 
end

figure('NumberTitle', 'off', 'Name', '图一 反射折射示意图');                     %绘制光在两介质表面的反射、折射示意图
r = 5;                                      %绘制时的线长

plot([-3 3],[0 0],'k--','LineWidth',1);     %绘制辅助线
hold on;
plot([0 0],[-2 2],'k--','LineWidth',1);
hold on;

if flag ~= 1                                %判断是否为垂直入射
    x = -sind(theta1)*r:0.1:0;
    y = -x./tand(theta1);
elseif flag == 1
    y = 0:0.1:r;
    x = -0.03*ones(size(y));
end
RuShe = plot(x,y,'r','LineWidth',2);        %绘制入射光线
hold on;
FanShe = plot(-x,y,'g','LineWidth',2);      %绘制反射光线
legend([RuShe FanShe],'入射光','反射光');
x_scale = max(abs(r*sind(theta1)), 4.5);    %确定坐标轴范围
y_scale = max(abs(r*cosd(theta1)), 4.5);
if flag ~= 2                                %判断是否为全反射
    hold on;
    if flag ~= 1                            %判断是否为垂直入射
        x = 0:0.1:r*sind(theta2);
        y = -x./tand(theta2);
    else
        y = -y;
    end
    ZheShe = plot(x,y,'b','LineWidth',2);
    legend([RuShe FanShe ZheShe],'入射光','反射光','折射光');
    x_scale = max(x_scale,abs(r*sind(theta2)));                                     %加入折射光线后,重新确定坐标轴范围
    y_scale = max(y_scale,abs(r*cosd(theta2)));
end

grid on;
axis equal;
axis ([-x_scale x_scale -y_scale y_scale]);
title('折射,反射示意图','FontSize',12);

%在图中添加说明
if flag ~= 2
    temp = num2str(theta2);
else
    temp = '全反射';
end
textstr = {['n1=' num2str(n1) ', n2=' num2str(n2)]; ['入射角为: ' num2str(theta1) '°']; ['折射角为: ' temp '°']; ['rs = ' num2str(rs)]; ['rp = ' num2str(rp)]; ['ts = ' num2str(ts)]; ['tp = ' num2str(tp)]};
text(min(-x_scale+0.5, -4), -1.8, textstr, 'FontSize', 10);

figure('NumberTitle', 'off', 'Name', '图二 反射折射系数随入射角的变化曲线');            %绘制各反射、折射系数随入射角变化的曲线图
theta_1 = linspace(0, 90, 300);             %入射角
theta_2 = asind(sind(theta_1)*n1/n2);       %求出折射角theta2
rs = -sind(theta_1-theta_2)./sind(theta_1 + theta_2);                                   %s波反射系数
ts = 2*sind(theta_2).*cosd(theta_1)./sind(theta_1+theta_2);                             %s波折射系数
rp = tand(theta_1-theta_2)./tand(theta_1+theta_2);                                      %p波反射系数
tp = 2*sind(theta_2).*cosd(theta_1)./(sind(theta_1+theta_2).*cosd(theta_1-theta_2));    %p波折射系数
if n1 > n2                                  %当可能发生全反射时
    theta_c = asind(n2/n1);                 %全反射角
    temp = find(theta_1 >= theta_c);
    rs(temp)=1; rp(temp)=1; tp(temp)=3; ts(temp)=2;
end
Rs = plot(theta_1, rs, 'r', 'LineWidth', 1.5);
hold on
Ts = plot(theta_1, ts, 'g', 'LineWidth', 1.5);
hold on
Rp = plot(theta_1, rp, 'b', 'LineWidth', 1.5);
hold on
Tp = plot(theta_1, tp, 'y', 'LineWidth', 1.5);
hold on
plot([0 90], [0 0], 'k', 'LineWidth', 0.5); %辅助线
axis([0 90 -1 1]);
if n1 > n2
    hold on
    plot([0 theta_c], [1 1], 'k--', 'LineWidth', 0.5); %辅助线
    hold on
    plot([0 theta_c], [2 2], 'k--', 'LineWidth', 0.5);
    hold on
    plot([theta_c theta_c], [-1 3.5], 'k--', 'LineWidth', 0.5);
    axis([0 90 -1 3.5]);
end
grid on;
legend([Tp Ts Rs Rp], 't_{p}', 't_{s}', 'r_{s}', 'r_{p}');
title('t_{p},t_{s},r_{s},r_{p}随\theta_{1}的变化', 'FontSize', 12);

figure('NumberTitle', 'off', 'Name', '图三 反射比透射比曲线图');
rhos=(sind(theta_1-theta_2)).^2./(sind(theta_1+theta_2)).^2;
taus=4*n2*cosd(theta_2).*(sind(theta_2)).^2.*(cosd(theta_1)).^2./(n1*cosd(theta_1).*sind(theta_1+theta_2).^2);
rhop=(tand(theta_1-theta_2)).^2./(tand(theta_1+theta_2)).^2;
taup=4*n2*cosd(theta_2).*(sind(theta_2)).^2.*(cosd(theta_1)).^2./(n1*cosd(theta_1).*sind(theta_1+theta_2).^2.*cosd(theta_1-theta_2).^2);

if n1 > n2                                  %当可能发生全反射时
    rhos(temp)=1; rhop(temp)=1; taup(temp)=0; taus(temp)=0;
end
Rhos = plot(theta_1, rhos, 'r', 'LineWidth', 1.5);
hold on
Taus = plot(theta_1, taus, 'g', 'LineWidth', 1.5);
hold on
Rhop = plot(theta_1, rhop, 'b', 'LineWidth', 1.5);
hold on
Taup = plot(theta_1, taup, 'y', 'LineWidth', 1.5);
hold on
if n1 > n2
    hold on
    plot([theta_c theta_c], [0 1], 'k--', 'LineWidth', 0.5);
end
axis([0 90 0 1.5]);
grid on;
legend([Taup Taus Rhos Rhop], '{\tau}_{p}', '{\tau}_{s}', '{\rho}_{s}', '{\rho}_{p}');
title('\tau_{p},\tau_{s},\rho_{s},\rho_{p}随\theta_{1}的变化', 'FontSize', 12);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1027358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我想设计一套游戏的奖励系统,有什么值得注意的?

游戏上: 游戏成就系统的价值 游戏中的成就可以延长游戏时间,让玩家不仅仅是将游戏通关,而是必须完成游戏内所有挑战及发现秘密,这些成就可以与游戏本身的目标一致,也可以独立于游戏的主要或次要目标之外,…

flink集群与资源@k8s源码分析-资源III 声明式资源管理

1 资源 资源分析分3部分,资源请求,资源提供,声明式资源管理,本文是第三部分声明式资源管理 2 检查资源需求/检查资源声明 检查资源需求/检查资源声明是flink声明式资源管理的核心方法 上面的资源场景分为两类,提出资源需求和提供资源, 检查资源请求/检查资源声明是交…

Unity HDRP 录制透明通道序列帧

一、插件 使用插件为Unity Recorder,可在PackageManager搜索Recorder安装 然后打开插件面板 二、Image Sequence 添加Image Sequence,摄像机选择主摄即可,图片格式选PNG,并勾选Include Alpha 此时点击 START RECORDING 即可…

Linux常用命令 - 用户管理命令

用户管理命令 useradd 功能:添加用户。 选项功能-d指定用户主目录-m创建用户的主目录-g指定用户的用户组-s指定用户的shell-D显示useradd命令当前的默认值 不同的linux系统默认选项不一样,比如Ubuntu系统useradd命令默认只创建用户,不会创…

Spring Boot虚拟线程的性能还不如Webflux?

早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。 测试场景 作者采用了一个尽可能贴近现实操作的场景: 从授权头信息中提取JWT验证…

SpringBoot3基础:最简项目示例

说明 本文建立一个最基本的SpringBoot3项目&#xff0c;依赖项仅包含 spring-web&#xff08;SpringMVC&#xff09;。 备注&#xff1a;SpringBoot3需要JDK17支持&#xff0c;配置方法参考&#xff1a; SpringBoot3项目中配置JDK17 项目结构图示 POM <?xml version&qu…

飞行动力学 - 第31节-荷兰滚模态机理 之 基础点摘要

飞行动力学 - 第31节-荷兰滚模态机理 之 基础点摘要 1. 荷兰滚模态2. “荷兰滚”的由来3. 荷兰滚模态机理4. 滚转力矩方程5. 参考资料 1. 荷兰滚模态 紧随滚转收敛模态的振荡运动被称为荷兰滚模态&#xff0c;包括侧滑与航向运动。 2. “荷兰滚”的由来 与一种叫荷兰滚(利用…

@EventListener 监听事件 ,在同一个虚拟机中如何保证顺序执行

文章目录 前言EventListener 监听事件 &#xff0c;在同一个虚拟机中如何保证顺序执行1. 设计原理2. 具体编码2.1. 编码事件监听器2.2. 制作一个生成序号方法2.3. 制作测试代码2.4. 测试结果 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;…

【100天精通Python】Day67:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码

目录 1 绘制曲面图 2 绘制3D填充图 3 绘制极坐标图 1 绘制曲面图 当绘制3D曲面图时&#xff0c;mpl_toolkits.mplot3d 模块中的 Axes3D 对象提供了多种方法来呈现不同类型的曲面图。以下是一些常见的3D曲面图类型以及示例&#xff1a; 曲面图&#xff1a;使用 plot_surface …

19.组合模式(Composite)

意图&#xff1a;将对象组成树状结构以表示“部分&#xff0d;整体”的层次结构&#xff0c;使得Client对单个对象和组合对象的使用具有一致性。 上下文&#xff1a;在树型结构的问题中&#xff0c;Client必须以不同的方式处理单个对象和组合对象。能否提供一种封装&#xff0c…

R语言风险价值:ARIMA,GARCH,Delta-normal法滚动估计VaR(Value at Risk)和回测分析股票数据...

全文链接&#xff1a;http://tecdat.cn/?p24492 此分析的目的是构建一个过程&#xff0c;以在给定时变波动性的情况下正确估计风险价值。风险价值被广泛用于衡量金融机构的市场风险。我们的时间序列数据包括 1258 天的股票收益&#xff08;点击文末“阅读原文”获取完整代码数…

huggingface连接不上的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

北斗导航 | RTD、RTK完好性之B值、VPL与HPL计算(附B值计算matlab源代码)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 1、S矩阵获取 为第i颗卫星测距标准差:

ChatGLM Embedding+LangChain构建行业知识库

写在前面 私有AI知识库的价值巨大。不管是个人、企业或者行业,都可以用它来打造定制化的垂直智库。基于AI大模型的能力,知识的检索和应用将变得异常简单。目前很多行业都在探索落地,比如AI客服、AI导诊、AI法律助手等。 在上两篇文章中,介绍了如何利用白嫖阿里云服务器,D…

Facebook最佳聊单工具--SaleSmartly,智能回复+控评+群控分流

关于SaleSmartlySaleSmartly--全渠道客户沟通平台,它可以帮助企业实现聊天自动化、智能化&#xff0c;提高员工效率&#xff0c;降低人工成本&#xff0c;提升客服质量。 在管理facebook时&#xff0c;你遇到的痛点&#xff1a; &#xff08;1&#xff09;FB聊单如何实现业务最…

黄金代理前景如何,有得搞吗?

现货黄金代理这个职业时常都听人说过了&#xff0c;随着近期现货黄金走势不断出现行情&#xff0c;尤其是美国通胀严重&#xff0c;地缘政治局势频发&#xff0c;黄金走势不断获得支撑而走高。在这样的背景下&#xff0c;现货黄金代理这个职业的前景如何呢&#xff1f; 其实对于…

[python 刷题] 128 Longest Consecutive Sequence

[python 刷题] 128 Longest Consecutive Sequence 题目&#xff1a; Given an unsorted array of integers nums, return the length of the longest consecutive elements sequence. You must write an algorithm that runs in O(n) time. 这题给了一个没有排序的数组&#x…

xyhcms getshell

下载xyhcms3.6.2021版本并用phpstudy搭建 function get_cookie($name, $key ) {if (!isset($_COOKIE[$name])) {return null;}$key empty($key) ? C(CFG_COOKIE_ENCODE) : $key;$value $_COOKIE[$name];$key md5($key);$sc new \Common\Lib\SysCrypt($key);$value $sc-…

php函数usort使用方法

在 PHP 中&#xff0c;usort() 函数用于对数组进行排序&#xff0c;它允许你使用自定义的比较函数来确定元素的顺序。以下是 usort() 函数的使用方法&#xff1a; usort(array &$array, callable $cmp_function): bool参数说明&#xff1a; $array&#xff1a;要排序的数…

增强企业的网络防御:从哪里开始

在当今的数字环境中&#xff0c;网络安全事件已经变得异常普遍&#xff0c;影响着各种规模和行业的企业。中小型企业 (SME) 不再局限于知名组织&#xff0c;由于其潜在的漏洞和应对复杂威胁的资源有限&#xff0c;越来越多地成为网络犯罪分子的目标。 2023 年第一季度&#xf…