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

完整程序:

 

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

%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.mzph.cn/news/83710.shtml

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

相关文章

百度SEO优化TDK介绍(分析下降原因并总结百度优化SEO策略)

TDK是SEO优化中很重要的部分,包括标题(Title)、描述(Description)和关键词(Keyword),为百度提供网页内容信息。其中标题是最重要的,应尽量突出关键词,同时描述…

9.20 QT作业

widget.h #include <QPainter> //画家 #include <QTimerEvent> #include <QTime> #include<QTimer> //定时器类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widge…

c#扩展包-Stateless

准备 Stateless是一个有限状态机扩展包。在c#项目中可以直接通过NuGet安装。 使用他需要先用枚举写好你所有可能的状态和子状态。 例如移动&#xff0c;下蹲&#xff0c;空闲&#xff0c;跳跃&#xff0c;游泳&#xff0c;奔跑&#xff0c;走路。 其中&#xff0c;奔跑和走路…

性能测试之使用Jemeter对HTTP接口压测

我们不应该仅仅局限于某一种工具&#xff0c;性能测试能使用的工具非常多&#xff0c;选择适合的就是最好的。笔者已经使用Loadrunner进行多年的项目性能测试实战经验&#xff0c;也算略有小成&#xff0c;任何性能测试&#xff08;如压力测试、负载测试、疲劳强度测试等&#…

SAP DN已发货但是需求还挂在MD04上的异常处理(SE38执行程序:ATP_VBBE_CONSISTENCY OR SDRQCR21)

背景&#xff1a;DN 80074061已经发完货&#xff0c;但是在MD04上还挂着它的需求 处理方法&#xff1a; HANA S4 版本&#xff0c; SE38 执行程序 ATP_VBBE_CONSISTENCY HANA之前的版本执行程序 SDRQCR21 以 ATP_VBBE_CONSISTENCY 为例&#xff0c;先选择模拟模式 执行&…

ChatGPT:解释Java中 ‘HttpResponse‘ 使用 ‘try-with-resources‘ 的警告和处理 ‘Throwable‘ 打印警告

ChatGPT&#xff1a;解释Java中 ‘HttpResponse’ 使用 ‘try-with-resources’ 的警告和处理 ‘Throwable’ 打印警告 我在IDEA中对一个函数的警告点击了ignore&#xff0c;怎么撤回这个呢 ChatGPT&#xff1a; 要撤回在IDEA中对一个函数的警告的忽略&#xff0c;您可以按照以…

VUE_history模式下页面404错误

uniapp 的history 把#去掉了&#xff0c;但是当刷新页面的时候出现404错误 解决方案&#xff1a;需要服务端支持 如果 URL 匹配不到任何静态资源&#xff0c;则应该返回同一个 index.html 页面 Apache <IfModule mod_rewrite.c>RewriteEngine OnRewriteBase /RewriteRu…

【计算机网络】 拥塞控制

文章目录 背景TCP的四种拥塞控制算法慢开始与拥塞避免&#xff1a;快重传&#xff1a;快恢复&#xff1a; 流量控制和拥塞控制本质上的 区别 背景 网络中的链路容量和交换节点中的缓存和处理机都有着工作的极限&#xff0c;当网络的需求超过他们的工作极限时&#xff0c;就出现…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时&#xff0c;可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如&#xff0c;飞行射击游戏中有大量子弹&#xff0c;某些动作游戏…

函数扩展之——内存函数

前言&#xff1a;小伙伴们又见面啦。 本篇文章&#xff0c;我们将讲解C语言中比较重要且常用的内存函数&#xff0c;并尝试模拟实现它们的功能。 让我们一起来学习叭。 目录 一.什么是内存函数 二.内存函数有哪些 1.memcpy &#xff08;1&#xff09;库函数memcpy &…

高云FPGA系列教程(9):cmd-parser串口命令解析器移植

文章目录 [toc]cmd-parser库简介cmd-parser库源码获取GW1NSR-4C移植cmd-parser实际测试cmd-parse命令解析器优化 本文是高云FPGA系列教程的第9篇文章。 上一篇文章介绍片上ARM Cortex-M3硬核处理器串口外设的使用&#xff0c;演示轮询方式和中断方式接收串口数据&#xff0c;并…

GLTF编辑器如何快速重置模型原点

1、什么是模型原点&#xff1f; 模型原点是三维建模中的概念&#xff0c;它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示&#xff1a; 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…

ubuntu18.04安装python3.10.13

下载python包: https://www.python.org/downloads/安装关联软件包: apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev执行sudo ./configure --enable-optimizations 此命令是为了在编译 Python 时启用性…

洛谷100题DAY6

26.P1628 合并序列 法一&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 10; int n, cnt; string c, s[N], a[N]; int main() {cin >> n;for(int i 1; i < n; i ){cin >> s[i];}cin >> c;int len c.size();for(int…

PHP初中高级1000道面试题大全(持续更新中50/1000)

目录 1、echo(),print(),print_r(),var_dump()的区别? 2、表单中 get与post提交方法的区别? 3、session与cookie的区别? 4、请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用&#xff1f; 5、请解释PHP中的PDO是什么&#xff1f; 6、请解释PHP中的抽象类和…

可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享

实战与案例分析——投资案例研究 股票量化程序化自动交易接口 一、成功的可转债投资案例 成功的可转债投资案例提供了有价值的经验教训&#xff0c;以下是一个典型的成功案例&#xff1a; 案例&#xff1a;投资者B的成功可转债投资 投资者B是一位懂得风险管理的投资者&#…

idea如何关闭项目文件显示的浏览器图标

这里写自定义目录标题 1.idea经常项目文件右上角弹出图标2.setting中Tools 取消勾选浏览器 1.idea经常项目文件右上角弹出图标 2.setting中Tools 取消勾选浏览器

【postgresql 基础入门】表的操作,表结构查看、修改字段类型、增加删除字段、重命名表,对表的操作总是比别人棋高一着

表的操作 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 ​开源贡献&#xff1a; toadb开源库 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子…

C语言 ,不用string.h的函数,实现A+B A-B的字符串处理功能。

请输入A串信息:abcdef 请输入B串信息:ac abcdefac B串的长度是:2 B不是A的子串&#xff0c;请重新输入B的值: ad B不是A的子串&#xff0c;请重新输入B的值: abcde A-B后的结果是:f #include <stdio.h>#define MAX 100void fun(char* a, char *b, char *c) {int ai 0;…

Zabbix

Zabbix简介 ●zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。 ●zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 ●zabbix 由 2 部…