ニュートンの方法が収束しないのはなぜですか?


22

私は、PETScの非線形ソルバーパッケージSNESを使用して、偏微分方程式を離散化して得られた非線形方程式のシステムを解いています。ソルバーが収束しない理由と、方程式を正常に解くにはどうすればよいですか?


8
他の反復​​法と同様に、ニュートンラプソン法を開始するための適切なシードを見つけることが最も重要です。悪い出発点はしばしば混乱をもたらします。
JM

6
「しばしば混乱を招く」とは間違っていると思います。Blum、Cucker、Shub、およびSmaleを参照すると、Newtonには、境界で区切られた魅力的な盆地があり、混chaとした反復が発生する可能性があります。したがって、この種の動作は収束と比較して非常にまれです。アルゴリズムが実際のソリューションのみを探している場合、収束に失敗することが多くなりますが、カオスにはなりません。
マットネプリー

5
@Mattという非技術的な意味での「カオス」を意味しました。たとえば、無限への発散、または周期的な動作。たぶん、「災害」がより良い言葉の選択だっただろうか?
JM

回答:


42

ニュートンの方法は多くの理由で収束しない場合がありますが、ここに最も一般的なものがいくつかあります。

  • ヤコビアンが間違っています(または、シーケンシャルでは正しいがパラレルではありません)。
  • 線形システムが解決されていないか、十分に正確に解決されていません。
  • ヤコビアンシステムには、線形ソルバーが処理しない特異点があります。
  • 関数評価ルーチンにバグがあります。
  • この関数は連続的ではないか、連続的な一次導関数がありません(たとえば、相変化やTVDリミッター)。
  • 方程式には解がない場合(定常状態ではなくリミットサイクルなど)がある場合や、初期推測と定常状態の間に「丘」がある場合があります(定常状態に達する前に反応物が発火して燃焼しなければならないが、状態残留は燃焼中により大きくなります)。

ニュートンの収束の欠如をデバッグするためのいくつかの方法を以下に示します。

  • オプションを使用して実行します-snes_monitor -ksp_monitor_true_residual -snes_converged_reason -ksp_converged_reason。線形解が収束しない場合、ヤコビアンが正しいかどうかを確認してから、この質問を参照してください。前処理された残差が収束するが、真の残差が収束しない場合、前処理は特異である可能性があります。線形解がうまく収束するが、線探索が失敗する場合、ヤコビアンは正しくない可能性があります。
  • with -pc_type lu or -pc_type svdを実行して、問題が貧弱な線形ソルバーかどうかを確認します
  • -mat_viewまたはで実行して-mat_view_draw、ヤコビアンが合理的に見えるかどうかを確認します
  • with -snes_type test -snes_test_displayを実行して、使用しているヤコビアンが間違っているかどうかを確認します。追加時に出力を比較して-mat_fd_type ds、結果が差分パラメーターの選択に影響されるかどうかを確認します。
  • with -snes_mf_operator -pc_type luを実行して、使用しているヤコビアンが間違っているかどうかを確認します。問題が直接解決するには大きすぎる場合は、を試してください-snes_mf_operator -pc_type ksp -ksp_ksp_rtol 1e-12。追加時に出力を比較して-mat_mffd_type ds、結果が差分パラメーターの選択に影響されるかどうかを確認します。
  • 1つのプロセッサで実行して、問題が並行しているかどうかを確認します。
  • with -snes_ls_monitorを実行して、行検索が失敗しているかどうかを確認します(これは通常、不良ヤコビアンの兆候です)。
  • -infoソリューションプロセスに関する詳細情報を取得するには、with を実行します。

上記のすべてがチェックアウトされた場合にニュートンプロセスを支援するいくつかの方法を以下に示します。

  • より細かいメッシュでより良い初期推測を生成するために、グリッドシーケンスを使用して実行し-snes_grid_sequenceます(で作業する場合に必要なものはすべてですDM
  • 4倍精度で実行(./configure --with-precision=__float128 --download-f2cblaslapackPETSc 3.2以降ではバージョン4.6以降のGNUコンパイラが必要)
  • 単位(無次元化)、境界条件のスケーリング、または定式化を変更して、ヤコビアンの条件を改善します。
  • 連続一次導関数を持たない関数内のフィーチャを緩和します(if相変化やTVDリミッターなどの残留評価にステートメントがある場合によく発生します)。不連続性が根本的に重要な場合は、変分不等式ソルバー(SNESVINEWTONRSLS)を使用します。
  • 信頼領域の方法を試してください(-ts_type tr、パラメーターの調整が必要な場合があります)。
  • 解を知っているポイントからいくつかの継続パラメーターを使用して実行します。定常状態の問題の解決については、TSPSEUDOを参照してください。PHCpackのようなホモトピーソルバーパッケージは、すべての可能なソリューションを取得できます(そして、それらすべてを見つけたと伝えます)が、それらはスケーラブルではなく、小さな問題以外は何も解決できません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.