"""
概要: NumPyとSciPyを用いた基本的な行列演算の例を示すスクリプト。
詳細説明:
このスクリプトは、PythonにおけるNumPyおよびSciPyライブラリを使用して、様々な行列演算を実行する方法を実演します。
行列の初期化、内積、外積、逆行列、行列式、固有値問題、連立一次方程式の解法、LU分解、
コレスキー分解、QR分解などの具体的なコード例を提示します。
各演算の結果は標準出力に表示され、線形代数の基本的な操作を理解するのに役立ちます。
関連リンク: :doc:`matrix_usage`
"""
import sys
import numpy as np
import scipy as sp
import numpy.linalg as npalg
import scipy.linalg as spalg
# Better not use matrix type, instead use ndarray
# Q: real orthogonal matrix
# R: upper-triangle matrix
# S: posiive definite symmetric matrix
#===================
# Global parameters (Initial Data)
#===================
A = np.array([[2, 5],
[1, 3]])
B = np.array([[-1],
[ 1]])
S = np.array([[ 2.0, -1.0]
, [-1.0, 5.0]])
V1 = np.array([1, 1, 2])
V2 = np.array([2, 1, 3])
[ドキュメント]
def main():
"""
概要: 行列演算の様々な機能を実行し、その結果を標準出力に表示する。
詳細説明:
この関数は、NumPyおよびSciPyの線形代数機能を用いて、事前に定義された行列 A, B, S とベクトル V1, V2
に対して、内積、外積、逆行列、行列式、固有値計算、連立方程式の解法、LU分解、コレスキー分解、
QR分解などの基本的な行列演算を行います。
各演算の結果はコンソールに出力され、線形代数の概念をPythonでどのように実装するかを示します。
"""
print("")
print("A:\n", A)
print("B:\n", B)
print("S:\n", S)
print("V1:\n", V1)
print("V2:\n", V2)
# Inner product: Use np.inner, .dot, .matmul for 1D list, ndarray
print("")
print("Inner product")
inner = np.inner(V1, V2)
print("np.inner V1 dot V2 = {}".format(inner))
dot = np.dot(V1, V2)
print("np.dot V1 dot V2 = {}".format(dot))
# Outer product
V3 = np.cross(V1, V2)
print("")
print("Outer product (DO NOT use np.outer()")
print("np.cross V1 x V2:")
print(V3)
# Inverse matrix: linalg.inv for list
A_i = npalg.inv(A)
check = A @ A_i
print("")
print("np.inv A^-1:")
print(A_i)
print("A*A.i:")
print(check)
# Determinant
arr = np.array([[0, 1], [2, 3]])
det = np.linalg.det(arr)
print("")
print("determinant for A = {}".format(det))
# Eigen problem
lA, vA = npalg.eig(A)
print("")
print("nympy.linalg.eig(A):")
print("Eigen values: ", lA)
print("Eigen vectors:")
print(vA)
# Solve simultaneous linear equations
print("")
print("Solve simultaneous linear equations AX = B:")
X = np.linalg.solve(A, B)
print(X)
# LU decomposition
print("")
print("LU decomposition A = PLU:")
print("A:\n", A)
P, L, U = spalg.lu(A)
check_lu = P @ L @ U
print("P:\n", P)
print("L:\n", L)
print("U:\n", U)
print("P@L@U:\n", check_lu)
# Cholesky decomosition: S = LL^T
print("Cholesky decompositioin S = LL^T:")
L_chol = npalg.cholesky(S)
check_chol = L_chol @ L_chol.T
print("")
print("S:\n", S)
print("L:\n", L_chol)
print("L*L^T:\n", check_chol)
# QR decomposition: A = QR
# good for anomarly matrix
Q, R = spalg.qr(A)
check_qr = Q @ R
print("")
print("QR decomposition:")
print("A:\n", A)
print("Q:\n", Q)
print("R:\n", R)
print("Q@R:\n", check_qr)
print("")
if __name__ == "__main__":
main()