【更新履歴】
微分方程式を数値的に解く方法のひとつにgradient flowと呼ばれるものがあります。これは作用汎関数やエネルギー汎関数において、配位を勾配のマイナスの方向に数値的にフローさせて極小化することで微分方程式の解を求める方法です。様々な場面で使えると思いますが、例えば場の理論におけるトポロジカルで静的な解を求める際には大変有用ですManton。
このような数値的な汎関数の極小化において拘束条件を課さなければならないことがあります。簡単な例が懸垂線です。懸垂線はひもを垂らしたときの形であり、重力下におけるひものエネルギーの極小化により導けます。しかし数値計算ではひもの長さを固定しないと望まない方向に配位がフローしてしまいます。
本記事では拘束の存在する汎関数の極小化問題をLagrangeの未定乗数法とNewton法により解く方法に関して記します。そして具体的に数値計算で懸垂線を求めます。
本記事では主にWashioを参考にしました。またLagrangeの未定乗数法は既知として、Newton法および2つの方法の融合に焦点を当てます。未定乗数法に関しては例えばLagrangeをご参照ください。
Newton法 (Newton-Raphson法) とは方程式の解を求めるための方法ですHayakawa。いま
の解を近似的に求めることにします。そのためにまず
以下これを図を用いて説明します。
1次元のNewton法の概念図
一次元の場合のNewton法が図1です。 最初に
これを具体的に式にするのは簡単です。図1より
この関係は任意の
2次元のNewton法の概念図。青バツと緑バツがそれぞれ
2次元の場合が図2です。2つの拘束条件が存在するとして、それらを
とします。まず
この議論を多変数に拡張し式にします。改めて以下の拘束を解くことを考えます:
を定義すれば、ある
で表されます。
これが成立するのは、
が成立します。
Eq.(1)を
とします。すなわち
とします。このときEq.(1)は行列表記で以下のように書けます:
各行が
のように次の解の候補を作ることができます。この関係はもちろん任意の
Newton法を拘束条件付き多変数関数の極小化に適用します。以下Ref.Washioを参考にしています。
次の拘束条件付きの最小化問題:
を考えます。
Lagrangeの未定乗数法に従い
を導入します。
を前章のNewton法に従い解くことを考えます。ここで
とします。また
を導入します。前章の議論に従い
とすると、
で表されます。よってこれが
を満たします。これを
ここで繰り返し登場する添字は和を取るものとします。また
上の下線を引いた2式を数値計算で扱いやすいように行列表記すれば以下のようになりますWashio:
ここで
である。
公式2を
を計算すれば次の解が求まります。
まずは2変数関数の拘束付き極値問題を前章の式を用いて数値的に解いてみます。問題はRef.Problemからお借りしました。
解析的な計算はProblemを御覧ください。非自明な極値は
です。一方初期条件
となります。iterationとは公式2を何回繰り返したかを表す数字です。iterationが9回で本計算の計算精度の範囲において収束します。
次にエネルギーの極小化により懸垂線を数値的に求めます。この場合の拘束条件はひもの長さを固定することに対応します。
まず懸垂線における変分法について述べます。詳細は省いて説明するので、馴染みのない方は例えばCatenaryをご参照ください。
ですCatenary。
で与えられます。Lagrangeの未定乗数法を用いて拘束条件付きの変分問題を解きます。それには
で定義し、これが
数値計算を行うため空間を離散化します。空間を
あとは
まず拘束をかけないとどうなるか見ておきます。
ひもの長さに拘束をかけない場合のひもの形状のiteration依存性。空間の離散化に関し
図3がひもの形状のiteration依存性です。一番下の青線が初期関数であり放物線
図3のひものエネルギーのiteration依存性。
端を
一方公式2を用いてひもの長さに拘束をかけて計算すると下図のようになります。
ひもの長さに拘束をかけた場合のひもの形状のiteration依存性。空間の離散化に関し
紫の線が初期条件であり、図1と同じ放物線に設定しています。この放物線の長さは図のスケールで148.98です。これと同じ長さを持ち端点を
エネルギーのiteration依存性は以下のようになります:
図5のひものエネルギーのiteration依存性。
エネルギーは単調に減少し、だいたいiteration回数が10回で一定になります。非常に速く収束しています。
Mathematicaで計算すると、初期の放物線のエネルギーは6487、また正しい解である懸垂線のエネルギーは6476です。本計算の初期のエネルギーはだいたい良いですが、最終的に安定した後のエネルギーは6441なので、けっこう差があります。図5をよく見ると少し真の解から計算結果がずれているのが問題なのかもしれません。またはコードに問題があるかもしれません。まあでも定性的・半定量的には問題ない結果かと思います。
Newton法はiteration回数に対し非常に速く収束します。ただAdam等の陽的なminimizationと比較して、iteration毎に空間の分割数分の行と列を持つ行列の逆行列計算が必要なので、計算量は単純には比較できません。
もう少し歪な初期条件から始めても正しい形状を得ます:
図5よりも歪な初期状態からフローさせた計算。計算条件は初期条件以外図5と同じ。
計算条件は初期条件(紫の線)以外図5と同じです。この場合でもiterationが3回程度でひもの形状はほぼ正しい懸垂線に到達します。またひもの長さもiterationが13回以降では誤差が
図7の初期条件より更に歪んだ初期条件を与えると往々にして収束せず計算が発散して破綻します。極小化の数値計算では不安定性は頻繁に見られる現象であり気を遣う点ですWashio。またそもそもNewton法では初期条件が悪ければ収束は保証されません。ある程度良い初期条件を選ぶことは大切です。
本記事では拘束の存在する汎関数の極小化問題を、Lagrangeの未定乗数法とNewton法により解く方法に関して述べました。多変数の場合のNewton法および未定乗数法におけるNewton法の定式化に関して記したのち、その応用として数値計算により懸垂線を求めました。この方法において、初期条件と不安定性に気を配れば、数値計算により拘束系における汎関数の極小化問題をうまく解くことができます。
Newton法+Lagrange未定乗数法で懸垂線を計算するコードをGistにアップロードしましたCode。PythonでコーディングしJupyter Notebookとして保存してあります。各セルを上から順番に実行すれば図5・6が描画されます。よろしければご参照ください。
(※本コードの正しさは保証できません。何らかの別用途に利用される場合ご自身で確認・修正されることをおすすめします)
おしまい。
まず
表式の簡単化のため次の量を定義しておきます:
以上の準備のもと、計算に必要な量は以下のようになります:
以上。