镜头型号¶
让我们来描述一下透镜模型,给出光学系统的特性,并评估平行光线是如何通过透镜的。
问题描述¶
我们将创建一个透镜和表面模型。光线将在空气中传播(空气的折射率等于1.0
),然后穿过一个球面,球面的光学中心位于1
(坐标没有维度,用户可以用任何系统表示)。第一个球面的半径等于6.0
。然后,光线穿过折射率为1.5
(玻璃)的材料,直至到达位于 Z 轴坐标2
、半径为-6
的第二个球面。穿过第二个球面后,光束再次穿过空气,到达位于 Z 轴坐标8
处的球面。
在这项工作中,我们将使用计算几何光学问题的软件包GeometricalOptics
。
Pkg.add( url="https://github.com/airspaced-nk5/GeometricalOptics.jl#master" )
透镜和限制光线传播的墙壁的几何形状定义如下:
using GeometricalOptics
funcsList = [spherical, spherical, zplane] # объекты на пути луча
coeffsList = [[1., 6.], [2., -6.], [8.]] # свойства объектов
nList = [1., 1.5, 1.] # индексы рефракции
optSta = opticalstack( coeffsList, funcsList, nList );
我们可以看到,系统中有三个物体:两个球面spherical
(发生折射)和一个平面zplane
。
折射系数是光在穿过下一个边界(由列表
funcsList
中的相应对象给出)之前**通过的介质的系数。在我们的例子中,第一个系数描述的是透镜前的空间*。
库中的对象spherical
由函数spherical( x, y, coeffs=[zpos,signed_radius] )
定义,其中zpos
是对象在光轴上的位置,signed_radius
是表面的曲率半径。
用户可以创建自己的函数,并将其用于光学系统的定义。例如,函数
my_ytilt(x,y,coeffs)=coeffs[1]+coeffs[2]*y
将创建一个倾斜平面的描述,其在 Z 轴上的位置由第一个系数定义,在 Y 轴上的倾斜度由第二个系数定义。
创建射线源¶
创建平行光束的最简洁方法是使用函数bundle(x,y,angx,angy,zpos)
。此外还有其他函数,例如bundle_as_array
,它可以创建横截面为圆形的光束。
函数bundle
接收参数x,y,zpos
(光束中心位置)和angx,angy
(光束中射线沿 X 轴和 Y 轴的发散,以弧度为单位)。每个参数都可以用矢量指定,因此下面的命令可以创建一个射线梳。
test_bundle = bundle( [0.], (-1:0.2:1), 0., 0., 0. );
每条射线都从坐标为X=0
和Z=0
的点开始,我们总共创建了 11 条射线,坐标从-1
到1
,间距为0.2
。
图形的计算和输出¶
该系统可生成多种不同的图表。
光束曲率特征¶
我们有1
源表面和k
表面,因此我们可以通过k+1
找出任意两个表面之间的光束坐标关系。
如果我们简单地将光束test_bundle
传递给对象optSta
("光学堆栈 "),并使用函数rac
显示图形,我们将得到一条曲线。
trace1 = optSta( test_bundle )
rac( trace1, 1, 4 )
下面是光束中每条射线在第四表面(坐标轴Y
)上的坐标与其在第一表面(坐标轴X
)上的坐标的关系图。
rms_spot
命令将返回光束在光学系统最后一个表面上的散射均方根值(如果调用该命令时没有附加参数)。
rms = rms_spot( trace1 )
二维射线传播图¶
如果我们不仅向对象optSta
传递源特征test_bundle
,还传递参数rend
,我们将在输出中得到一个二维(或三维)图形。
p_lens = optSta( test_bundle; rend = "YZ" )
请尝试使用此命令的可能参数,以获得不同的图形(为加快渲染速度,我们将图形转换为gr()
格式)。
gr()
rend = "3Dcirc" # @param ["YZ", "XZ", "3Dcirc", "3Dsq"]
ymin = -2.0
ymax = 2.0
p_lens = optSta(test_bundle; rend=rend, ydom = -2:0.1:2)
结论¶
我们已经学会了如何使用GeometricalOptics
库来描述演示几何光学效应的简单模型(模型不反映波效应)。
除了安装该库,我们还需要 7 行代码来创建射线光束通过透镜传播的模型。