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 で光学システムの構築、インポート、解析、公差解析、最適化を行う際に、光学設計およびシミュレーションライブラリを使用している場合は、このスキルを使用してください。

このライブラリは、次の名称で呼ばれることもあります。

  • 光学設計およびシミュレーションライブラリ
  • Optics Support Package
  • Optics Add-On
  • Optics Library
  • Optics Toolbox

ユーザーが明示的に別の名称を使用している場合を除き、回答では正式名称として光学設計およびシミュレーションライブラリを使用してください。

使用する場合

ユーザーから次の内容について質問された場合は、このスキルを使用してください。

  • 光学システム
  • 光線追跡
  • レンズ歪み、スポットダイアグラム、色収差、非点収差、レイファンなど、幾何光学に基づく解析
  • 近軸光学
  • 光学コーティング
  • 偏光または電磁場解析(フレネル係数の計算)
  • ガラス材料およびガラスカタログ
  • 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(1 番目の要素)— X 軸まわりの回転
  • Ry(2 番目の要素)— Y 軸まわりの回転
  • Rz(3 番目の要素)— 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
    • 像面 → 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. ベクトルを opticalSystem に変換するヘルパー関数(x2opsys)を作成する
  4. 重み付けした性能指標(焦点距離、スポット RMS、光路長)を使用して評価関数を定義する
  5. 境界付きオプティマイザーを実行する(複数目的の場合は lsqnonlin、スカラーの場合は fmincon)
  6. 最適化されたシステムを再構築し、paraxialInfo、spot、view2d で検証する

パラメーターからシステムへの変換処理内で必ず updateSemiDiameters を呼び出し、パラメーター変更のたびに開口制約を維持してください。

タスク:光学コーティングの設計

薄膜光学コーティング(AR コーティング、バンドパスフィルター、ロングパス/ショートパスフィルター、ノッチフィルター)を設計、解析、最適化したい場合は、こちらを使用します。詳細なパターンと最適化テンプレートについては、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(全反射率)、または偏光別の特性にアクセスする

タスク:光学コーティングの公差解析

コーティング設計の製造感度や歩留まりを評価したい場合は、こちらを使用します。詳細なパターンとモンテカルロのテンプレートについては、references/optical-coating-tolerance.md を参照してください。

一般的なワークフロー:

  1. 公称コーティング設計を定義する
  2. 製造公差(材料ごとの厚さのシグマ、屈折率のシグマ)を指定する
  3. 解析の種類を選択する:
    • 感度解析:各層を個別に変動させ、性能への影響を測定する
    • モンテカルロ歩留まり解析:ガウス分布による摂動を用いて N 回のランダム試行を実行し、合格率を計算する
  4. fresnelCoefficients を使用して、各サンプルを合否仕様に照らして評価する
  5. 歩留まり率を計算し、公差範囲を可視化する

主な考慮事項:

  • モンテカルロ試行には parfor を使用します(各試行は独立しています)
  • 厚さと屈折率の変動は、互いに独立したガウス摂動としてモデル化します
  • 材料ごとに異なるシグマ値を使用します(一般に、高屈折率材料は変動が大きくなります)
  • 信頼性の高い歩留まり推定には 400 回以上、最終認定には 1000 回以上の試行を実施します

補足事項

  • 2D 平面上の物理座標をピクセル座標に変換する場合は、imref2d が役立ちます。
  • Simulink の動的光学系については、references/dynamic-optical-systems-simulink.md を参照してください。
UI アプリへの view3d / view2d の埋め込み

view3d または view2d を uifigure のレイアウト内に配置する場合は、ビューアーのチャートが利用可能な領域全体に表示されるように、親として uipanel ではなく uigridlayout を使用します。

gl = uigridlayout(parentContainer, [1 1], Padding=[0 0 0 0]);
osv3d = view3d(opsys, Parent=gl);

チャートオブジェクトはグリッドレイアウトのセルに合わせて自動的に伸縮しますが、通常の uipanel コンテナー内では自動的にサイズ変更されません。


Copyright 2026 The MathWorks, Inc.


コメント