# Chapter 8 Matrices

行列に関してはコメントは少なめです。(~~正直、SympyのMatrix使うぐらいなら、Numpy使ったほうが効率良さそうだよね〜.~~)


```python
from sympy import *
init_printing(use_unicode=True)
```

`Sympy`で行列を作るには、`Matrix`オブジェクトを使う. たとえば


```python
Matrix([
[1, -1],
[3, 4],
[0, 2] ]) #行ベクトルの組み合わせであることを明示するために[]カッコを余分に付けている。
```

とできる. 列ベクトルは


```python
Matrix([1,2,3]) #([])はベクトル
```

#### 行列の積


```python
M = Matrix([
[1, 2, 3],
[3, 2, 1] ])
```


```python
type(M)
```




    sympy.matrices.dense.MutableDenseMatrix




```python
N = Matrix([0, 1, 1])
```


```python
M*N
```

**注意**: `Matrix`オブジェクトは`mutable`. 

## 8.1　基本的な演算

### 8.1.1 形(Shape)


```python
M = Matrix([
 [1, 2, 3],
 [-2, 0, 4]
])
```


```python
M
```


```python
M.shape #Numpy同様()はいらない.
```

(行, 列)

### 8.1.2 行と列を参照する


```python
M.row(0) #1行 0から始まる.
```


```python
M.col(-1) #3列(負で最終列を参照)
```

### 8.1.2 行と列の削除 / 挿入

#### 行 / 列の削除


```python
M.col_del(0) # 一列目を削除
```


```python
M
```


```python
M.row_del(1) # 二行目を削除
```


```python
M
```

#### 行 /　列の追加


```python
M
```


```python
M = M.row_insert(1, Matrix([[0, 4]])) #2行目に(0, 4)成分を追加
```


```python
M
```


```python
M = M.col_insert(0, Matrix([1, -2])) #列ベクトルを追加するのでカッコは一組
```


```python
M
```

## 8.2 基本的な方法


```python
M = Matrix([
    [1, 3],
    [-2,3]
])
```


```python
N = Matrix([
    [0,3],
    [0,7]
])
```


```python
M + N #足し算
```


```python
M*N #行列の積
```


```python
3*M #定数倍
```


```python
M**2 #べき乗
```


```python
M**-1 #逆行列
```


```python
N**-1 #行列式がゼロで存在しない.
```


```python
M = Matrix([
    [1, 2, 3],
    [4, 5, 6]
])
```


```python
M
```


```python
M.T #転置行列
```

## 8.3 行列の構成

### 8.3.1 単位行列


```python
eye(3)
```


```python
eye(4)
```

### 8.3.2 ゼロ行列


```python
zeros(2,3)
```


```python
zeros(4)
```

### 8.3.3 すべての成分が1の行列


```python
ones(2,3)
```

### 8.3.4 対角行列


```python
diag(1, 2, 3)
```


```python
diag(-1, ones(2, 2), Matrix([5, 7, 5])) #複数組み合わせる
```

## 8.4 高等的な扱い

### 8.4.1 行列式


```python
M = Matrix([
    [1, 0, 1],
    [2, -1, 3],
    [4, 3, 2]
])
```


```python
M
```


```python
M.det()
```

### 8.4.2 簡約化


```python
M = Matrix([
    [1, 0, 1, 3],
    [2, 3, 4, 7],
    [-1, -3, -3, -4]
])
```


```python
M.rref()
```

第一引数は簡約化した行列、第二引数はピボット列の添字リスト. この行列のランクは2.

### 8.4.3 ヌル空間


```python
M = Matrix([
    [1, 2, 3, 0, 0],
    [4, 10, 0, 0, 1]
])
```


```python
M.nullspace()
```

--->M*x=0なる方程式の解. ヌル空間の次元は3.

### 8.4.4 列空間


```python
M = Matrix([
    [1, 1, 2],
    [2, 1, 3],
    [3, 1, 4]
])
```


```python
M.columnspace()
```

### 8.4.5 固有値、固有ベクトル、対角化


```python
M = Matrix([
    [3, -2, 4, -2],
    [5, 3, -3, -2],
    [5, -2, 2, -2],
    [5, -2, -3 ,3]
])
```


```python
M.eigenvals()
```

--->固有値 -2 と 3 は多重度1, 固有値5は多重度 3


```python
M.eigenvects()
```

--->固有値とともに固有ベクトルも表示される. 常にコレを使ってもいいが、固有ベクトルの計算は時間がかかるので、固有値だけ欲しければeigenvals()を使うのが吉.


```python
P, D = M.diagonalize()
```


```python
P #直交行列
```


```python
D #対角行列
```


```python
P*D*P**-1
```

これはMに等しい.

#### 固有方程式


```python
lamda = symbols('lamda') #lambdaは予約語
```


```python
p = M.charpoly(lamda)
```


```python
factor(p) #Mの固有方程式
```

a60de916860f0241e4ec89a73871f5c93cf01d8b
ipynb
Jupyter Notebook
Chapter8_Matrices.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
2018-01-02T16:53:11.000Z
2021-05-05T13:48:49.000Z
Chapter8_Matrices.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
2018-06-12T03:51:09.000Z
2018-06-13T08:15:45.000Z
Chapter8_Matrices.ipynb
hiroyuki827/SymPy_tutorial
8423ceab49482dc83c90c4cb1d388cad100ced84
BSD-3-Clause
Qwen/Qwen-72B
1. YES
2. YES