0

私は OpenMDAO を初めて使用し、問題を定式化する方法をまだ学んでいます。簡単な例として、指定された境界を持つ 3 つの入力変数があるとします。

1 <= x <= 10
0 <= y <= 10
1 <= z <= 10

そして、次のように定義された4つの出力があります。

f1 = x * y
f2 = 2 * z
g1 = x + y - 1
g2 = z

私の目標は、f1 * g1 を最小化することですが、制約 f1 = f2 および g1 = g2 を強制します。たとえば、1 つの解は x=3、y=4、z=6 です (これが最適かどうかはわかりません)。

この単純な問題の場合、出力の等値制約をドライバーに渡すだけでよいでしょう。しかし、私の実際の問題では、すべての制約を満たす最初の開始点を見つけるのは難しく、その結果、オプティマイザーは何もできませんでした。y と z を暗黙的なコンポーネントの状態として定義し、非線形ソルバーに x を指定して y と z の正しい値を計算させ、x を最適化ドライバーに渡すことができると思います。

これは可能なアプローチですか?もしそうなら、この場合、暗黙的なコンポーネントはどのようになりますか? セラー問題のチュートリアルを見ましたが、このケースに翻訳できませんでした。

4

1 に答える 1

1

必要に応じて、暗黙的なコンポーネントを作成できます。その場合、apply_linearコンポーネントでメソッドを定義します。それはここで売り手の問題で行われます。

あなたの場合、両方とも状態変数に依存する残差の 2 つの方程式セットがあるため、長さ 2 の単一の配列状態変数を作成して呼び出すことをお勧めしますfoo(混乱を避けるために新しい変数を使用しましたが、名前を付けますあなたが望むものなら、なんでも!)。次に、新しい状態変数の残差配列の各要素に対して 1 つずつ、2 つの残差を定義します。

何かのようなもの:

resids['foo'][0] = params['x'] * unknowns['foo'][0] - 2 * unknowns['foo'][1]
resids['foo'][1] = params['x'] + unknowns['foo'][0] - 1 - unknowns['foo'][1]

状態変数名を分けておきたい場合は、それが可能であり、それでも機能します。1 つの残差方程式を 1 つの変数に、1 つの残差方程式を別の変数に任意に割り当てる必要があるだけです。

次に、暗黙的なコンポーネントを含むグループに非線形ソルバーを追加するだけで、機能するはずです。ニュートン ソルバーを使用する場合は、fd_options['force_fd'] = Trueすべてのパラメーターと状態変数に関する残差の導関数を設定または定義する必要があります。

于 2015-10-21T11:47:32.913 に答える