パラメトリック解析結果出力の利用
この例では、Femtetのパラメトリック解析の出力設定を目的関数として使用する方法について説明します。
動機
PyFemtet を使用すると、少ないコードで最適化を実行できます。ただし、目的関数は Femtet Python マクロを使ってコーディングする必要があります。この機能を使用すると、目的関数をコーディングすることなく、Femtet GUI で設定された結果を最適化のための目的関数として利用できます。
サンプルファイル
注釈
サンプルプロジェクト を Femtet で開いたまま、 サンプルコード をダブルクリックして実行してください。
注釈
FEM 問題としての詳細については、FemtetHelp / 例題集 / 磁場解析 / 例題12 を参照してください。
備考
警告
この機能に関して、以下のことに注意してください。
プロジェクトファイルからパラメトリック解析のスイープテーブルが削除されます。
ベクトル・複素数などの複数の値の出力に関しては、第一の成分しか考慮しません(例:ベクトルなら X 成分、複素数なら実部)。
設計変数と解析条件
解析モデルの概要と設計変数
変数名 |
説明 |
|---|---|
out_radius |
外側コイルの半径 |
in_radius |
内側コイルの半径 |
目的関数
相互インダクタンス(ターゲット値 150 nH)
コイル中央部での磁界の Z 成分(最小化)
サンプルコード
1"""パラメトリック解析出力設定を目的関数とする最適化
2
3Femtet のパラメトリック解析の結果出力設定機能で出力される値を
4最適化の目的関数として使用する方法をデモします。
5この機能により、目的関数をコーディングすることなく
6最適化を実施できます。
7
8
9注意:
10
11 この機能を使う際は、以下のことに注意してください。
12
13 - パラメトリック解析のスイープテーブルが削除されます。
14 - 複素数やベクトルを出力する出力設定は、第一の値のみが
15 目的関数として使用されます。(複素数の場合は実数、
16 ベクトル値の場合は X 成分など)
17
18
19対応するプロジェクト: gau_ex12_parametric.femprj
20"""
21
22from pyfemtet.opt import FEMOpt, FemtetInterface
23
24
25if __name__ == '__main__':
26
27 # Femtet の設定を参照するため、Femtet と接続を
28 # 行うためのオブジェクトを初期化します。
29 fem = FemtetInterface()
30
31 # パラメトリック解析の結果出力設定を目的関数にします。
32 # number は Femtet パラメトリック解析ダイアログの
33 # 結果出力設定タブのテーブルの番号で、direction は
34 # その目的関数の目標です(FEMOpt.add_objective と同様)。
35
36 # 相互インダクタンス
37 fem.use_parametric_output_as_objective(number=1, direction=1.5e-7)
38
39 # コイル中央の磁界の強さ
40 fem.use_parametric_output_as_objective(number=2, direction='minimize')
41
42 # 最適化用オブジェクトを初期化します。
43 # さきほど初期化した fem を渡します。
44 femopt = FEMOpt(fem=fem)
45
46 # パラメータを設定します。
47 femopt.add_parameter('in_radius', 10, 5, 10)
48 femopt.add_parameter('out_radius', 20, 20, 25)
49
50 # 最適化を実行します。
51 femopt.set_random_seed(42) # 乱数シードの固定
52 femopt.optimize(n_trials=20)
サンプルコードの実行結果
gau_ex12_parametric.py の実行結果です。目的関数の計算に関するコードはありませんが、最適化は出力設定を目的関数として正しく利用しています。
注釈
Femtet, PyFemtet および依存する最適化エンジンのバージョンにより、結果は多少異なる場合があります。
(参考) Femtet での結果出力設定の概要
ここからダイアログを開きます。
「結果出力設定」タブを開き、「追加」を押し、(その後出力設定を行い、)「設定保存」を押します。
より詳細は、Femtet ヘルプを参照してください。