カスタムの制約と目的関数を使用した操作点の計算
通常,最適化ベースの探索を使用して仿金宝app真软件®モデルの定常状態の操作点を計算するには,既知の固定値または範囲を指定してモデルの状態,入力,または出力を制約します。ただし,一部のシステムやアプリケーションでは,最適化探索のパラメーター定義においてさらに柔軟性が必要となります。
そのようなシステムの場合,カスタムの制約または追加の最適化目的関数,あるいはその両方を指定することができます。ソフトウェアは,定常状態の操作点を計算するときに,標準の状態,入力,および出力仕様に加えてこれらのカスタムの制約と目的関数を適用します。
カスタムの等式制約と不等式制約は,モデルの状態,入力,および出力の代数的組み合わせとして指定できます。これらの制約では,入力,出力,および状態間の既知の関係を指定することで操作点の探索空間を制限できます。たとえば,モデルのある状態が他の2の状態の和となるように指定できます。
また,カスタムのスカラー目的関数を,モデルの状態,入力,および出力の代数的組み合わせとして指定することもできます。目的関数を使用して,アプリケションの要件に基づき定常状態の操作点を最適化できます。たとえば,可能性のある平衡点がモデルに複数あるとします。目的関数を指定して,入力エネルギが最小の状態安定点を検出できます。
複雑なモデルの場合,モデルの入力,出力,および状態のサブセットを選択してカスタムのコスト関数および制約関数へ渡す,カスタムのマッピング関数を指定できます。
モデルを平衡化する場合,次の方法でカスタムの最適化関数を指定できます。
コマンドラ邮箱ン:
operspec
を使用して操作点の仕様を作成し,仕様のCustomConstrFcn
、CustomCostFcn
,およびCustomMappingFcn
プロパティを使ってカスタム関数を指定します。定常状態マネ定常状態マネジャの使用:[仕様]タブで,[平衡化オプション]をクリックします。[平衡化オプション]ダ电子书阅读器アログボックスの[カスタム最適化関数]セクションで,関数名を指定します。
モデル線形化器の使用:[線形解析]タブの[操作点]ドロップダウンリストで,[モデルの平衡化]をクリックします。[モデルの平衡化]ダイアログ ボックスで、[オプション]タブの[カスタム最適化関数]セクションで関数名を指定します。
次の例では,カスタム最適化関数を作成する方法と,コマンドラインでこれらのカスタム関数を使用してモデルを平衡化する方法を説明します。
金宝appSimulinkモデル
この例では,オリフィスで相互に連結された3のタンクをもモデルを使用します。
mdl =“scdTanks”;open_system (mdl)
Tank1とTank2間のフロは望ましい状態です。Tank2とTank3間のフロは望ましくない回避不可能な漏れです。
このシステムの予想される定常状態は次のようになります。
坦克1と坦克2の圧力が同じである。
坦克2と坦克3の間に負荷を補償するほぼ一定の圧力差
1
がある。
Tank1とTank2の連結が弱いため,Tank1とTank2の圧力が等しくなるようにモデルを平衡化するのは困難です。
カスタマ邮箱ズなしでのモデルの平衡化
モデルの既定の操作点の仕様を作成します。仕様は3つすべてのタンク圧力を,平衡化された操作点において定常状態になければならない自由な状態として設定します。
Opspec = operspec(mdl);
モデルを平衡化するオプションセットを作成し,操作点探索レポートのコマンドウィンドウを非表示に設定します。具体的な平衡化オプションはアプリケションによって異なります。この例では,非線形最小二乗最適化を使用します。
opt = findopOptions(“OptimizerType”,“lsqnonlin”);opt.DisplayReport =“关闭”;
モデルを平衡化し,平衡化されたタンク圧力を表示します。
[op0,rpt0] = findop(mdl,opspec,opt);op0。州
ans = x ____ (1.) scdTanks/惯性0 (2.)scdTanks/Tank1 9 (3.) scdTanks/Tank2 9.5 (4.) scdTanks/Tank3 10.5
坦克1と坦克2の平衡化された圧力は一致しません。したがって,既定の操作点の仕様では,期待される定常状態の要件を満たす操作点を見つけることができません。制約の許容誤差opt.OptimizationOptions.TolCon
を小さくした場合,Tank2とTank3の間に漏れがあるため,実行可能な定常状態解が得られません。
カスタムの制約の追加
カスタムの制約を指定するには,現在の作業フォルダーかMATLABパス上に,次の入力引数をもつ関数を定義します。
x
-操作点の仕様の状態。ベクトルとして指定します。u
-操作点の仕様の入力。ベクトルとして指定します。y
-操作点の仕様の出力。ベクトルとして指定します。
出力引数は次のとおりです。
c_ineq
-平衡化中にC_ineq <= 0
を満たさなければならない不等式制約。ベクトルとして返されます。c_eq
-平衡化中にC_eq = 0
を満たさなければならない等式制約。ベクトルとして返されます。
c_ineq
とc_eq
の各要素は単一の制約を指定します。アプリケーションの具体的な制約を、状態、入力、および出力の代数的な組み合わせとして定義します。カスタムの等式制約や不等式制約がない場合は、対応する出力引数を[]
として返します。
この例では,予期される定常状態の条件を満たすため,次のカスタムの制約関数を定義します。
函数[c_ineq, c_eq] = myConstraints (x, y) c_ineq = [];C_eq = [x(2)-x(3);%坦克1压力-坦克2压力x (3) - x (4) + 1];%坦克2压力-坦克3压力+ 1结束
c_eq
の最初のエントリは,坦克1と坦克2の圧力が同じ値になるよう制約します。2 .番目の等式制約は,Tank2とTank3間の圧力低下を定義します。
操作点の仕様にカスタムの制約関数を追加します。
opspec。CustomConstrFcn = @myConstraints;
カスタムの制約を含む修正された操作点の仕様を使用してモデルを平衡化し,平衡化された状態値を表示します。
[op1,rpt1] = findop(mdl,opspec,opt);op1。州
ans = x ______ (1.) scdTanks/惯性0 (2.)scdTanks/Tank1 9.3333 (3.) scdTanks/Tank2 9.3333 (4.) scdTanks/Tank3 10.333 . ans = x ______
カスタムの制約関数を使ってモデルを平衡化すると,予期したとおりに最初と2番目のタンクの圧力が等しい操作点が生成されます。また,想定のとおり,3番目と2番目のタンク間には1
の圧力差があります。
指定された制約の最終値を調べるには,操作点探索レポトのCustomEqualityConstr
プロパティとCustomInequalityConstr
プロパティをチェックできます。
rpt1。CustomEqualityConstr
Ans = 1.0e-06 * -0.0001 -0.1540
ゼロに近い値は等式制約が満たされていることを示します。
カスタムの目的関数の追加
カスタムの目的関数を指定するには,カスタムの制約関数と同じ入力引数(x
、u
,およびy
)と,出力引数F
をも関数を定義します。F
は,平衡化中に最小化される目的関数値で,スカラ,として返されます。
アプリケション用の目的関数を,状態,入力,および出力の代数的な組み合わせとして定義します。
この例では,Tank3の圧力を[16,20]の範囲内に保持すると仮定します。ただし,この条件が常に可能であるとは限りません。したがって,厳密な制約を課すのではなく,圧力が[16、20]の範囲に収まらない場合にペナルティを課す目的関数を追加します。そのためには,次のカスタムの目的関数を定義します。
函数F = myObjective (x, y) F = max (x(4) -20,0) +马克斯(16 x (4), 0);结束
操作点の仕様オブジェクトにカスタムの目的関数を追加します。
opspec。CustomObjFcn = @myObjective;
カスタムの制約と目的関数の両方を使用して操作点を平衡化し,平衡化された状態値を表示します。
[op2,rpt2] = findop(mdl,opspec,opt);《凤凰社》第2章。州
ans = x __ (1.) scdTanks/惯性0 (2.)scdTanks/Tank1 15 (3.) scdTanks/Tank2 15 (4.) scdTanks/Tank3 16 .
平衡化された操作点では,Tank3の圧力がカスタムの目的関数で指定された[16、20]の範囲内にあります。
スカラ目的関数の最終値を表示するには,操作点探索レポトのCustomObj
プロパティをチェックします。
rpt2。CustomObj
Ans = 0
カスタムのマッピングの追加
複雑なモデルの場合,カスタムのマッピングを定義してモデルの状態,入力,および出力の部分集合を選択し,カスタムの制約および目的関数に渡すことができます。これを行うと,不要な状態,入力,および出力が排除され,制約と目的関数が簡素化されます。
カスタムのマッピングを指定するには,操作点の仕様opspec
を入力引数とし,以下を出力引数とする関数を定義します。
indx
—マッピングされた状態の邮箱ンデックスindu
—マッピングされた入力の邮箱ンデックス印第
—マッピングされた出力の邮箱ンデックス
ブロックパスと状態名に基づいて状態,入力,および出力の,ンデックスを取得するには,getStateIndex
、getInputIndex
,およびgetOutputIndex
を使用します。これらのコマンドの使用は,モデルの状態の追加など,将来のモデル変更に対してロバストです。あるいは,ンデックスを手動で指定することもできます。indx
、indu
,および印第
の形式の詳細にいては,getStateIndex
、getInputIndex
,およびgetOutputIndex
を参照してください。
カスタムの制約と目的関数によって使用される状態,入力,出力がない場合は,対応する出力引数を[]
として返します。
この例では,3のタンクの圧力状態のみを含むマッピングを作成します。そのためには,次のカスタムのマッピング関数を定義します。
函数[indx,indu,indy] = myMapping(opspec) indx = [getStateIndex(opspec,“scdTanks / Tank1”);getStateIndex (opspec“scdTanks / Tank2”);getStateIndex (opspec“scdTanks / Tank3”));Indu = [];Indy = [];结束
操作点の仕様にカスタムのマッピングを追加します。
opspec。CustomMappingFcn = @myMapping;
カスタムのマッピング関数を使用する場合,カスタムの制約および目的関数内の状態,入力,および出力のインデックスは,マッピング関数に指定された順序に対して相対的でなければなりません。カスタムの制約と目的関数を新しいマッピングで更新します。
函数[c_ineq,c_eq] = myConstraintsMap(x,u,y) c_ineq = [];C_eq = [x(1)-x(2);%坦克1压力-坦克2压力x (2) - x (3) + 1];%坦克2压力-坦克3压力+ 1结束
函数F = myObjectiveMap (x, y) F = max (x(3) -20,0) +马克斯(16 x (3), 0);结束
ここでx
、u
,およびy
は,それぞれマッピングされた状態,入力,出力のベクトルです。これらのベクトルは,indx
、indu
,および印第
で指定されるマッピングされた値をそれぞれ含みます。
更新されたカスタム関数を操作点の仕様に追加します。
opspec。customconstraintsmap = @myConstraintsMap;opspec。CustomObjFcn = @myObjectiveMap;
カスタムマッピングを使用してモデルを平衡化し,平衡化された状態を表示します。これは《凤凰社》第2章
での前の結果と一致します。
[op3,rpt3] = findop(mdl,opspec,opt);op3。州
ans = x __ (1.) scdTanks/惯性0 (2.)scdTanks/Tank1 15 (3.) scdTanks/Tank2 15 (4.) scdTanks/Tank3 16 .
カスタム関数への解析勾配の追加
計算の速度や信頼性を高めるため,カスタムの制約および目的関数に解析勾配を追加できます。勾配を追加することで最適化時の関数呼び出しの回数を減らし,最適化の結果の精度を改善できることがあります。勾配を指定する場合,これはカスタムの制約と目的関数の両方に指定しなければなりません(カスタムの平衡化での勾配はSimscape™モデルではサポートされていません)。
特定の制約または目的関数の勾配を定義するには,その関数の,特定の状態,入力,または出力についての導関数を使用します。たとえば,次の目的関数があるとします。
F = (u(1)+3)²+ y(1)²
この場合,u (1)
にいてのF
の勾配は次のとおりです。
G = 2*(u(1)+3)
カスタムの制約関数に勾配を追加するには,次の追加の出力引数を指定します。
G_ineq
-不等式制約の勾配配列G_eq
-等式制約の勾配配列
G_ineq
とG_eq
の各列に1の制約の勾配が含まれ,列の順序は対応する制約ベクトルの行の順序に一致します。G_ineq
とG_eq
の両方で,行数はx
、u
,およびy
の状態,入力,および出力の合計数に等しくなります。各列にはx
の状態にいての勾配,続いてu
の入力とy
の出力にいての勾配が含まれます。
この例では,カスタムマッピングを使用する制約関数に勾配を追加します。勾配を使用するときにカスタムマッピングを指定する必要はありません。ただし,状態,入力,および出力のマッピングされた部分集合を使用すると,勾配の定義がより簡単です。
函数[c_ineq,c_eq,G_ineq,G_eq] = myConstraintsGrad(x,u,y) c_ineq = [];C_eq = [x(1)-x(2);%坦克1压力-坦克2压力x (2) - x (3) + 1];%坦克2压力-坦克3压力+ 1G_ineq = [];G_eq = [1 0;1 1;0 1];结束
この関数ではG_eq
の我
行目に状態x(我)
にいての勾配が含まれています。
同様に,カスタムの目的関数に勾配を追加するには,F
の勾配を含む追加の出力引数G
を指定します。G
は,G_ineq
およびG_eq
の列と同じ形式の列ベクトルとして返されます。
函数(F, G) = myObjectiveGrad (x, y) F = max (x(3) -20,0) +马克斯(16 x (3), 0);如果x(3) >= 20 G = [0 0 1]';elseifx(3) <= 16 G = [0 0 -1]';其他的G = [0 0 0]';结束结束
この例の目的関数は区分的に微分可能なので,G
の値はTank3の圧力の値によって異なります。
更新されたカスタム関数を操作点の仕様に追加します。
opspec。CustomConstrFcn = @myConstraintsGrad;opspec。CustomObjFcn = @myObjectiveGrad;
最適化アルゴリズムで勾配を有効にするには,雅可比矩阵
最適化オプションを有効にします。
opt.OptimizationOptions.Jacobian =“上”;
定常状態マネ定常状態マネジャまたはモデル線形化器を使用してモデルを平衡化するときに解析ヤコビアンを使用するには,[解析ヤコビアンを有効化]平衡化オプションを選択します。
勾配をもカスタム関数を使用してモデルを平衡化し,平衡化された状態を表示します。
[op4,rpt4] = findop(mdl,opspec,opt);op4。州
ans = x __ (1.) scdTanks/惯性0 (2.)scdTanks/Tank1 15 (3.) scdTanks/Tank2 15 (4.) scdTanks/Tank3 16 .
最適化の結果は,勾配をもたない解の結果と同じです。
勾配によって最適化の効率が改善するかどうかをチェックするには,操作点探索レポトを確認します。たとえば,解に対する関数評価の数を比較します。
勾配なし:
rpt3.OptimizationOutput.funcCount
Ans = 25
勾配あり:
rpt4.OptimizationOutput.funcCount
Ans = 5
この例では,解析勾配の追加によって,最適化時の関数呼び出しの回数が減ります。
参考
findop
|operspec
|getStateIndex
|getInputIndex
|getOutputIndex