Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

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

5.1

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

1.

(123456)(x1x2)=(100)\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)
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)
(102013/2001/2)\left(\begin{array}{cc|c} 1 & 0 & -2\\ 0 & 1 & 3/2 \\ 0 & 0 & 1/2 \end{array}\right)

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

1-2. 係数行列の階数

(100100)\begin{pmatrix} 1 & 0\\ 0 & 1\\ 0 & 0\\ \end{pmatrix}

と、階段行列の形であり零の行ベクトルでない行数は2なので2

1-3. 拡大係数行列の階数

(3行目を2倍すれば対角成分が1になるので)

3

2.

(112121211)(x1x2x3)=(033)\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)
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]])
{x1x3=1x2x3=1\begin{cases} x_1 - x_3 = 1\\ x_2 - x_3 = -1 \end{cases}

x3x_3を任意定数に置き換える

{x1c=1x2c=1\begin{cases} x_1 - c = 1\\ x_2 - c = -1 \end{cases}
x3=c かつ {x1=c+1x2=c1x_3 = c \text{ かつ } \begin{cases} x_1 = c + 1\\ x_2 = c - 1 \end{cases}
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

3.

(123423410127)(x1x2x3x4)=(101)\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)
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
Loading...
A[2, :] += A[1, :]
A
Loading...
A[1, :] = A[1, :] * (-1)
A
Loading...
A[0, :] += A[1, :] * (-2)
A
Loading...

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

5.2

掃き出し法により、次の同次連立 1 次方程式を解け。

(123423410127)(x1x2x3x4)=(000)\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
Loading...
A[2, :] += A[1, :]
A
Loading...
A[1, :] = A[1, :] * (-1)
A
Loading...
A[0, :] += A[1, :] * (-2)
A
Loading...
{x1x310x4=0x22x3+7x4=0\begin{cases} x_1 - x_3 -10 x_4 = 0\\ x_2 - 2 x_3 + 7 x_4 = 0 \end{cases}

x3,x4x_3, x_4を任意定数に置き換える

{x1c110c2=0x22c1+7c2=0\begin{cases} x_1 - c_1 -10 c_2 = 0\\ x_2 - 2 c_1 + 7 c_2 = 0 \end{cases}
{x3=c1x4=c2 かつ {x1=c1+10c2x2=2c17c2\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}
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

5.3

p,q,rを定数とする。連立1次方程式

(211121112)(x1x2x3)=(pqr)\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
Loading...
A[1,:] += 2 * A[0,:]
A
Loading...
A[2,:] += -1 * A[0,:]
A
Loading...
A[2,:] += 1 * A[1,:]
A
Loading...

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

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

x12x2+x3=q3x2+3x3=p+2qx_1 - 2x_2 + x_3 = q\\ -3x_2 + 3x_3 = p+2q
x12x2+x3=qx2+x3=(p+2q)/3x_1 - 2x_2 + x_3 = q\\ -x_2 + x_3 = (p+2q)/3