关于 matlab-model-optics
面向 MATLAB 光学设计与仿真的技能,适用于构建、导入、分析、容差分析和优化光学系统。内容涵盖几何光学、光线追迹、光学镀膜及 Zemax 文件导入。
主要功能
- 01构建和导入光学系统
- 02光线追迹与几何光学分析
- 03光学镀膜设计与分析
- 04系统容差分析与优化
- 05Zemax 文件导入
适用场景
- 01根据处方表建立光学系统
- 02分析镜头畸变和光斑
- 03组合现有镜头组件
- 04优化光学设计并评估容差
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-model-optics安装后在 Claude Code 中输入/matlab-model-optics确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
manifest.yamlreferences/dynamic-optical-systems-simulink.mdoptical-coating-design.mdoptical-coating-tolerance.mdoptical-system-design.md详细介绍
光学设计与仿真库
当用户使用 光学设计与仿真库 在 MATLAB 中构建、导入、分析、进行公差分析或优化光学系统时,请使用此技能。
此库也可能称为:
- 光学设计与仿真库
- 光学支持包
- 光学附加组件
- 光学库
- 光学工具箱
除非用户明确使用其他名称,否则在回复中使用 光学设计与仿真库 作为规范名称。
适用场景
当用户询问以下内容时,请使用此技能:
- 光学系统
- 光线追迹
- 基于几何光学的分析,例如镜头畸变、光斑图、色差、像散和光线扇形图
- 近轴光学
- 光学镀膜
- 偏振或电磁分析(计算 Fresnel 系数)
- 玻璃材料和玻璃目录
- Zemax 导入
- 光学公差分析
- 光学系统设计与优化
- Simulink 中的动态光学系统(参阅
references/dynamic-optical-systems-simulink.md)
不适用场景
在以下情况下,不要使用此技能:
- 用户正在处理物理光学或波动光学(衍射、干涉、相干性)
- 用户正在处理光纤或光子学
- 用户需要图像处理或计算机视觉(请改用 Image Processing Toolbox)
- 任务纯粹涉及 Simulink 建模,不涉及光学系统
入门步骤
帮助初次使用此库的用户时,请先从探索功能开始:
help optics
要获取特定函数的更多详情:
help lensDistortion
doc lensDistortion
许多光学 API 都是类方法。对于类方法,请使用:
help className/functionName
doc className/functionName
示例:
help opticalSystem/add
用户需要更完整的端到端工作流时,请使用文档中的示例。
示例 ZMX 文件
光学设计与仿真库在支持包的安装位置中的 opticsdata 文件夹内附带了 Zemax 示例文件(.zmx)。要查找路径:
spkgRoot = fullfile(matlabshared.supportpkg.getSupportPackageRoot, "toolbox", "images", "supportpackages", "opticsdata");
dir(fullfile(spkgRoot, "*.zmx"))
当用户要求处理标准光学系统(例如“Cooke 三片式镜头”“双胶合透镜”或“远摄镜头”),但没有提供自己的文件时:
- 列出
opticsdata文件夹中可用的.zmx文件 - 选择与用户请求最匹配的示例系统
- 使用
zmximport导入该系统
这样,在已有合适示例的情况下,就不必再向用户询问文件路径。
核心概念
opticalSystem
opticalSystem 是表示物理光学系统的核心对象。
opsys = opticalSystem(Wavelengths=[486.134 587.562 656.281]);
opticalMaterial
opticalMaterial 表示玻璃或光学材料。
mat = opticalMaterial([1.5168 64.17]);
mat = pickGlass("N-BK7");
opticalCoating
opticalCoating 表示应用于表面的薄膜镀层。
oc = opticalCoating(CoatingMaterial=["MgF2" "TiO2"], LayerMaterialIndex=[1 2 1 2], LayerThickness=[1 0.5 1 0.5], PrimaryWavelength=550);
oc = pickCoating("AR_MgF2_VIS");
addCoating(opsys, oc);
addCoating(opsys, oc, CoatingSide="front");
坐标系
请参阅 MATLAB 文档页面 “光学设计中的坐标系”,了解用于构建光学系统的坐标系约定。
视场点角度约定
使用 fieldPoint(Angles=[Hy Hx]) 创建视场点时:
Hy— 垂直视场角(度)Hx— 水平视场角(度)
示例——垂直方向 10 度的视场点:
fp = fieldPoint(Angles=[10 0]);
水平方向 10 度的视场点:
fp = fieldPoint(Angles=[0 10]);
TiltAngles 约定
TiltAngles=[Rx Ry Rz] 指定绕各轴旋转的角度(度):
Rx(第一个元素)— 绕 X 轴旋转Ry(第二个元素)— 绕 Y 轴旋转Rz(第三个元素)— 绕 Z 轴旋转
示例——绕 X 轴倾斜 45 度的镜面:
addMirror(opsys, TiltAngles=[45 0 0]);
常见交互模式
模式:构建 → 可视化 → 分析
许多用户请求都遵循以下顺序:
- 构建或导入光学系统
- 定义视场点和波长
- 运行分析函数
- 检查返回值
- 可视化结果
%% 1. Build
opsys = opticalSystem(Wavelengths=587.562);
addRefractiveSurface(opsys, Radius=50, Material=pickGlass("N-BK7"), SemiDiameter=10, DistanceToNext=5);
addRefractiveSurface(opsys, Radius=-50, SemiDiameter=10, DistanceToNext=20);
addImagePlane(opsys, SemiDiameter=10);
opsys.FieldPoints = fieldPoint(Angles=[0 0; 10 0]);
%% 2. Visualize
h2 = view2d(opsys);
%% 3. Analyze
tra = rayAberration(opsys);
hra = show(tra);
模式:计算 → 展示
许多分析遵循先计算,再可视化的模式。
spotResult = spot(opsys);
spotDiagram(spotResult);
ldResult = lensDistortion(opsys);
show(ldResult);
当用户同时需要数值结果和图表时,请使用此模式。
模式:创建光学系统的新副本
如果要以原始系统为起点进行多种不同修改,请显式创建原始系统的新副本。这对于公差分析和灵敏度分析尤其有用,因为在这些分析中,原始系统的参数会被反复修改。
newSys = copy(opsys);
这样可以避免在多次试验中累积扰动,除非明确需要累积扰动。
任务:根据处方表构建光学系统
顺序光学系统通常以处方表的形式指定(常见于专利文档、教科书和光学设计参考资料)。
每一行代表一个表面或光学元件,列中包含以下信息:
- 曲率半径
- 到下一个表面的厚度
- 材料(名称或 [nd, vd])
- 表面类型(隐式或显式,例如孔径光阑或像面)
用户可能会以截图、Excel 表格或手动输入的表格形式提供这些数据。
处方表示例(显式孔径光阑表面)
| 表面 | 半径 | 厚度 | 材料 | 类型 |
|---|---|---|---|---|
| 1 | 50 | 5 | N-BK7 | 折射面 |
| 2 | -50 | 5 | Air | 折射面 |
| 3 | — | 5 | — | 孔径光阑 |
| 4 | 40 | 5 | N-BK7 | 折射面 |
| 5 | -40 | 20 | Air | 折射面 |
| 6 | Inf | 0 | Image | 像面 |
模式:表格 → 光学系统
- 创建
opticalSystem - 遍历各行
- 对于每一行:
- 折射面 →
addRefractiveSurface - 孔径光阑 →
addDiaphragm - ImagePlane →
addImagePlane
- 折射面 →
- 将厚度用作前一个元件的
DistanceToNext
示例代码
opsys = opticalSystem(Wavelengths=587.562);
% Surface 1
addRefractiveSurface(opsys, Radius=50, Material=pickGlass("N-BK7"), DistanceToNext=5);
% Surface 2
addRefractiveSurface(opsys, Radius=-50, DistanceToNext=5);
% Stop (explicit element)
addDiaphragm(opsys, DistanceToNext=5);
% Surface 4
addRefractiveSurface(opsys, Radius=40, Material=pickGlass("N-BK7"), DistanceToNext=5);
% Surface 5
addRefractiveSurface(opsys, Radius=-40,DistanceToNext=20);
% Image plane
addImagePlane(opsys);
h2initial = view2d(opsys, Parent=figure);
更新表面的半口径
由于表格未提供半口径值,因此所有表面的半口径都设为默认值。系统描述通常会提供视场(FOV)。
模式:根据视场设置半口径
构建光学系统后:
- 使用视场定义目标视场角
- 从系统描述中确定孔径约束。有效约束选项请参阅
help updateSemiDiameters。 - 调用 updateSemiDiameters,计算所有表面的半口径
FOV = 20; % degrees
targetFieldAngle = FOV / 2;
updateSemiDiameters(opsys, "EntryPupilRadius", 5, TargetFieldAngle=targetFieldAngle);
h2Final = view2d(opsys, Parent=figure);
任务:使用元件创建系统
用户通常会通过组合现成元件(例如供应商提供的设计,如单透镜、双胶合透镜或透镜组)来构建光学系统。
此工作流包括:
- 导入现有设计
- 修改系统结构
- 显式管理元件之间的间隔
模式:使用元件扩展系统
- 加载用于构建基础系统的元件或系统
- 根据需要移除末端元件(例如像面)
- 显式更新间隔,因为移除元件不会更新间隔
- 创建基础系统 opticalSystem
- 将已加载的元件逐个添加到基础系统,并适当设置元件之间的间隔
示例代码
% Load existing system
opsysCooke = zmximport("CookeTriplet.zmx");
% Step 1: Remove image plane (if present)
remove(opsysCooke);
% Step 2: Removing a component does NOT remove the gap. Zero out the trailing gap
changeGap(opsysCooke, numel(opsysCooke.Components), 0);
% Step 3: Import singlet component
opsysSinglet = zmximport("singlet.zmx");
% Step 4: Create a new optical System with these two
opsys = opticalSystem(Name="Combined System");
add(opsys, opsysCooke);
changeGap(opsys, numel(opsys.Components), 3, GapLocation="after");
% Step 4: Append singlet to system
add(opsys, opsysSinglet);
h2 = view2d(opsys);
任务:添加反射镜或折叠几何结构
当用户想要建模反射系统时,使用 addMirror。
示例:使用 45 度反射镜的潜望镜系统
此潜望镜通过绕 X 轴旋转,在 Y-Z 平面内折叠光束:
opsys = opticalSystem();
addMirror(opsys, Radius=0, SemiDiameter=10, TiltAngles=[45 0 0]);
addGap(opsys, 50);
addMirror(opsys, Radius=0, SemiDiameter=10, TiltAngles=[-45 0 0]);
addGap(opsys, 20);
addImagePlane(opsys, SemiDiameter=10);
h = view2d(opsys);
addRays(h);
若要改为在 X-Z 平面内折叠,请使用绕 Y 轴旋转:TiltAngles=[0 45 0]。
任务:使用光线数据
当用户要进行的分析不是开箱即用提供的,且必须使用 RayBundle 中提供的 RayData 自行推导时,请使用此方法。
模式 — 使用瞳坐标绘制特定表面上的入射角:
% Import a Cooke triplet
opsys = zmximport("CookeTriplet.zmx");
% Trace from 10-degree field point with incident angle data
fp = fieldPoint(Angles=[10 0]);
sg = samplingGrid("Hexapolar", 8);
rb = traceRays(opsys, FieldPoints=fp, Wavelengths=587.562, SamplingGrid=sg, RayProperties="IncidentAngle");
rd = rb(1).RayData;
% OrientedGrid gives normalized pupil XY for each ray
xy = rd.OrientedGrid;
% Incident angles on surface 4
angles = rd.IncidentAngle(:, 4);
% Scatter plot: position from pupil grid, size and color from angle
figure;
scatter(xy(:,1), xy(:,2), abs(angles)*5, angles, 'filled');
colorbar;
xlabel("Pupil X"); ylabel("Pupil Y");
title("Incident Angle on Surface 4 — Field Angle 10°");
axis equal;
任务:优化设计
当用户希望从初始光学系统出发提升性能时,使用设计优化。详细模式、代码模板和优化器选择指南请参阅 references/optical-system-design.md。
常规工作流:
- 定义初始光学系统
- 将设计变量(半径、厚度、材料、间隔)打包成数值向量
- 创建辅助函数(
x2opsys),将向量转换回opticalSystem - 使用加权性能指标(焦距、光斑 RMS、光学总长)定义评价函数
- 运行有界优化器(多目标优化使用
lsqnonlin,标量优化使用fmincon) - 重构优化后的系统,并使用
paraxialInfo、spot和view2d进行验证
始终在参数到系统的转换过程中调用 updateSemiDiameters,以便在每次参数变更后维持孔径约束。
任务:光学镀膜设计
当用户希望设计、分析或优化薄膜光学镀膜(增透膜、带通滤光片、长通/短通滤光片、陷波滤光片)时,使用此流程。详细模式和优化模板请参阅 references/optical-coating-design.md。
常规工作流:
- 使用
pickCoatingMaterial定义镀膜材料 - 通过
LayerMaterialIndex指定膜层结构(高、低折射率交替排列) - 使用
opticalCoating和膜层厚度创建镀膜 - 使用
fresnelCoefficients查询光谱响应 - 进行优化时:将厚度打包成向量,定义光谱波段目标,并运行有界优化器
关键函数:
pickCoatingMaterial("SiO2")— 加载镀膜材料opticalCoating(...)— 创建多层镀膜fresnelCoefficients(oc, Wavelengths=..., IncidentAngles=...)— 计算透射率/反射率- 访问
fq.Ta(总透射率)、fq.Ra(总反射率)或偏振分辨属性
任务:光学镀膜公差分析
当用户希望评估镀膜设计的制造灵敏度或良率时,使用此流程。详细模式和 Monte Carlo 模板请参阅 references/optical-coating-tolerance.md。
常规工作流:
- 定义标称镀膜设计
- 指定制造公差(各材料的厚度标准差、折射率标准差)
- 选择分析类型:
- 灵敏度:逐层扰动,测量对性能的影响
- Monte Carlo 良率:运行 N 次随机试验,施加高斯扰动并计算通过率
- 使用
fresnelCoefficients根据通过/未通过规格评估每个样本 - 计算良率百分比并可视化公差范围
关键注意事项:
- 使用
parfor运行 Monte Carlo 试验(每次试验彼此独立) - 将厚度和折射率变化建模为相互独立的高斯扰动
- 为材料指定不同的标准差值(高折射率材料通常具有较大的变化幅度)
- 可靠估算良率需进行 400 次以上试验;最终鉴定需进行 1000 次以上试验
补充说明
- 将 2D 平面上的物理位置转换为像素位置时,
imref2d可能会很有用。 - 如需了解 Simulink 中的动态光学系统,请参阅
references/dynamic-optical-systems-simulink.md
在 UI 应用中嵌入 view3d / view2d
将 view3d 或 view2d 放入 uifigure 布局时,请使用 uigridlayout(而非 uipanel)作为父容器,这样查看器图表才能填满可用空间:
gl = uigridlayout(parentContainer, [1 1], Padding=[0 0 0 0]);
osv3d = view3d(opsys, Parent=gl);
图表对象会自动拉伸以填满网格布局单元格,但在普通 uipanel 容器中不会自动调整大小。
Copyright 2026 The MathWorks, Inc.