有限要素のためのNDSolveオプション
概要
Wolfram言語に実装された有限要素法を使ったことがないという場合には,このチュートリアルはおそらくよい出発点とはならないであろう.有限要素法の概要を得るには,まず「有限要素法で偏微分方程式を解く」のチュートリアルを読むとよい.このチュートリアルでは,有限要素法の詳細を細かく調整する方法について説明する.
微分方程式には,常微分方程式,偏微分方程式,非線形微分方程式,時間依存微分方程式等,さまざまな形式がある.これらのさまざまな微分方程式を解くためのメソッドは数多く存在するが,それぞれ長所と短所があり,特定の問題を解くのに適切なものは違ってくる.さらに物事を複雑にするのは,これらのアルゴリズムの多くには特定の微分方程式をより速く,より少ないメモリで解くことができたり,まったくできなかったりするのを調整するあtめのパラメータがあるという点である.Wolfram言語では,NDSolveファミリの関数は,これらのアルゴリズムを集め,それらに使えるインターフェースを提供する.与えられた微分方程式の記号的解析に基づいて,自動的にアルゴリズムが作用する.これは多くの場合うまく作動する.Wolfram Researchでは,方程式解析と,特定の微分方程式を解くためのアルゴリズムの自動選択に非常に力を入れているからである.調整パラメータの合理的なデフォルト値も自動的に求められる.
一般に,アルゴリズムの自動選択は適切であるが,時には,別のアルゴリズムを選んだり,調整パラメータを修正したりすることが望ましいこともある.
このチュートリアルの目的は,NDSolveで実装される有限要素法でどのアルゴリズムとアルゴリズムオプションが使えるかについての概要を提供することにある.このチュートリアルでは,どのアルゴリズムが自動的に選ばれるかについて,および別のアルゴリズムを選ぶ方法についても説明する.それぞれのメソッドについて,使用可能な調整パラメータを紹介および説明,または例が与えられている有限要素法ドキュメントの他のセクションへのリンクを提供する.
このチュートリアルでは,NDSolveについて何度も言及する.ここで述べられるすべては,関連関数であるNDSolveValueにも当てはまる.NDSolveとNDSolveValueでは,計算された解が返される形式が異なる.NDSolveがInterpolatingFunctionオブジェクトと一緒に規則のリストを返すのに対し,NDSolveValueは直接InterpolatingFunctionオブジェクトを返す.
このチュートリアルの中には,典型的なドキュメントの例を評価する場合よりも,長い時間がかかり,より多くのメモリを要する部分もある.
NDSolveオプション
このセクションでは,NDSolveの一般的なオプションが提示し,有限要素法の面から見ていく.
以下では,オプションのリストと,有限要素法においてそれらのオプションが何を意味するかを示す.
AccuracyGoal
AccuracyGoalオプションが指定されると,その値はNDSolveが使うすべてのアルゴリズムで使われるようになる.このため,異なるアルゴリズムでAccuracyGoalの値を違うものにすることも可能である.例えば,MeshOptionsを通して指定した場合には,時間積分とメッシュ生成に異なるAccuracyGoalを使うことが可能である.
現行バージョンでは,有限要素法は自動的な適用メッシュ生成を利用しない.一様ではないメッシュセルのサイズは,MeshRefinementFunctionを指定することによって使える.
Compiled
Compiledオプションは,数多くのさまざまな関数に使われ,使用する式が自動的にコンパイルされるべきであるかどうかを指定する.有限要素法は機械精度で使用でき,常に必要に応じて偏微分方程式の係数と境界条件を自動的にコンパイルするので,このオプションは有限要素の計算には影響しない.詳細は,チュートリアル 「有限要素法の使用上のヒント」の「偏微分方程式係数の効率的な評価」のセクションを参照されたい.
DependentVariable
DependentVariableは,有限要素法のコンテキスト外でも同じ意味を持つ.
DiscreteVariable
DiscreteVariableは,有限要素法のコンテキスト外でも同じ意味を持つ.
EvaluationMonitor
時間依存の偏微分方程式については,EvaluationMonitorは有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,このオプションは意味を持たない.非線形定常偏微分方程式にEvaluationMonitorが必要な場合には,EvaluationMonitorはFindRootのオプションを通して指定されなければならない.これは,FindRootOptionsのセクションに説明されている.
有限要素法を使う偏微分方程式の時間積分を行っている最中に,進捗を管理するモニターを使用する方法の例は,ここにある.
ExtrapolationHandler
Wolfram言語の補間関数は,その領域外でクエリが行われると,外挿する.有限要素分析では,外挿が物理的に正しい値を返すことはほとんどあり得ないので,これは望ましくない.有限要素分析からの補間関数NDSolveの戻りは,外挿値としてIndeterminateを返す.この動作はオフにすることが可能である.
結果の補間関数は,解の領域に属さない点においてクエリを行うことができる.これを行うと,警告メッセージと外挿された値としてIndeterminateが返される.
この動作を変更するには,補間関数が外挿値を返し,不要な警告メッセージが表示されないようにすればよい.
解の領域外におけるクエリの点が外挿値を返し,警告メッセージは表示されなくなった.
"DefaultExtrapolationHandler"システムオプションを設定すると,デフォルトの動作を変更することができる.
ElementMeshInterpolationの関数ページにも例がある.
InitialSeeding
非線形定常偏微分方程式には,初期シードが必要かもしれない.InitialSeedingは,ニュートン法の最初の予想を指定して,非線形偏微分方程式の解を求めるメカニズムを提供する.InitialSeedingのページに詳細が記載されている.
InterpolationOrder
NDSolveに関連して,オプションInterpolationOrderの唯一の値は,Automatic以外ではInterpolationOrderAllしかない.通常,NDSolveは時間積分中のすべてのタイムステップからの結果を保存する.InterpolationOrderAllが指定されると,追加情報がInterpolatingFunctionに保存され,より正確な中間ステップの補間が可能となる別の補間メソッドが使用できる.これは密な出力と呼ばれることもある.この方法の利点は,中間ステップの角度が非常に高いということである.しかし,より多くの情報を保存しなければならないので,InterpolatingFunctionのサイズは増加する.例はInterpolationOrderのページを参照されたい.
定常の場合には,このオプションを使っても影響がない.InterpolatingFunctionの補間次数は有限要素メッシュの次数から導き出される.
MaxStepFraction
時間依存の偏微分方程式については,MaxStepFractionは,有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,オプションは意味を持たない.
MaxSteps
時間依存の偏微分方程式については,MaxStepsは,有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,オプションは意味を持たない.
MaxStepSize
時間依存の偏微分方程式については,MaxStepSizeは,有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,オプションは意味を持たない.
Method
NDSolveのMethodオプションの使用はこのドキュメントの大きな目的であり,以下に示す.
NormFunction
有限要素法ではオプションNormFunctionを使っても何も影響がない.
PrecisionGoal
PrecisionGoalが指定されると,その値はNDSolveが使うすべてのアルゴリズムに伝播する.このため,異なるアルゴリズムに異なるPrecisionGoalの値を使うことが可能である.例えば,MeshOptionsを通して指定される場合には,時間積分とメッシュ生成に異なる PrecisionGoalを使うことができる.
現行バージョンでは,有限要素法は適用メッシュ生成を利用しない.
StartingStepSize
時間依存の偏微分方程式については,StartingStepSizeは,有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,オプションは意味を持たない.
StepMonitor
時間依存の偏微分方程式については,StepMonitorは,有限要素法のコンテキスト外でも同じ意味を持つ.定常の偏微分方程式については,オプションは意味を持たない.非線形定常偏微分方程式にStepMonitorが必要な場合には,FindRootのオプションを通してe StepMonitor が指定されなければならない.このことは,FindRootOptionsのセクションに説明がある.
有限要素法を使う偏微分方程式の時間積分を行っている最中に,進捗を管理するモニターを使用する方法の例は,ここにある.
WorkingPrecision
WorkingPrecisionは,非有限要素の場合と同じ意味を持つ.
解の段階でのメソッドオプション
有限要素法(FEM)とは,偏微分方程式の空間成分を離散化するメソッドである.FEMは,テンソル積格子法(TPG)の姉妹編である.TPGはFEMと同じ目的で使われるが,結果を計算するのに異なるメソッドを使い,異なる長所と短所を持つ.テンソル積格子法は,通常より正確であり,微分方程式を速く解くが,任意領域と時間独立(定常)方程式に使うことができない.対して有限要素法ではそれが可能である.テンソル積格子法については,「線の方法」のチュートリアルにより詳しく説明されている.
NDSolveが使うアルゴリズムの選択は,NDSolveのメソッドオプションを設定することに影響される.NDSolveのオプションがどのように構造化されているかを理解するためには,NDSolveがバージョン10まではほとんど時間依存の微分方程式を解くのに使われていたということを知ると分かりやすい.時間独立の問題の中には,シューティング法等のメソッドを使って解くことができるものもあったが,主にNDSolveのアルゴリズムは微分方程式の時間積分のためのものであった.バージョン10で有限要素法が追加され,それに伴い,定常偏微分方程式が解けるようになったのである.
NDSolveは通常,方程式の種類によるが,いくつかの異なる段階を通して微分方程式を解く.Method{s1m1,s2m2,…}では,段階 si はメソッド mi で処理される.使用される実際の段階とその次数は,解く問題に基づいてNDSolveが決定する.
"TimeIntegration" | 微分方程式系の時間積分 | |
"BoundaryValues" | 常微分方程式の境界値の解 | |
"DiscontinuityProcessing" | 非連続微分方程式の処理の記号過程 | |
"EquationSimplification" | 数値評価の方程式形式の簡略化 | |
"IndexReduction" | 微分代数方程式の記号的指標の簡約 | |
"DAEInitialization" | 微分代数方程式の一貫した初期化 | |
"PDEDiscretization" | 偏微分方程式の離散化 |
有限要素法のすべての空間離散化オプションは,"PDEDiscretization"段階と通して設定される."BoundaryValues"段階は,有限要素法で唯一無関係のオプションである.残りの解の段階は,時間依存の偏微分方程式についてのみ重要である.
NDSolveで使えるメソッドとオプションについての一般的な概要は,関数ページの詳細とオプションとオプションセクションに,より詳しい情報は「Wolfram言語で解く高度な微分方程式」のチュートリアルに記載されているが,このノートブックではNDSolveオプションの構造と,有限要素法とのかかわりを説明する.
オプションの中には,まだサポートされているレガシーオプション指定からのショートカットや短縮バージョンが使えるものもある.このノートブックでは,完全なオプション構造を使う.そうすることは,オプションの構造がよりはっきりするという長所がある.
どのメソッドが使われているのかを知る方法
有限要素法が特定の微分方程式を解くのに使われている解のメソッドかどうかを知りたいことがある.最も簡単にこれを知る方法は,返されたInterpolatingFunctionを調べることである.関数にElementMeshが含まれていれば,有限要素法が使われたということである.ElementMeshがない場合には,別の方法が使われたということである.
NDSolveのデフォルトのアルゴリズム選択が有限要素法を選ばなかった場合には,Methodオプションを指定することで,有限要素法の使用を強制することができる.
NDSolveで解が求まらない場合には,通常エラーメッセージが発せられる.有限要素法に関するエラーメッセージは,通常NDSolve::femXYZで始まる.
よくあるメッセージの場合は,メッセージアイコンの前にある3つの赤点をクリックすると見えるようになるリンクを辿ると,メッセージの詳細とメッセージを回避する方法を見ることができる.言語のメッセージシステムの利用方法についてはワークフローの「エラーメッセージを理解する」に説明されている.
何が有限要素法の使用を促すのか
NDSolveは,手元の方程式を解くのに使うメソッドを自動的に選択するように設計されている.これはつまり以下のトリガーのどれでもが有限要素法の使用を引き起こすことを意味する:
- 領域をElement[x,dom]で指定する
- dom がElementMeshオブジェクトである
- dom がNumericalRegionオブジェクトである
- 偏微分方程式がInactiveを使って指定される
- 境界条件がDirichletCondition,NeumannValue,PeriodicBoundaryConditionのいずれかを使って指定される
代りにテンソル積格子法が使いたい場合には,NDSolveへの呼出しからこれらのトリガーを除去する必要がある.
実装された有限要素法は現在実数値と複素値の機械精度で使用できるので,有限要素法で偏微分方程式の任意精度解を使うことは現在可能ではない.
定常偏微分方程式のための有限要素法オプション
定常,つまり時間独立の微分方程式における有限要素法のオプションとサブオプションを指定するための一般的な構造を以下に示す.
Method{"PDEDiscretization"{"FiniteElement",suboptions}} | 有限要素法を指定して偏微分方程式を離散化する |
Method{"FiniteElement",suboptions} | "PDEDiscretization"{"FiniteElement",suboptions}の短縮形式 |
Method{"FiniteElement"}は,Method{"PDEDiscretization""FiniteElement"}の短縮形式である.この短縮形式は解を強制的に時間独立偏微分方程式にするので,時間依存偏微分方程式の場合は気を付ける必要がある.
NDSolveに実装される有限要素法は,解の過程を小さな段階に分けて行う.段階の順と内部有限要素法関数がどのように作用するかについては,「有限要素プログラミング」のチュートリアルに書かれている.
内部関数の中には,有限要素法のサブオプションを指定しすることによって,関数独自のオプションをNDSolve内で指定して使うこともできるものもある.
時間依存偏微分方程式を解く際に,正しく行わないと,有限要素法の使用を強制的に行うことによって思わぬ結果が返されることがある.有限要素法の使用の強制において,偏微分方程式全体に有限要素法を使う場合と,有限要素法で空間成分だけが離散化される場合とでは,微妙な違いがある.2番目の場合が通常望まれる.
"InitializePDECoefficientsOptions" | InitializePDECoefficientsのオプションを指定する |
"MeshOptions" | 有限要素法のメッシュ生成オプションを指定する |
"PDESolveOptions" | 解の過程のオプションを指定する |
次のセクションでは,低レベルの有限要素関数のオプションをNDSolveからサブオプションとして設定する方法について説明し,これらのオプションのより詳しい使用法を示すドキュメントのセクションへのリンクを提供する.
InitializePDECoefficients
一旦偏微分方程式が解釈されると,抽出された偏微分方程式係数の適正が検証される.これには,例えば,係数が正しい次元で与えられたか,あるいは正しい次元が与えられた入力から推測できるか等を検証することが含まれる.係数は自動的にコンパイルできる.この機能は,関数InitializePDECoefficientsによって提供される.InitializePDECoefficientsが取るすべてのオプションは,NDSolveレベルで指定することができる.
Method{"PDEDiscretization"{"FiniteElement","InitializePDECoefficientOptions"{…}}} | 有限要素法の係数初期化オプションを指定する |
有限要素法のInitializePDECoefficientOptions.
以下は,InitializePDECoefficientsのオプションを指定する方法についての例である.検証過程は,シミュレーションの領域内である点における係数を評価する.この評価点が例えば,係数の特異点である場合には,この係数は拒否される.
0から1の境界を持つ一次元メッシュについては,検証座標は,にある.
詳細は,InitializePDECoefficientsのオプションセクションに記載されている.
メッシュ生成オプション
偏微分方程式の係数と境界条件が一旦初期化されると,有限要素メッシュが生成される.メッシュは,有限要素法の基礎となる部分である.メッシュの品質が方程式の解の確度に大きく影響する.同時に,あまりにも多くの要素を含むメッシュを使うと,不必要に解の過程を長引かせ,負担をかけることになる.ToBoundaryMesh,ToElementMesh,ElementMeshが取れるオプションはすべて,NDSolveレベル上でも指定することができる.メッシュ生成オプションは,"FiniteElement"メソッドのサブオプションとして指定される.
Method{"PDEDiscretization"{"FiniteElement","MeshOptions"{…}}} | 有限要素法のメッシュ生成オプションを指定する |
ElementMeshの生成のための任意いぷしょんを指定する方法の特定の例として,MaxCellMeasureの指定を示す.他のメッシュ生成オプションもすべて同じように指定される.
メッシュ生成を細かく調整するオプションについては,ToBoundaryMesh,ToElementMesh,ElementMeshの関数ページの「詳細とオプション」および「オプション」セクションに記載されている.また,有限要素メッシュの生成についての詳しいドキュメントもあるので,ここではこれ以上メッシュ生成については扱わない.
PDESolveOptions
一旦偏微分方程式の係数,境界条件,およびメッシュが設定されると,その偏微分方程式は離散化される.これは,連続偏微分方程式が方程式の離散系に変換される過程である.この方程式系を解かなくてはならず,それは境界条件が配備されてから可能である.方程式の離散化,境界条件の配備,解を扱う関数はPDESolveである.PDESolveが取るオプションはすべて,NDSolveレベルでも指定することができる.
Method{"PDEDiscretization"{"FiniteElement","PDESolveOptions"{…}}} | 解の過程のオプションを指定する |
偏微分方程式の離散化における2つの重要なサブオプションは,すべての線形問題に使える"LinearSolver"と,非線形問題に使える"FindRootOptions"である.
LinearSolver
一旦係数,境界条件,メソッドデータが初期化されると,PDESolveは形式 の方程式の可能な大きな疎な系を集める.ここでは, は疎な剛性行列, は右辺,負荷ベクトル, は求める解である.方程式の疎な系を生成する詳細については,「有限要素プログラミング」のチュートリアルで扱われる.
デフォルトで,方程式系はLinearSolveを使って解く.この解の過程は時間とメモリを消費するものである.一般に,線形ソルバは,直接か反復のどちらかである.直接ソルバは,ガウスの除去法に基づき,剛性行列 には弱く依存するだけである.このことは直接ソルバを非常に強固なものにする.反対に,反復ソルバは通常あまりメモリを使わず,適切な偏微分方程式に依存する事前調節器でより速く対処できるが,あまり強固ではない.有限要素法は,効率的な直接PARDISOソルバをディフォルトの線形ソルバとして使う.
LinearSolveのオプションは以下の方法で指定される:
Method{"PDEDiscretization"{"FiniteElement","PDESolveOptions"{"LinearSolver"solver,suboptions}}} | LinearSolveのオプションを指定する |
"LinearSolver"オプションは,LinearSolveのオプションを指定するか,系のLinearSolve関数をカスタムの線形ソルバで置換するかすることを可能にする.デフォルトは以下で与えられる.
"LinearSolver"{solver,suboptions} | Automatic | LinearSolveのオプションを指定する |
solver | Automatic | LinearSolveを使う |
suboptions | {} | 与えられたオプションはすべて solver に渡される |
LinearSolveかカスタム solver のオプションを指定する.
大規模な有限要素アプリケーションを解くことと,そのためにLinearSolveを最適化する方法についての話合いは,「有限要素法の使用上のヒント」のチュートリアルに記載されている.
直接線形ソルバ
離散化された偏微分方程式の解が存在する場合は,直接ソルバは,機械精度まで解を求める.直接ソルバが単に使えることは,大きな長所である.有限要素法のデフォルト線形ソルバは,"Pardiso"ソルバである.この直接ソルバはスピードとメモリの効率性のために最適化されている.
複雑な3D形状を持つ結合偏微分方程式については,直接ソルバはコンピュータで使えるRAMメモリ以上のものが必要とするかもしれない.反復ソルバを利用しようとする前に,デフォルトの"Pardiso"ソルバでは,解の過程の一部をRAMメモリの外部に保存することが可能である.この過程は,アウトオブコアの解と呼ばれる.このオプションの使用法は,「有限要素法の使用上のヒント」のチュートリアルの大規模方程式を解くことについてのセクションに記載されている.
それでも直接ソルバでメモリが足りなくなった場合に,反復ソルバを利用しようとすることはもう一つのオプションである.
反復線形ソルバ
反復ソルバは使うのが難しい.有限要素のアプリケーションに反復ソルバを利用するのは,直接ソルバで使用できるRAMメモリ以上のメモリが必要な場合に限ることをお勧めする.これは,結合偏微分方程式で3Dモデルを扱う場合に起ることが多い.
デモンストレーションとして,ここでは3Dの単一偏微分方程式モデルを使う.
直接解を参照として使うと,反復解の相対誤差が推定できる.直接解にも離散化からの誤差が含まれるが,これらの誤差は,反復解の品質に比べると取るに足らないものである.
反復ソルバは,偏微分方程式を解くのに,直接ソルバよりも少ないメモリを必要とする.まず注意すべき違いは,解が満足すべき最低許容度を反復ソルバが必要とする点である.Tolerance10-3の設定は,よい開始値である.また,この場合は,反復ソルバは直接ソルバよりも速い.
使用可能な反復ソルバの完全なリストとそのオプションは,LinearSolveの関数ページに記載されている.有限要素法では,おそらくBiCGStabとGMRESが一般行列に使えるため,重要なアルゴリズムとなる.プレコンディショナなしに反復ソルバを使うことはお勧めできない.収束率が低くなり,解が収束するまで長い時間待たなければならなくなるからである.
反復ソルバの収束率は,剛性行列 の条件数による.条件数が小さければ小さいほどよい.実際に条件数を調べるためには,「有限要素プログラミング」のチュートリアルに提示されている系の行列を抽出するテクニックを使う必要がある.条件数は,偏微分方程式の形状やスケール等,さまざまな要因に影響される.反復ソルバが作動するためには,出来るだけ条件数を小さくすることが必要である.
高品質メッシュは,より小さい条件数となる.メッシュの品質は,メッシュ生成の過程でオプション"MeshQualityGoal"1を指定することによって改善することができる.このオプションの詳細については,「要素メッシュの生成」のチュートリアルの「要素メッシュの品質」のセクションを参照されたい.
もう一つの方法は,剛性行列 の条件数を小さくするのではなく, に似ているが,より小さい条件数を持つ行列をLinearSolveに提供することである.これは,プレコンディショナの行列を剛性行列 に適用することによって達成できる. と が系 に適用されたときに,方程式の結果の系 の条件数を減らすプレコンディショナの行列であるとする.目標とするのは, を よりも小さい条件数で生成することである.プレコンディショナを適用することによって,以下の行列の一つを解くことができる.
求められるのは,よいプレコンディショナを見付けることである.一番よいプレコンディショナは である.しかし, を計算することは事実上直接解の過程の間に行われ,この過程はメモリを多く使い過ぎるので, の近似を見付ける必要がある.現在,あらゆる種類の剛性行列 によいプレコンディショナというものは知られていない.
しかし,ILUプレコンディショナが汎用プレコンディショナとしてよく使われる.ILUは,incomplete(不完全)LU(分解)を意味する. ILUプレコンディショナが実装される場合には,以下の3つの形で使われる.
これらの3つのプレコンディショナの中では,ILU0プレコンディショナが一番簡単なものである.この主な長所は,ILU0行列に追加で非零要素(充填)を導入しない点である.このため,もとの行列とILU0行列が同じ希薄構造を持つ.
ILUTプレコンディショナの機能は,ILU0プレコンディショナのものよりも複雑である.ILUTは,省略許容度と充填の2つのパラメータを使う.これは,行のそれぞれの数が計算される際に省略戦略を適用する.数の絶対値が省略許容度よりも低い場合には,プレコンディショナ行列のその要素は零に設定される.さらに,決まった数の最も大きい項目だけがそのまま使われ,残りは零に設定,つまり省略される.
この場合,だいたい同じ計算時間とメモリの必要量で計算品質を改善することができる.
反復ソルバオプションで有用なものの一つに"StartingVector"がある.これは,より少ない要素を持つメッシュで直接ソルバを使うか,1のメッシュ次数を使うかしてから,このシミュレーションの結果をより細分化されたメッシュのシミュレーションにおける開始点として使うことができる.この手順は,「有限要素法の使用上のヒント」のチュートリアルの大規模問題を解くことについてのセクションに記載されている.
非線形の偏微分方程式に反復ソルバを使うことには2つの短所がある.まず,直接ソルバはその分解を保存し,非線形の解の過程でそれを再利用することができる.このことは,「アフィン共変ニュートン法」のチュートリアルのFindRootメソッドで説明されている.分解を保存できない反復ソルバを使うことによって,おそらくスピードが遅くなる.非線形の偏微分方程式を反復ソルバで解くことが問題である2つ目の理由は,解の過程に失敗したときに,その原因を見付けるのがより困難であることにある.解の過程が失敗したのは,ニュートン法が解を見付けることができなかったからだろうか.それとも偏微分方程式にもとから解がなかったからだろうか.それとも反復ソルバのステップでの低品質の結果のせいで解の過程あg失敗したのだろうか.非線形の偏微分方程式に反復ソルバを使わなければならないのであれば,より高い許容度Tolerance10-6が必要かもしれない.
一般に,反復ソルバのパフォーマンスは,偏微分方程式と使用した幾何モデルによるので,反復ソルバの使用について一般的な助言を与えることは難しい.
カスタムの線形ソルバ
系の関数のLinearSolveへの呼出しをカスタムの線形ソルバで置き換えることが可能である.
非線形の偏微分方程式を解く過程も線形ソルバを利用する.非線形ソルバがどのように作動するかについての詳細は,有限要素プログラミングのノートブックの非線形偏微分方程式のセクションで説明されている.しかし,線形の場合と比べたとき,系の行列の因数分解がなされてから,違う右側に適用される点で異なる.この必要性について考えるために,上のラッパーのコードを拡張して,LinearSolveのように一引数の形式が使えるようにする.非線形の偏微分方程式の場合,カスタムの線形ソルバは,解の過程で右側に適用できるLinearSolveFunctionのような関数を返す必要がある.
カスタムの線形ソルバのコードを使うと,解の過程の直前に系の行列に直接アクセスすることができる.
カスタムの線形ソルバにオプションを渡すために,これらのオプションを設定しなければならない.
カスタムの線形ソルバの指定で指定されたオプションがカスタムの線形ソルバに渡されるようになった.
FindRootOptions
FindRootのオプションは,非線形の時間独立偏微分方程式にのみ適用可能である.
Method{"PDEDiscretization"{"FiniteElement","PDESolveOptions"{"FindRootOptions"suboptions}}} | FindRootのオプションを指定する |
有限要素法のデフォルトのFindRootメソッドは,アフィン共変ニュートン法であり,そのオプションと例は「アフィン共変ニュートン法」のノートブックに記載されている.ここでは,FindRootのオプションの設定方法についての概要を示すため,非線形の偏微分方程式を解く.
特定の例として,ステップ,関数,および関数行列式の評価を観察するためにモニターを使う.「アフィン共変ニュートン法」のノートブックで説明されるように,その他のオプションもすべて同じように指定することができる.
関数評価,ステップ,関数行列式の評価の数を観察することが重要である.非線形偏微分方程式を解く効率性に,他に与えられたオプションが影響するかどうかを示すからである.
使用された離散化が有限要素法である場合,デフォルトのアフィン共変ニュートン法以外の方法をFindRootに使うことが役立つ例は知られていない.
この例で分かるように,関数行列式の評価数は,アフィン共変ニュートン法を使った場合に比べて,標準ニュートン法を使った場合の方が大きくなる.ヤコビ行列の評価は有限要素法では非常に高価なので,アフィン共変ニュートン法は,関数行列式の評価数を最小化しようとするからである.
ニュートン法に基づくすべての求根法は,開始値をひつようとする.有限要素法のデフォルトは0である.これは常に正しい選択であるとは限らない.開始値は,NDSolveのInitialSeedingオプションを使って修正することが可能である.スコープのセクションに,線形の微分方程式の解を,同じ方程式の非線形バージョンを解くのに使う方法が示されている.
使用できる,より細かく調整するためのオプションとその使用例については,「アフィン共変ニュートン法」で与えられるメソッドのドキュメントを参照されたい.
有限要素法で使われる線形化の理論と実装については,有限要素法プログラミングのチュートリアルの非線形偏微分方程式のセクションに説明がある.
残りの"FiniteElement"メソッドオプション
AccuracyGoal
NDSolveの残りの部分とは異なるAccuracyGoalを有限要素法に指定する.
BoundaryTolerance
境界の許容範囲をNoneに設定すると,一貫性のないDirichletConditionの検知が可能である:
デフォルトの"BoundaryTolerance"はAutomaticであり,不整合な境界条件について警告しないが,不整合な境界条件の解析で見付かるかもしれない境界条件の重複は削除する."BoundaryTolerance"をInfinityに設定すると,不整合性のチェックはまったく行われない.
IntegrationOrder
IntegrationOrderは,InitializePDEMethodDataのサブメソッドオプションである.IntegrationOrderは有限要素の演算子を積分するのに使われる確度の次数である."MeshOrder"が2であるElementMeshが与えられた場合,Automatic設定は4の積分次数を選ぶ."MeshOrder"が1であるElementMeshについては,2の積分次数が選ばれる.最大次数は5である.
有限要素法が特定の微分方程式を解くのに使われている解のメソッドかどうかを知りたいことがある.最も簡単にこれを知る方法は,返されたInterpolatingFunctionを調べることである.関数にElementMeshが含まれていれば,有限要素法が使われたということである.ElementMeshがない場合には,別の方法が使われたということである.
InterpolationOrder
"MeshOrder"が であるElementMeshの場合,InterpolationOrderは最大で となり,"InterpolationOrder"Automaticのデフォルトは次数 になる.複数の従属変数が異なる補間次数を持つことがあるが,少なくとも1つの補間次数は最大メッシュ次数の に設定されなければならない.複数の異なる補間次数は,他の有限要素ソフトウェアがP2/P1あるいはQ2/Q1要素とするものを指定することに等しい.これは,流体動力学のシミュレーションで役に立つもので,「有限要素法で偏微分方程式を解く」のチュートリアルの流体のセクションに詳しく説明されている.
LinearSolveMethod
これはレガシーオプションであり,使われるべきではない.代りに,PDESolveOptionsを通してLinearSolveのオプションを指定する.
PrecisionGoal
有限要素法にNDSolveの残りの部分とは異なるPrecisionGoalを指定する.
PrecomputeGeometryData
NDSolveは,形状に基づくデータを予め計算して保存する.この機能をオフにすることが,NDSolveレベルで有益になることはない.低レベルの有限要素プログラミング関数のみが,有限要素データを予め計算しないことから恩恵を受けるかもしれない.PrecomputeGeometryDataは,InitializePDEMethodDataのサブメソッドオプションである.