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

Contents

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

5.1#

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

1.#

(123456)(x1x2)=(100)
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)

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

1-2. 係数行列の階数

(100100)

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

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

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

3

2.#

(112121211)(x1x2x3)=(033)
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

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

{x1c=1x2c=1
x3=c かつ {x1=c+1x2=c1
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.#

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

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 次方程式を解け。 $(123423410127)(x1x2x3x4)=(000)$

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
[123400127001270]
A[2, :] += A[1, :]
A
[123400127000000]
A[1, :] = A[1, :] * (-1)
A
[123400127000000]
A[0, :] += A[1, :] * (-2)
A
[1011000127000000]
{x1x310x4=0x22x3+7x4=0

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

{x1c110c2=0x22c1+7c2=0
{x3=c1x4=c2 かつ {x1=c1+10c2x2=2c17c2
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次方程式 $(211121112)(x1x2x3)=(pqr)$ の解が存在するための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
[121q211p112r]
A[1,:] += 2 * A[0,:]
A
[121q033p+2q112r]
A[2,:] += -1 * A[0,:]
A
[121q033p+2q033q+r]
A[2,:] += 1 * A[1,:]
A
[121q033p+2q000p+q+r]

p+q+r0だと両者のRankが違うので解なし

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

x12x2+x3=q3x2+3x3=p+2q
x12x2+x3=qx2+x3=(p+2q)/3

検算用