5.1¶
掃き出し法により、次の1~3の連立1次方程式を解け。また、係数行列および拡大係数行列について、それぞれの階数を求めよ
import numpy as np
A = np.array([
[1, 2, 1],
[3, 4, 0],
[5, 6, 0],
], dtype=np.float32)# 1行目を-2倍して2行目に加える
A[1, :] += A[0, :] * (-2)
Aarray([[ 1., 2., 1.],
[ 1., 0., -2.],
[ 5., 6., 0.]], dtype=float32)# 1行目を-3倍して3行目に加える
A[2, :] += A[0, :] * (-3)
Aarray([[ 1., 2., 1.],
[ 1., 0., -2.],
[ 2., 0., -3.]], dtype=float32)# 3行目を(1/2)倍する
A[2, :] = (1 / 2) * A[2, :]
Aarray([[ 1. , 2. , 1. ],
[ 1. , 0. , -2. ],
[ 1. , 0. , -1.5]], dtype=float32)# 2行目を-1倍して3行目に加える
A[2, :] += A[1, :] * (-1)
Aarray([[ 1. , 2. , 1. ],
[ 1. , 0. , -2. ],
[ 0. , 0. , 0.5]], dtype=float32)# 2行目を-1倍して1行目に加える
A[0, :] += A[1, :] * (-1)
Aarray([[ 0. , 2. , 3. ],
[ 1. , 0. , -2. ],
[ 0. , 0. , 0.5]], dtype=float32)# 1行目を(1/2)倍する
A[0, :] = (1 / 2) * A[0, :]
Aarray([[ 0. , 1. , 1.5],
[ 1. , 0. , -2. ],
[ 0. , 0. , 0.5]], dtype=float32)a1 = A[0, :].copy()
a2 = A[1, :].copy()
A[0, :] = a2
A[1, :] = a1
Aarray([[ 1. , 0. , -2. ],
[ 0. , 1. , 1.5],
[ 0. , 0. , 0.5]], dtype=float32)3行目も零ベクトルにできなかった → 不能?
1-3. 拡大係数行列の階数
(3行目を2倍すれば対角成分が1になるので)
3
import numpy as np
A = np.array([
[1, 1, -2, 0],
[1, -2, 1, 3],
[-2, 1, 1, -3],
])# 1行目を2行目から引く
A[1, :] += A[0, :] * (-1)
Aarray([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[-2, 1, 1, -3]])# 1行目を2倍して3行目に加える
A[2, :] += A[0, :] * (2)
Aarray([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[ 0, 3, -3, -3]])# 2行目を3行目に加える
A[2, :] += A[1, :] * (1)
Aarray([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[ 0, 0, 0, 0]])# 2行目を1/3する
A[1, :] = A[1, :] * (-1/3)
Aarray([[ 1, 1, -2, 0],
[ 0, 1, -1, -1],
[ 0, 0, 0, 0]])# 2行目を1行目から引く
A[0, :] += A[1, :] * (-1)
Aarray([[ 1, 0, -1, 1],
[ 0, 1, -1, -1],
[ 0, 0, 0, 0]])を任意定数に置き換える
Source
# # 検算
# import numpy as np
# A = np.array([
# [1, 1, -2],
# [1, -2, 1],
# [-2, 1, 1],
# ])
# x = np.array([0, 3, -3])
# np.linalg.solve(A, x)Output
from sympy import Matrix
A = Matrix([
[1, 2, 3, 4, 1],
[2, 3, 4, 1, 0],
[0, 1, 2, 7, 1],
])A[1, :] += A[0, :] * (-2)
ALoading...
A[2, :] += A[1, :]
ALoading...
A[1, :] = A[1, :] * (-1)
ALoading...
A[0, :] += A[1, :] * (-2)
ALoading...
3行目を零ベクトルにできなかった → 不能?
係数行列のランク: 2
拡大係数行列のランク: 3
Source
# 検算
A = np.array([
[1, 2, 3, 4, 1],
[2, 3, 4, 1, 0],
[0, 1, 2, 7, 1],
])
print("係数行列のランク:", np.linalg.matrix_rank(A[:, :3]))
print("拡大係数行列のランク:", np.linalg.matrix_rank(A))Output
係数行列のランク: 2
拡大係数行列のランク: 3
from sympy import Matrix
A = Matrix([
[1, 2, 3, 4, 0],
[2, 3, 4, 1, 0],
[0, 1, 2, 7, 0],
])A[1, :] += A[0, :] * (-2)
ALoading...
A[2, :] += A[1, :]
ALoading...
A[1, :] = A[1, :] * (-1)
ALoading...
A[0, :] += A[1, :] * (-2)
ALoading...
を任意定数に置き換える
Source
# 検算
A = np.array([
[1, 2, 3, 4, 0],
[2, 3, 4, 1, 0],
[0, 1, 2, 7, 0],
])
print("係数行列のランク:", np.linalg.matrix_rank(A[:, :3]))
print("拡大係数行列のランク:", np.linalg.matrix_rank(A))Output
係数行列のランク: 2
拡大係数行列のランク: 2
from sympy import Matrix, symbols
p, q, r = symbols("p q r")
A = Matrix([
[-2, 1, 1, p],
[1, -2, 1, q],
[1, 1, -2, r],
])# 1行目と2行目を入れ替える
a1 = A[0, :].copy()
a2 = A[1, :].copy()
A[0, :] = a2
A[1, :] = a1
ALoading...
A[1,:] += 2 * A[0,:]
ALoading...
A[2,:] += -1 * A[0,:]
ALoading...
A[2,:] += 1 * A[1,:]
ALoading...
だと両者のRankが違うので解なし
連立一次方程式の定理より、両者のランクが合えば解が存在するのでなら成り立つ