ソルバーの選択:NonlinearBlockGSとNewtonSolver

Aug 22 2020

グループ間に循環依存関係がある2つのopenmdaoグループがあります。 Complexステップを使用して導関数を計算します。依存関係の非線形ソルバーがあり、SLSQPを使用して目的関数を最適化します。問題は、非線形ソルバーの選択にあります。私が使用するとNonlinearBlockGS、最適化は12回の反復で成功します。しかし、を使用NewtonSolverDirectsolverたりScipyKrylov、最適化が失敗したりすると(反復制限を超えた)、。を使用してもmaxiter=2000。循環接続は収束しますが、設計変数が最適値に達していないだけです。連続する反復での設計変数の違いは、1e-5の順序です。そして、これにより必要な反復が増加します。また、初期推定値を最適値に近い値に変更すると、機能します。

さらに確認するために、モデルをIDFに変換し(結合変数と整合性制約のコピーを作成することにより)、ソルバーの必要性を排除しました。これで、最適化は5回の反復で成功し、結果NonlinearBlockGSはを使用した場合の結果と同様になります。

なぜこれが起こるのですか?私は何かが足りないのですか?いつNewtonSolver他の人よりも使うべきですか?コードを見ずに答えるのは難しいことを私は知っています。しかし、私のコードは複数のコンポーネントで長く、おもちゃのモデルで問題を再現できなかっただけです。したがって、一般的な洞察は大歓迎です。

回答

2 JustinGray Aug 22 2020 at 08:57

コードを見ずに、詳細を説明するのは難しいことは間違いありません。

非常に大まかに言えば、ニュートンはNLBGSよりも収束に多くの問題を抱えている場合があります(注:これは絶対に正しいわけではありませんが、経験則としては適切です)。したがって、私が推測するのは、1回目または2回目の反復で、ニュートンソルバーが実際には収束していないということです。これnewton.options['iprint']=2は、オプティマイザーが反復するときに反復履歴を設定して確認することで確認できます。

最適化にソルバーがある場合、非収束時にエラーをスローするようにソルバーを設定することも重要です。一部のオプティマイザはこのエラーを処理でき、ライン探索をバックトラックします。他の人はただ死ぬでしょう。いずれにせよ、その重要性。そうしないと、オプティマイザーに、収束していないことがわからない収束していないケースを与えることになります。

これは2つの理由で悪いです。まず、取得する目的と制約の値が間違っていることになります。第二に、そしておそらくもっと重要なことに、それが計算する導関数は間違っているでしょう!詳細は[理論マニュアルで]読むことができますが、要約すると、OpenMDAOが使用する解析微分法は、残差が0になっていると想定しています。そうでない場合、数学は失敗します。フルモデルの有限差分を実行している場合でも、非収束モデルは問題です。 FDしようとすると、ノイズの多いゴミが発生します。2

したがって、モデルを正しく設定し、線形ソルバーに問題を設定していると仮定すると(NLBGSで動作するため、問題が発生しているように聞こえます)、ニュートンソルバーが収束していない可能性があります。iprintを使用し、場合によってはドライバーデバッグ印刷と組み合わせて、これを自分で確認します。その場合は、ニュートンの動作を改善する方法を理解する必要があります。

ここには、かなり一般的なヒントがいくつかあります。また、armijoライン探索を使用してみることができます。これは、速度を犠牲にしてニュートンソルブを安定させることができます。

最後に...ニュートンはすべての状況で最良の答えではありません。NLBGSがより安定していて、計算コストが安い場合は、それを使用する必要があります。ニュートンで動作させたいというあなたの願望を称賛します。なぜそうではないのかを確実に突き止める必要がありますが、ニュートンが結合された問題を確実に解決できないことが判明した場合は、それも問題ありません!