2020年4月25日土曜日

学習環境

解析入門 原書第3版 (S.ラング(著)、松坂 和夫(翻訳)、片山 孝次(翻訳)、岩波書店)の第Ⅵ部(多変数の関数)、第20章(合成微分律と勾配ベクトル)、1(合成微分律)の練習問題9の解答を求めてみる。



    1. X=x1,,xn

      とおく。

      このとき、

      r=X=k=1nxk2

      求める勾配ベクトルは

      gradfX=D1fX,,Dn.fXDkfX=ddxkfX=ddxkgr=ddxk·1r=-1r2·xkk=1nxk2=-xkr3gradfX=-Xr3

    2. gradfX=gradgr=gradr2=2rx1r,,2rxnr=2X

    3. ddxk1r3=-3r2r6-xkr=-3xkr5gradfX=-3Xr5

    4. ddxke-r2=-2re-r2·xkr=-2e-r2xkgradfX=-2e-r2X

    5. ddxklog1r=-r·1r2xkr=-xkr2gradfX=-Xr2

    6. ddxk4rm=-4·mrm-1r2m·xkr=-4mxkrm+2gradfX=-4mXrm+2

コード

#!/usr/bin/env python3
from unittest import TestCase, main
from sympy import symbols, Function, Matrix, exp, log

print('9.')

xs = symbols('x:5', real=True)
X = Matrix(xs)
r = X.norm()
m = symbols('m', integer=True)
fs = [1 / r, r ** 2, 1 / r ** 3, exp(-r ** 2), log(1 / r), 4 / r ** m]
gradfs = [Matrix([f.diff(x, 1) for x in xs])
          for f in fs]


class TestDerivativeChainRule(TestCase):
    def test_a(self):
        self.assertEqual(gradfs[0], - X / r ** 3)

    def test_b(self):
        self.assertEqual(gradfs[1], 2 * X)

    def test_c(self):
        self.assertEqual(gradfs[2], -3 * X / r ** 5)

    def test_d(self):
        self.assertEqual(gradfs[3], -2 * exp(-r ** 2) * X)

    def test_e(self):
        self.assertEqual(gradfs[4], -X / r ** 2)

    def test_f(self):
        for m0 in range(-10, 11):
            if m == 1:
                continue
            self.assertEqual(gradfs[5].subs({m: m0}),
                             -4 * m0 * X/r ** (m0 + 2))


if __name__ == "__main__":
    main()

入出力結果(Zsh、PowerShell、Terminal、Jupyter(IPython))

% ./sample9.py -v
9.
test_a (__main__.TestDerivativeChainRule) ... ok
test_b (__main__.TestDerivativeChainRule) ... ok
test_c (__main__.TestDerivativeChainRule) ... ok
test_d (__main__.TestDerivativeChainRule) ... ok
test_e (__main__.TestDerivativeChainRule) ... ok
test_f (__main__.TestDerivativeChainRule) ... ok

----------------------------------------------------------------------
Ran 6 tests in 0.087s

OK
%

0 コメント:

コメントを投稿