{ "cells": [ { "cell_type": "markdown", "id": "a83a0f93", "metadata": {}, "source": [ "# ラプラシアン・ヘッセ行列・ヤコビ行列\n", "\n", "これら3つの演算は、いずれも同じ偏微分の配列から組み立てられます。\n", "スカラー関数$f$とベクトル値写像$F$に対して、\n", "\n", "$$\n", "(\\operatorname{Hess}f)_{ij}=\\partial_i\\partial_j f,\n", "\\qquad\n", "\\Delta f=\\operatorname{tr}(\\operatorname{Hess}f),\n", "\\qquad\n", "J_F=(\\partial_jF_i)_{ij}.\n", "$$\n" ] }, { "cell_type": "markdown", "id": "b41b8969", "metadata": {}, "source": [ "## 座標と検算用の場\n", "\n", "$f=x^2+y^2+z^2$と$F=(x^2,y^2,z^2)$を用います。どちらも\n", "微分行列が対角行列になるため、期待する結果を容易に確認できます。\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "3a52a9c1", "metadata": {}, "outputs": [], "source": [ "declare symbol x, y, z : MathValue\n", "\n", "def parameters : Vector MathValue := [| x, y, z |]\n", "def scalarField : MathValue := x^2 + y^2 + z^2\n", "def vectorField : Vector MathValue := [| x^2, y^2, z^2 |]\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "1b333b03", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$\\begin{pmatrix} 2 x \\\\ 2 y \\\\ 2 z\\\\ \\end{pmatrix}$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "∂/∂ scalarField parameters\n" ] }, { "cell_type": "markdown", "id": "6ffe321e", "metadata": {}, "source": [ "## ヘッセ行列とラプラシアン\n", "\n", "`generateTensor`で行列の2つの自由添字を与えます。得られた\n", "ヘッセ行列のトレースを取ることで、ユークリッド空間の\n", "ラプラシアンを実装します。\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "b62505e2", "metadata": {}, "outputs": [], "source": [ "def hessian (f : MathValue) : Matrix MathValue :=\n", " generateTensor\n", " (\\[a, b] -> ∂/∂ (∂/∂ f parameters_a) parameters_b)\n", " [3, 3]\n", "\n", "def laplacian (f : MathValue) : MathValue := trace (hessian f)\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "7cdbfa34", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$\\begin{pmatrix} 2 & 0 & 0 \\\\ 0 & 2 & 0 \\\\ 0 & 0 & 2 \\\\ \\end{pmatrix}$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "hessian scalarField\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "6a0c4f8d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$6$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "laplacian scalarField\n" ] }, { "cell_type": "markdown", "id": "cb0ad2fa", "metadata": {}, "source": [ "## ヤコビ行列と行列式\n", "\n", "同じ添字付きの構成を使って、$F$の各成分を微分します。\n", "その行列式は、局所的な体積の拡大率を表します。\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "6fd7c37f", "metadata": {}, "outputs": [], "source": [ "def jacobian (v : Vector MathValue) : Matrix MathValue :=\n", " generateTensor\n", " (\\[a, b] -> ∂/∂ v_a parameters_b)\n", " [3, 3]\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "10abc531", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$\\begin{pmatrix} 2 x & 0 & 0 \\\\ 0 & 2 y & 0 \\\\ 0 & 0 & 2 z \\\\ \\end{pmatrix}$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "jacobian vectorField\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "406a4283", "metadata": {}, "outputs": [ { "data": { "text/html": [ "$8 x y z$" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "M.det (jacobian vectorField)\n" ] }, { "cell_type": "markdown", "id": "b90604d5", "metadata": {}, "source": [ "出力はそれぞれ$2I_3$、$6$、$8xyz$です。テンソルの生成、縮約、\n", "行列式の計算を組み合わせることで、多変数解析でおなじみの3つの演算を\n", "統一的に表現できることが分かります。\n" ] } ], "metadata": { "kernelspec": { "display_name": "Egison", "language": "egison", "name": "egison" }, "language_info": { "codemirror_mode": "egison", "file_extension": ".egi", "mimetype": "text/x-egison", "name": "egison" } }, "nbformat": 4, "nbformat_minor": 5 }