2020年2月22日土曜日

学習環境

ラング線形代数学(上) (ちくま学現文庫)(S.ラング (著)、芹沢 正三 (翻訳)、筑摩書房)の3章(行列)、2(行列の積)、練習問題19の解答を求めてみる。


  1. A B = k = 1 n a i k b k j = k = i n a i k b k j k j b k j = 0 k = j b k j = a j j - 1

    よって

    A B = [ a 11 b 11 c 12 c 1 n 0 a 22 b 22 c 2 n 0 0 a n n b n n ] = [ 1 c 12 c 1 n 0 1 c 2 n 0 0 1 ]

    また、

    B A = k = 1 n b i k a k j = k = i i b i k a k j = b i i a i j i > j a i j = 0

    よって、

    B A = [ b 11 a 11 b 11 a 12 b 11 a 1 n 0 b 22 a 22 b 22 a 2 n 0 0 b n n a n n ] = [ 1 c 12 c 1 n 0 1 c 2 n 0 0 1 ]

    よって、 AB、 BA ともに三角行列で、その対角要素は1である。

    (証明終)

コード

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


print('19.')


def a(i, j):
    if i > j:
        return 0
    if i == j:
        return symbols(f'a{i}{j}', nonzero=True)
    return symbols(f'a{i}{j}')


def b(i, j):
    if i == j:
        return 1 / symbols(f'a{i}{j}', nonzero=True)
    return 0


n = 4
A = Matrix([[a(i + 1, j + 1) for j in range(n)]
            for i in range(n)])
B = Matrix([[b(i + 1, j + 1) for j in range(n)]
            for i in range(n)])


class MyTestCase(TestCase):
    def testAB(self):
        C = A * B
        for i in range(n):
            for j in range(n):
                if i == j:
                    self.assertEqual(C[i, j], 1)
                if j < i:
                    self.assertEqual(C[i, j], 0)

    def testBA(self):
        C = B * A
        for i in range(n):
            for j in range(n):
                if i == j:
                    self.assertEqual(C[i, j], 1)
                if j < i:
                    self.assertEqual(C[i, j], 0)


if __name__ == '__main__':
    main()

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

% ./sample19.py -v
19.
testAB (__main__.MyTestCase) ... ok
testBA (__main__.MyTestCase) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.043s

OK
%

0 コメント:

コメントを投稿