目录
【问题描述】
求一条光线从光速为 c1 的介质中的点 A 穿过平直界面,行进到光速为 c2 的介质中点 B 的路径。
【问题分析】
因为光线从 A 到 B 会按最快的路径行进,所以我们寻求使行进时间最短的路径。
【建立模型】
图1
我们假定 A 和 B 位于 xy 平面,而且两种介质的分界线为 x 轴(图1) 在均匀的介质中光速不变,“ 最短时间 ” 意即 “ 最短路径 〞,而且光线遵循直线路径行进。由此,从A到B的路径由从A到边界点P 的线段,紧接着从 P 到 B 的另一个线段组成,由距离等于速率乘时间的公式。
【问题解答】
时间 = 距离 / 速率 (公式1)
所以,光线从 A 行进到 P 所需要的时间为:
(方程1)
从 P 到 B 所需时间为:
(方程2)
则从 A 到 B 的时间为此二者之和:
(方程3)
这个方程把 t 表示为 x 的一个可微函数,其定义域为闭区间 [0, d] ,而我们要求的就是,在该闭区间上 t 的绝对值最小值。
【注:识别零界点和端点】
我们求得:
(方程4)
用图1 中的角 和 来表示,得到:
(方程5)
我们从方程4 可以知道在:
x = 0 处,dt / dx<0,而在 x = d 处,dt / dx>0。
由此得到在 x = 0 和 t = d 之间的某 x = xo 处 dr / dx = 0(图2)。
图2
这样的点只有一个,因为dt / dx是增函。在x = xo 处:
(方程6)
方程6 即 Snell 定律或折射定律
【c++代码展示】
#include<iostream>
#include<cmath>//数学函数库,用来计算平方根
using namespace std;
int main () {
//定义所需变量
float t1, t2, t, c1, c2, d, dt;
//c1,c2分别为光速(具体含义可查看【问题描述】)
//通过公式1计算光线行进的总时间
t1 = (sqrt(a*a + x*x)) / c1;
t2 = (sqrt(b*b + (d-x)*(d-x))) / c2;
t = t1 + t2;
//dt表示dt / dx, 是求导运算
//此处通过求导,计算光线行进所需的最小时间
dt = (x / c1*sqrt(a*a + x*x)) - ((d-x) / c2*sqrt(b*b + (d-x)*(d-x)));
return 0;
}
【产生结论】
光线遵循的路径是由 Snell 定理描述的路径。
【知识补充】
图3
图3 说明了光线对空气和水的情形。
对室温下的空气和水,光速比为 1.33,从而 Snell 定律变成
(方程7)
在这张实验室的照片中
°,°
而
(sin 35.5° / sin 26°) = 0.581 / 0.438 = 1.33
和预测值相同
这张照片还说明了 反射角 = 人射角