練習問題メモ 5(連立1次方程式)#
5.1#
掃き出し法により、次の1~3の連立1次方程式を解け。また、係数行列および拡大係数行列について、それぞれの階数を求めよ
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)
A
array([[ 1., 2., 1.],
[ 1., 0., -2.],
[ 5., 6., 0.]], dtype=float32)
# 1行目を-3倍して3行目に加える
A[2, :] += A[0, :] * (-3)
A
array([[ 1., 2., 1.],
[ 1., 0., -2.],
[ 2., 0., -3.]], dtype=float32)
# 3行目を(1/2)倍する
A[2, :] = (1 / 2) * A[2, :]
A
array([[ 1. , 2. , 1. ],
[ 1. , 0. , -2. ],
[ 1. , 0. , -1.5]], dtype=float32)
# 2行目を-1倍して3行目に加える
A[2, :] += A[1, :] * (-1)
A
array([[ 1. , 2. , 1. ],
[ 1. , 0. , -2. ],
[ 0. , 0. , 0.5]], dtype=float32)
# 2行目を-1倍して1行目に加える
A[0, :] += A[1, :] * (-1)
A
array([[ 0. , 2. , 3. ],
[ 1. , 0. , -2. ],
[ 0. , 0. , 0.5]], dtype=float32)
# 1行目を(1/2)倍する
A[0, :] = (1 / 2) * A[0, :]
A
array([[ 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
A
array([[ 1. , 0. , -2. ],
[ 0. , 1. , 1.5],
[ 0. , 0. , 0.5]], dtype=float32)
3行目も零ベクトルにできなかった → 不能?
1-2. 係数行列の階数
と、階段行列の形であり零の行ベクトルでない行数は2なので2
1-3. 拡大係数行列の階数
(3行目を2倍すれば対角成分が1になるので)
3
2.#
\[\begin{split} \left(\begin{array}{ccc} 1 & 1 & -2 \\ 1 & -2 & 1 \\ -2 & 1 & 1 \end{array}\right)\left(\begin{array}{l} x_1 \\ x_2 \\ x_3 \end{array}\right)=\left(\begin{array}{c} 0 \\ 3 \\ -3 \end{array}\right) \end{split}\]
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)
A
array([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[-2, 1, 1, -3]])
# 1行目を2倍して3行目に加える
A[2, :] += A[0, :] * (2)
A
array([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[ 0, 3, -3, -3]])
# 2行目を3行目に加える
A[2, :] += A[1, :] * (1)
A
array([[ 1, 1, -2, 0],
[ 0, -3, 3, 3],
[ 0, 0, 0, 0]])
# 2行目を1/3する
A[1, :] = A[1, :] * (-1/3)
A
array([[ 1, 1, -2, 0],
[ 0, 1, -1, -1],
[ 0, 0, 0, 0]])
# 2行目を1行目から引く
A[0, :] += A[1, :] * (-1)
A
array([[ 1, 0, -1, 1],
[ 0, 1, -1, -1],
[ 0, 0, 0, 0]])
\(x_3\)を任意定数に置き換える
Show code cell 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)
3.#
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)
A
A[2, :] += A[1, :]
A
A[1, :] = A[1, :] * (-1)
A
A[0, :] += A[1, :] * (-2)
A
3行目を零ベクトルにできなかった → 不能?
係数行列のランク: 2
拡大係数行列のランク: 3
Show code cell 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))
Show code cell output
係数行列のランク: 2
拡大係数行列のランク: 3
5.2#
掃き出し法により、次の同次連立 1 次方程式を解け。 $\( \left(\begin{array}{llll} 1 & 2 & 3 & 4 \\ 2 & 3 & 4 & 1 \\ 0 & 1 & 2 & 7 \end{array}\right)\left(\begin{array}{l} x_1 \\ x_2 \\ x_3 \\ x_4 \end{array}\right)=\left(\begin{array}{l} 0 \\ 0 \\ 0 \end{array}\right) \)$
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)
A
A[2, :] += A[1, :]
A
A[1, :] = A[1, :] * (-1)
A
A[0, :] += A[1, :] * (-2)
A
\(x_3, x_4\)を任意定数に置き換える
Show code cell 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))
Show code cell output
係数行列のランク: 2
拡大係数行列のランク: 2
5.3#
p,q,rを定数とする。連立1次方程式 $\( \left(\begin{array}{ccc} -2 & 1 & 1 \\ 1 & -2 & 1 \\ 1 & 1 & -2 \end{array}\right)\left(\begin{array}{l} x_1 \\ x_2 \\ x_3 \end{array}\right)=\left(\begin{array}{l} p \\ q \\ r \end{array}\right) \)$ の解が存在するためのp,q,rの条件を求めよ。
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
A
A[1,:] += 2 * A[0,:]
A
A[2,:] += -1 * A[0,:]
A
A[2,:] += 1 * A[1,:]
A
\(p+q+r\neq 0\)だと両者のRankが違うので解なし
連立一次方程式の定理より、両者のランクが合えば解が存在するので\(p+q+r=0\)なら成り立つ
検算用