基于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…

性能测试之使用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;先选择模拟模式 执行&…

【计算机网络】 拥塞控制

文章目录 背景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、模型原点的作用 知道了什么是模型原点&…

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

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

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

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

Zabbix

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

创造您梦寐以求的家居设计——Live Home 3D Pro for Mac

您是否曾经想象过在舒适的家中展现自己独特的风格&#xff1f;现在&#xff0c;您可以通过Live Home 3D Pro for Mac来实现您的家居设计梦想&#xff01;这款强大的3D家居设计软件将带给您无限的创作可能性。 Live Home 3D Pro for Mac是一款专业级的家居设计软件&#xff0c;…

Visual Studio 更新:远程文件管理器

Visual Studio 中的远程文件管理器可以用来访问远程机器上的文件和文件夹&#xff0c;通过 Visual Studio 自带的连接管理器&#xff0c;可以实现不离开开发环境直接访问远程系统&#xff0c;这确实十分方便。 自从此功能发布以来&#xff0c;VS 开发团队努力工作&#xff0c;…

基于STC15单片机电子时钟液晶1602串口显示-proteus仿真-源程序

一、系统方案 1、本设计采用STC15单片机作为主控器。 2、液晶1602显示电子时钟。 3、串口显示电子时钟。 4、按键控制开启暂停清零。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uint count0; uint8 strPhoto[8]; uint wendu0;P3M0 0x…

如何选择适合爬虫的动态住宅套餐

在当今互联网时代&#xff0c;爬虫已经成为了一项非常重要的技术。爬虫技术可以帮助企业和个人获取大量的数据&#xff0c;从而进行数据分析和决策。但是&#xff0c;要想让爬虫技术发挥最大的作用&#xff0c;就需要选择一款动态住宅套餐。那么&#xff0c;在选择动态住宅套餐…

1.3python基础语法——PyCharm

1&#xff09;PyCharm的作用 python的集成开发环境&#xff0c;功能如下&#xff1a; Project管理 智能提示 语法高亮 代码跳转 调试代码 解释代码(解释器) 框架和库 2&#xff09;下载与安装 下载地址&#xff1a;http://www.jetbrains.com/pycharm/download/#sectionwind…

进阶指针(一)

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;进阶C语言 进阶指针&#xff08;一&#xff09; 0.回顾初阶指针1.字符指针1.1 相关面试题 2.数组指针3.指针数组3.1 数组指针的定义3.2 &数组名VS数组名3.3 数组指针的使用 4.数组传参和指针传参4.…

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

Jenkins学习笔记1

CI 服务器&#xff1a; 认识Jenkins&#xff1a; Jenkins是一个可扩展的持续集成&#xff08;CI&#xff09;引擎&#xff0c;是一个开源项目&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使得软件持续集成变成可能。Jenkins非常易于安装和配置&#xff0c;简单易…