mcpField
M
matlab-model-optics

matlab-model-optics

github.com/matlab其他1.2k51 次安装1 天前更新
代码仓库

关于 matlab-model-optics

面向 MATLAB 光学设计与仿真的技能,适用于构建、导入、分析、容差分析和优化光学系统。内容涵盖几何光学、光线追迹、光学镀膜及 Zemax 文件导入。

主要功能

  1. 01构建和导入光学系统
  2. 02光线追迹与几何光学分析
  3. 03光学镀膜设计与分析
  4. 04系统容差分析与优化
  5. 05Zemax 文件导入

适用场景

  1. 01根据处方表建立光学系统
  2. 02分析镜头畸变和光斑
  3. 03组合现有镜头组件
  4. 04优化光学设计并评估容差

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-model-optics

安装后在 Claude Code 中输入/matlab-model-optics确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

manifest.yaml
references/
dynamic-optical-systems-simulink.md
optical-coating-design.md
optical-coating-tolerance.md
optical-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 三片式镜头”“双胶合透镜”或“远摄镜头”),但没有提供自己的文件时:

  1. 列出 opticsdata 文件夹中可用的 .zmx 文件
  2. 选择与用户请求最匹配的示例系统
  3. 使用 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. 构建或导入光学系统
  2. 定义视场点和波长
  3. 运行分析函数
  4. 检查返回值
  5. 可视化结果
%% 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 表格或手动输入的表格形式提供这些数据。

处方表示例(显式孔径光阑表面)
表面半径厚度材料类型
1505N-BK7折射面
2-505Air折射面
3—5—孔径光阑
4405N-BK7折射面
5-4020Air折射面
6Inf0Image像面
模式:表格 → 光学系统
  1. 创建 opticalSystem
  2. 遍历各行
  3. 对于每一行:
    • 折射面 → addRefractiveSurface
    • 孔径光阑 → addDiaphragm
    • ImagePlane → addImagePlane
  4. 将厚度用作前一个元件的 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)。

模式:根据视场设置半口径

构建光学系统后:

  1. 使用视场定义目标视场角
  2. 从系统描述中确定孔径约束。有效约束选项请参阅 help updateSemiDiameters。
  3. 调用 updateSemiDiameters,计算所有表面的半口径
FOV = 20;   % degrees
targetFieldAngle = FOV / 2;
updateSemiDiameters(opsys, "EntryPupilRadius", 5, TargetFieldAngle=targetFieldAngle);
h2Final = view2d(opsys, Parent=figure);

任务:使用元件创建系统

用户通常会通过组合现成元件(例如供应商提供的设计,如单透镜、双胶合透镜或透镜组)来构建光学系统。

此工作流包括:

  • 导入现有设计
  • 修改系统结构
  • 显式管理元件之间的间隔
模式:使用元件扩展系统
  1. 加载用于构建基础系统的元件或系统
  2. 根据需要移除末端元件(例如像面)
  3. 显式更新间隔,因为移除元件不会更新间隔
  4. 创建基础系统 opticalSystem
  5. 将已加载的元件逐个添加到基础系统,并适当设置元件之间的间隔
示例代码
% 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。

常规工作流:

  1. 定义初始光学系统
  2. 将设计变量(半径、厚度、材料、间隔)打包成数值向量
  3. 创建辅助函数(x2opsys),将向量转换回 opticalSystem
  4. 使用加权性能指标(焦距、光斑 RMS、光学总长)定义评价函数
  5. 运行有界优化器(多目标优化使用 lsqnonlin,标量优化使用 fmincon)
  6. 重构优化后的系统,并使用 paraxialInfo、spot 和 view2d 进行验证

始终在参数到系统的转换过程中调用 updateSemiDiameters,以便在每次参数变更后维持孔径约束。

任务:光学镀膜设计

当用户希望设计、分析或优化薄膜光学镀膜(增透膜、带通滤光片、长通/短通滤光片、陷波滤光片)时,使用此流程。详细模式和优化模板请参阅 references/optical-coating-design.md。

常规工作流:

  1. 使用 pickCoatingMaterial 定义镀膜材料
  2. 通过 LayerMaterialIndex 指定膜层结构(高、低折射率交替排列)
  3. 使用 opticalCoating 和膜层厚度创建镀膜
  4. 使用 fresnelCoefficients 查询光谱响应
  5. 进行优化时:将厚度打包成向量,定义光谱波段目标,并运行有界优化器

关键函数:

  • pickCoatingMaterial("SiO2") — 加载镀膜材料
  • opticalCoating(...) — 创建多层镀膜
  • fresnelCoefficients(oc, Wavelengths=..., IncidentAngles=...) — 计算透射率/反射率
  • 访问 fq.Ta(总透射率)、fq.Ra(总反射率)或偏振分辨属性

任务:光学镀膜公差分析

当用户希望评估镀膜设计的制造灵敏度或良率时,使用此流程。详细模式和 Monte Carlo 模板请参阅 references/optical-coating-tolerance.md。

常规工作流:

  1. 定义标称镀膜设计
  2. 指定制造公差(各材料的厚度标准差、折射率标准差)
  3. 选择分析类型:
    • 灵敏度:逐层扰动,测量对性能的影响
    • Monte Carlo 良率:运行 N 次随机试验,施加高斯扰动并计算通过率
  4. 使用 fresnelCoefficients 根据通过/未通过规格评估每个样本
  5. 计算良率百分比并可视化公差范围

关键注意事项:

  • 使用 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.


评论

支持 Markdown