ラプラシアン・ヘッセ行列・ヤコビ行列¶
これら3つの演算は、いずれも同じ偏微分の配列から組み立てられます。 スカラー関数$f$とベクトル値写像$F$に対して、
$$ (\operatorname{Hess}f)_{ij}=\partial_i\partial_j f, \qquad \Delta f=\operatorname{tr}(\operatorname{Hess}f), \qquad J_F=(\partial_jF_i)_{ij}. $$
座標と検算用の場¶
$f=x^2+y^2+z^2$と$F=(x^2,y^2,z^2)$を用います。どちらも 微分行列が対角行列になるため、期待する結果を容易に確認できます。
declare symbol x, y, z : MathValue
def parameters : Vector MathValue := [| x, y, z |]
def scalarField : MathValue := x^2 + y^2 + z^2
def vectorField : Vector MathValue := [| x^2, y^2, z^2 |]
∂/∂ scalarField parameters
ヘッセ行列とラプラシアン¶
generateTensorで行列の2つの自由添字を与えます。得られた
ヘッセ行列のトレースを取ることで、ユークリッド空間の
ラプラシアンを実装します。
def hessian (f : MathValue) : Matrix MathValue :=
generateTensor
(\[a, b] -> ∂/∂ (∂/∂ f parameters_a) parameters_b)
[3, 3]
def laplacian (f : MathValue) : MathValue := trace (hessian f)
hessian scalarField
laplacian scalarField
ヤコビ行列と行列式¶
同じ添字付きの構成を使って、$F$の各成分を微分します。 その行列式は、局所的な体積の拡大率を表します。
def jacobian (v : Vector MathValue) : Matrix MathValue :=
generateTensor
(\[a, b] -> ∂/∂ v_a parameters_b)
[3, 3]
jacobian vectorField
M.det (jacobian vectorField)
出力はそれぞれ$2I_3$、$6$、$8xyz$です。テンソルの生成、縮約、 行列式の計算を組み合わせることで、多変数解析でおなじみの3つの演算を 統一的に表現できることが分かります。