この記事では、メリット ファンクション エディタで最適化オペランド ZPLM によって複雑な最適化目標を定義する際に、ZPL マクロを使用する方法について説明します。ここでは、ZPLM を使用して、適切な重量配分の光学系を実現するために重心にコンストレインツを設定する方法を紹介します。
著者 Alessandra Croce
Downloads
Introduction
OpticStudio には、最適化の対象となるほぼあらゆる数値に対して目標を設定できるオペランドが 400 点近く用意されています。たとえば、高度な評価関数を定義するための数学オペランド SINE、PROD、SQRT などがあります。しかし、必要な値を得るための計算が複雑で、メリット ファンクション エディタの内部で実行するには非現実的なこともあります。そのような場合は、マクロを実行してオペランドの値を決定する ZPLM 最適化オペランドを使用できます。実行したマクロからは、キーワード OPTRETURN によって評価関数に計算結果が返されます。
ZPLM オペランド
ZPLM オペランドには、6 つの引数として Mac#、Data、Hx、Hy、Px、Py があります。
- Mac# は、OpticStudio で実行するマクロの番号です。ZPLM オペランドで使用するマクロは、ZPLnn.zpl をファイル名として保存する必要があります。nn には 00 ≤ nn ≤ 99 の範囲の値を指定します。
- たとえば、ZPLM でマクロ ZPL03.zpl を呼び出す場合は、Mac# に 3 を指定します。
- Data はマクロで計算するデータの値です。1 つのマクロで最大 51 個のデータ値を計算できます (0 ≤ Data ≤ 50)。効率を考慮して、このマクロは Data = 0 の場合にのみ実行されます。それ以外の値を指定すると、前のマクロ呼び出しで算出されたデータが使用されます (つまり、Data = 0 を指定して、このマクロを少なくとも 1 回呼び出す必要があります)。
- Hx、Hy、Px、Py は、マクロでの計算に使用するためにマクロに渡すことができる値です。必ずしも正規化視野座標や正規化瞳座標にする必要はありません。
次の例では、ZPLM 最適化オペランドで使用するマクロ定義の例を示します。
ZPLM の例 :重心に対するコンストレインツ
光学系によっては、その重心が、重要な機械的考慮事項になることがあります (ライフル照準器、双眼鏡、三脚に取り付けるカメラなど)。ライフル照準器を設計する中で、そのコンストレインツとして、光学系の適切な重量配分の実現があるとします。これは、前方のエレメントと後方のエレメントの中間点に重心 (CM) を置く必要があるということです。
サンプル ファイル <Documents>\Zemax\Samples\Sequential\Afocal\Afocal Riflescope.zmx を読み込みます。
この説明例の目的を達成するために、以下の前提を設けて条件を簡素化します。
- レンズはすべて回転対称である。
- 材料はすべて均質である。
- 各レンズの重心は、前面頂点と後面頂点の中間点にある (厳密には、レンズの両面が互いに逆向きで等しい曲率でないと、この条件は成立しません)。
- 面 1 をグローバル座標の基準 (GCRS) とする。
重心位置にコンストレインツを設定するには、以下の値が必要です。
- 各エレメントのグローバル位置
- The mass of each element各エレメントの質量
- 光学系の全長 (前のレンズから後ろのレンズまでの長さ)
そのために、以下の ZPL 関数と ZPL キーワードを使用します。
- GLCZ() : 面のグローバル z 座標を返す関数
- OPEV() : TMAS 最適化オペランドを使用してエレメントの質量を取得する関数
- GETSYSTEMDATA : トータル トラック長 (面 1 から像面までの長さ) を返すキーワード
- OPTRETURN : データをマクロに返すキーワード
ZPLM のマクロ コード
この記事の添付ファイルに記述されている重心マクロは次のとおりです。
Mac# = 1 を指定してこのマクロを呼び出せるように、ファイル名 ZPL01.ZPL で保存します。
評価関数に記述する ZPLM
Mac# = 1、Data = 0 を指定した ZPLM オペランドを評価関数に追加します。これにより、このマクロが実行されると光学系の重心が返されます。
この例の戻り値は 1 つのみです。その他の値も返す場合は、次の構文による OPTRETURN の行をマクロに追加します。
OPTRETURN data_number, value
この例では、最適化は実行しませんが、プロセスは他のオペランドと同じです (つまり、目標値とゼロ以外の重みを設定します)。マクロで返す値には任意の単位を指定できます。したがって、評価関数にある ZPLM 以外のオペランドの目標を基準として、ZPLM オペランドの目標値の重要度が正確に設定されるように、ZPLM オペランドの重みを慎重に考慮する必要があります。特に、重心を目標とする今回のマクロでは、光学系性能を目標とする他のオペランドと ZPLM オペランドとの間に適切な均衡を実現するために、ZPLM に対する重みをごく小さい値に設定する必要があります。
前述のとおり、ZPLM では、マクロに渡すデータとして 4 つの値 (Hx, Hy, Px, Py) を使用できます。マクロでは、数値関数 PVHX()、PVHY()、PVPX()、PVPY() を使用して、これら渡された値にアクセスできます。この例では、鏡筒の重心位置と質量をマクロに渡し、鏡筒とレンズを組み合わせた状態での重心を計算できます。
- Hx = 鏡筒の重心から光学系の中心までの距離
- Hy = 鏡筒の質量
マクロを次のように変更して、新しいファイル名 ZPL02.zpl で保存します。
評価関数で Mac# = 2 を設定し、鏡筒の重心位置 (Hx) と質量 (Hy) を入力して、報告されるデータ値の変化を確認します。
評価関数の評価を高速化するために、このマクロは Data = 0 の場合にのみ実行される点を念頭に置きます。
KA-01954
コメント
記事コメントは受け付けていません。