練習問題メモ 5(連立1次方程式)

Contents

練習問題メモ 5(連立1次方程式)#

5.1#

掃き出し法により、次の1~3の連立1次方程式を解け。また、係数行列および拡大係数行列について、それぞれの階数を求めよ

1.#

\[\begin{split} \left(\begin{array}{ll} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{array}\right)\left(\begin{array}{l} x_1 \\ x_2 \end{array}\right)=\left(\begin{array}{l} 1 \\ 0 \\ 0 \end{array}\right) \end{split}\]
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)
\[\begin{split} \left(\begin{array}{cc|c} 1 & 0 & -2\\ 0 & 1 & 3/2 \\ 0 & 0 & 1/2 \end{array}\right) \end{split}\]

3行目も零ベクトルにできなかった → 不能?

1-2. 係数行列の階数

\[\begin{split} \begin{pmatrix} 1 & 0\\ 0 & 1\\ 0 & 0\\ \end{pmatrix} \end{split}\]

と、階段行列の形であり零の行ベクトルでない行数は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]])
\[\begin{split} \begin{cases} x_1 - x_3 = 1\\ x_2 - x_3 = -1 \end{cases} \end{split}\]

\(x_3\)を任意定数に置き換える

\[\begin{split} \begin{cases} x_1 - c = 1\\ x_2 - c = -1 \end{cases} \end{split}\]
\[\begin{split} x_3 = c \text{ かつ } \begin{cases} x_1 = c + 1\\ x_2 = c - 1 \end{cases} \end{split}\]
Hide 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.#

\[\begin{split} \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} 1 \\ 0 \\ 1 \end{array}\right) \end{split}\]
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
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 1\\0 & -1 & -2 & -7 & -2\\0 & 1 & 2 & 7 & 1\end{matrix}\right]\end{split}\]
A[2, :] += A[1, :]
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 1\\0 & -1 & -2 & -7 & -2\\0 & 0 & 0 & 0 & -1\end{matrix}\right]\end{split}\]
A[1, :] = A[1, :] * (-1)
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 1\\0 & 1 & 2 & 7 & 2\\0 & 0 & 0 & 0 & -1\end{matrix}\right]\end{split}\]
A[0, :] += A[1, :] * (-2)
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 0 & -1 & -10 & -3\\0 & 1 & 2 & 7 & 2\\0 & 0 & 0 & 0 & -1\end{matrix}\right]\end{split}\]

3行目を零ベクトルにできなかった → 不能?

係数行列のランク: 2

拡大係数行列のランク: 3

Hide 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))
Hide 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
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 0\\0 & -1 & -2 & -7 & 0\\0 & 1 & 2 & 7 & 0\end{matrix}\right]\end{split}\]
A[2, :] += A[1, :]
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 0\\0 & -1 & -2 & -7 & 0\\0 & 0 & 0 & 0 & 0\end{matrix}\right]\end{split}\]
A[1, :] = A[1, :] * (-1)
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 2 & 3 & 4 & 0\\0 & 1 & 2 & 7 & 0\\0 & 0 & 0 & 0 & 0\end{matrix}\right]\end{split}\]
A[0, :] += A[1, :] * (-2)
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & 0 & -1 & -10 & 0\\0 & 1 & 2 & 7 & 0\\0 & 0 & 0 & 0 & 0\end{matrix}\right]\end{split}\]
\[\begin{split} \begin{cases} x_1 - x_3 -10 x_4 = 0\\ x_2 - 2 x_3 + 7 x_4 = 0 \end{cases} \end{split}\]

\(x_3, x_4\)を任意定数に置き換える

\[\begin{split} \begin{cases} x_1 - c_1 -10 c_2 = 0\\ x_2 - 2 c_1 + 7 c_2 = 0 \end{cases} \end{split}\]
\[\begin{split} \begin{cases} x_3 = c_1\\ x_4 = c_2 \end{cases} \text{ かつ } \begin{cases} x_1 = c_1 + 10 c_2\\ x_2 = 2 c_1 - 7 c_2 \end{cases} \end{split}\]
Hide 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))
Hide 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
\[\begin{split}\displaystyle \left[\begin{matrix}1 & -2 & 1 & q\\-2 & 1 & 1 & p\\1 & 1 & -2 & r\end{matrix}\right]\end{split}\]
A[1,:] += 2 * A[0,:]
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & -2 & 1 & q\\0 & -3 & 3 & p + 2 q\\1 & 1 & -2 & r\end{matrix}\right]\end{split}\]
A[2,:] += -1 * A[0,:]
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & -2 & 1 & q\\0 & -3 & 3 & p + 2 q\\0 & 3 & -3 & - q + r\end{matrix}\right]\end{split}\]
A[2,:] += 1 * A[1,:]
A
\[\begin{split}\displaystyle \left[\begin{matrix}1 & -2 & 1 & q\\0 & -3 & 3 & p + 2 q\\0 & 0 & 0 & p + q + r\end{matrix}\right]\end{split}\]

\(p+q+r\neq 0\)だと両者のRankが違うので解なし

連立一次方程式の定理より、両者のランクが合えば解が存在するので\(p+q+r=0\)なら成り立つ

\[\begin{split} x_1 - 2x_2 + x_3 = q\\ -3x_2 + 3x_3 = p+2q \end{split}\]
\[\begin{split} x_1 - 2x_2 + x_3 = q\\ -x_2 + x_3 = (p+2q)/3 \end{split}\]

検算用