第10回 連立一次方程式の表現と解法の基礎
1. 講義情報と予習ガイド
- 講義回: 第10回
- 関連項目: 連立一次方程式、行列表現、解法の基礎
- 予習すべき内容: 行列の基本演算(第4-6回)、ベクトルと行列の関係(第7-8回)
2. 学習目標
本講義の終了時には、以下のことができるようになることを目指します:
- 連立一次方程式の行列表現ができるようになる
- 連立一次方程式の幾何学的意味を理解する
- 連立一次方程式の基本的な解法を習得する
- 連立一次方程式の解の種類とその特徴を理解する
- 連立一次方程式をPythonで解く方法を習得する
3. 基本概念
3.1 連立一次方程式とは
定義: 連立一次方程式とは、複数の一次方程式(変数の次数が全て1次である方程式)を同時に満たす解を求める問題です。
一般的な形式:
ここで、\(a_{ij}\)は係数、\(x_j\)は未知変数、\(b_i\)は定数項です。\(m\)は方程式の数、\(n\)は未知変数の数を表します。
例: 次の連立方程式を考えてみましょう。 $$ \begin{cases} 2x + 3y = 8\ 4x - y = 2 \end{cases} $$
この連立方程式には2つの未知変数(\(x\)と\(y\))と2つの方程式があります。
3.2 連立一次方程式の行列表現
連立一次方程式は行列とベクトルを用いて、より簡潔に表現することができます。
定義: \(m\)個の方程式と\(n\)個の未知数からなる連立一次方程式は、次の行列方程式で表すことができます。
\[A\mathbf{x} = \mathbf{b}\]ここで、\(A\)は\(m \times n\)の係数行列、\(\mathbf{x}\)は\(n\)次元の未知数ベクトル、\(\mathbf{b}\)は\(m\)次元の定数項ベクトルです。
具体的には:
例: 先ほどの連立方程式を行列表現すると:
これにより、複雑な連立方程式も簡潔に表現できます。
3.3 拡大係数行列
連立一次方程式を解く際には、「拡大係数行列」という概念が役立ちます。
定義: 拡大係数行列とは、係数行列\(A\)に定数項ベクトル\(\mathbf{b}\)を右側に追加した行列です。
\[[A|\mathbf{b}] = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} & | & b_1\\ a_{21} & a_{22} & \cdots & a_{2n} & | & b_2\\ \vdots & \vdots & \ddots & \vdots & | & \vdots\\ a_{m1} & a_{m2} & \cdots & a_{mn} & | & b_m \end{pmatrix}\]
例: 拡大係数行列の例
拡大係数行列は、連立方程式を解く際のガウスの消去法などで特に重要になります。
4. 理論と手法
4.1 連立一次方程式の解法
連立一次方程式を解くための基本的な方法には、以下のものがあります:
- 代入法: 一つの方程式から変数を他の変数で表し、それを他の方程式に代入する方法
- 加減法: 複数の方程式を加えたり引いたりして変数を消去する方法
- 行列の逆行列を用いる方法: \(A\mathbf{x} = \mathbf{b}\) から \(\mathbf{x} = A^{-1}\mathbf{b}\) を求める方法
- ガウスの消去法: 行の基本変形を用いて上三角行列または行簡約形に変形する方法
ここでは、それぞれの方法について具体例を用いて説明します。
4.1.1 代入法
例: 次の連立方程式を代入法で解きます。 $$ \begin{cases} 2x + 3y = 8\ 4x - y = 2 \end{cases} $$
解法: 1. 2番目の方程式から\(y\)について解きます:\(y = 4x - 2\) 2. この\(y\)の式を1番目の方程式に代入します:\(2x + 3(4x - 2) = 8\) 3. 整理します:\(2x + 12x - 6 = 8\) 4. さらに整理:\(14x = 14\) 5. よって\(x = 1\) 6. \(x = 1\)を\(y = 4x - 2\)に代入:\(y = 4 \cdot 1 - 2 = 2\) 7. 解は\((x, y) = (1, 2)\)です。
4.1.2 加減法
例: 同じ連立方程式を加減法で解きます。 $$ \begin{cases} 2x + 3y = 8 \quad \ldots (1)\ 4x - y = 2 \quad \ldots (2) \end{cases} $$
解法: 1. 方程式(1)の両辺を2倍します:\(4x + 6y = 16 \quad \ldots (1')\) 2. 方程式(1')から方程式(2)を引きます:\(6y + y = 16 - 2\) 3. 整理すると:\(7y = 14\) 4. よって\(y = 2\) 5. \(y = 2\)を方程式(2)に代入:\(4x - 2 = 2\) 6. 整理すると:\(4x = 4\) 7. よって\(x = 1\) 8. 解は\((x, y) = (1, 2)\)です。
4.1.3 行列の逆行列を用いる方法
例: 同じ連立方程式を行列の逆行列を用いて解きます。 \(\(A\mathbf{x} = \mathbf{b}\)\) ここで、 \(\(A = \begin{pmatrix} 2 & 3\\ 4 & -1 \end{pmatrix}, \quad \mathbf{x} = \begin{pmatrix} x\\ y \end{pmatrix}, \quad \mathbf{b} = \begin{pmatrix} 8\\ 2 \end{pmatrix}\)\)
解法: 1. \(A\)の逆行列\(A^{-1}\)を求めます。 \(\det(A) = 2 \cdot (-1) - 3 \cdot 4 = -2 - 12 = -14\)
\(A^{-1} = \frac{1}{\det(A)} \begin{pmatrix} -1 & -3\\ -4 & 2 \end{pmatrix} = \frac{1}{-14} \begin{pmatrix} -1 & -3\\ -4 & 2 \end{pmatrix} = \begin{pmatrix} \frac{1}{14} & \frac{3}{14}\\ \frac{4}{14} & -\frac{2}{14} \end{pmatrix}\)
-
\(\mathbf{x} = A^{-1}\mathbf{b}\)より: \(\(\mathbf{x} = \begin{pmatrix} \frac{1}{14} & \frac{3}{14}\\ \frac{4}{14} & -\frac{2}{14} \end{pmatrix} \begin{pmatrix} 8\\ 2 \end{pmatrix} = \begin{pmatrix} \frac{1}{14} \cdot 8 + \frac{3}{14} \cdot 2\\ \frac{4}{14} \cdot 8 + (-\frac{2}{14}) \cdot 2 \end{pmatrix} = \begin{pmatrix} \frac{8 + 6}{14}\\ \frac{32 - 4}{14} \end{pmatrix} = \begin{pmatrix} \frac{14}{14}\\ \frac{28}{14} \end{pmatrix} = \begin{pmatrix} 1\\ 2 \end{pmatrix}\)\)
-
解は\((x, y) = (1, 2)\)です。
4.2 連立一次方程式の幾何学的解釈
4.2.1 2元連立1次方程式の幾何学的解釈
2元連立1次方程式は平面上の直線として解釈できます。
- 各方程式は平面上の1本の直線を表します
- 連立方程式の解は、これらの直線の交点に対応します
例: 先ほどの連立方程式の幾何学的解釈
この2つの直線は点\((1, 2)\)で交わります。
連立方程式の解の存在については、次の3つのケースがあります:
- 唯一解: 2つの直線が1点で交わる(一般的なケース)
- 無数の解: 2つの直線が一致する(無限個の解)
- 解なし: 2つの直線が平行で交わらない
4.2.2 3元連立1次方程式の幾何学的解釈
3元連立1次方程式は3次元空間内の平面として解釈できます。
- 各方程式は3次元空間内の1つの平面を表します
- 連立方程式の解は、これらの平面の共通部分(交点や交線)に対応します
連立方程式の解の存在については、次のケースがあります:
- 唯一解: 3つの平面が1点で交わる
- 無数の解: 3つの平面が一直線または平面で交わる
- 解なし: 3つの平面に共通部分がない
5. Pythonによる実装と可視化
5.1 NumPyを用いた連立一次方程式の解法
NumPyライブラリのnumpy.linalg.solve
関数を使うと、連立一次方程式を簡単に解くことができます。
import numpy as np
import matplotlib.pyplot as plt
# 連立方程式の係数行列と定数項ベクトル
A = np.array([[2, 3], [4, -1]])
b = np.array([8, 2])
# 連立方程式を解く
x = np.linalg.solve(A, b)
print(f"解は x = {x[0]}, y = {x[1]}")
出力:
解は x = 1.0, y = 2.0
5.2 2元連立1次方程式の可視化
2元連立1次方程式の幾何学的解釈を視覚化してみましょう。
import numpy as np
import matplotlib.pyplot as plt
# 直線を描画するための関数
def plot_line(a, b, c, label):
"""ax + by = c の直線を描画"""
if b != 0:
x = np.linspace(-2, 4, 100)
y = (c - a * x) / b
else:
y = np.linspace(-2, 4, 100)
x = c / a * np.ones_like(y)
plt.plot(x, y, label=label)
# グラフの設定
plt.figure(figsize=(8, 6))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.grid(True, alpha=0.3)
# 2つの直線を描画
plot_line(2, 3, 8, '2x + 3y = 8')
plot_line(4, -1, 2, '4x - y = 2')
# 解を点でプロット
x_sol = 1
y_sol = 2
plt.scatter(x_sol, y_sol, color='red', s=100, label='解 (1, 2)')
plt.xlim(-2, 4)
plt.ylim(-2, 4)
plt.xlabel('x')
plt.ylabel('y')
plt.title('連立方程式 2x + 3y = 8, 4x - y = 2 の幾何学的解釈')
plt.legend()
plt.show()
5.3 3元連立1次方程式の例と解法
import numpy as np
# 3元連立一次方程式の例
# 2x + y - z = 8
# -3x + 4y + 2z = -2
# x + 2y + 3z = 11
# 係数行列と定数項ベクトル
A = np.array([[2, 1, -1], [-3, 4, 2], [1, 2, 3]])
b = np.array([8, -2, 11])
# 連立方程式を解く
x = np.linalg.solve(A, b)
print(f"解は x = {x[0]}, y = {x[1]}, z = {x[2]}")
出力:
解は x = 2.0, y = 1.0, z = 3.0
5.4 様々なケースの連立方程式
5.4.1 唯一解を持つ場合
import numpy as np
# 唯一解を持つ連立方程式
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 11])
try:
x = np.linalg.solve(A, b)
print(f"唯一解: x = {x[0]}, y = {x[1]}")
except np.linalg.LinAlgError as e:
print("解が存在しないか、一意に定まりません:", e)
出力:
唯一解: x = 1.0, y = 2.0
5.4.2 解が存在しない場合
import numpy as np
# 解が存在しない連立方程式(平行な直線)
A = np.array([[1, 2], [1, 2]])
b = np.array([5, 6]) # 異なる定数項
try:
x = np.linalg.solve(A, b)
print(f"解: x = {x[0]}, y = {x[1]}")
except np.linalg.LinAlgError as e:
print("解が存在しないか、一意に定まりません:", e)
出力:
解が存在しないか、一意に定まりません: Singular matrix
5.4.3 無数の解を持つ場合
無数の解を持つ場合は、numpy.linalg.solve
では直接扱えません。代わりに、一般解を求める方法としてnumpy.linalg.lstsq
を使用できます。
import numpy as np
# 無数の解を持つ連立方程式(同じ直線を表す方程式)
A = np.array([[1, 2], [2, 4]])
b = np.array([5, 10])
# ランクを確認
rank_A = np.linalg.matrix_rank(A)
rank_Ab = np.linalg.matrix_rank(np.column_stack([A, b]))
if rank_A == rank_Ab and rank_A < A.shape[1]:
print("無数の解が存在します")
# 最小二乗解を求める(一般解の一例)
x, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
print(f"一般解の一例: x = {x[0]}, y = {x[1]}")
else:
try:
x = np.linalg.solve(A, b)
print(f"唯一解: x = {x[0]}, y = {x[1]}")
except np.linalg.LinAlgError:
print("解が存在しません")
出力:
無数の解が存在します
一般解の一例: x = 1.0, y = 2.0
6. 健康データにおける連立一次方程式の応用
健康データ分析において、連立一次方程式はさまざまな場面で活用されます。
6.1 薬物動態モデル
薬物動態学では、薬物が体内でどのように吸収、分布、代謝、排泄されるかを数学的にモデル化します。最も基本的なコンパートメントモデルでは、連立微分方程式が用いられ、その定常状態解析には連立一次方程式が必要になります。
例: 2コンパートメントモデル
ある薬物が血液(コンパートメント1)と組織(コンパートメント2)の間で移動するモデルを考えます:
ここで、\(k_{12}\)は血液から組織への移行速度定数、\(k_{21}\)は組織から血液への移行速度定数、\(D\)は投与された薬物の総量です。
この連立方程式を解くことで、定常状態における各コンパートメントの薬物量を求めることができます。
import numpy as np
# パラメータ設定
k_12 = 0.3 # 血液から組織への移行速度定数
k_21 = 0.2 # 組織から血液への移行速度定数
D = 100 # 薬物の総量(mg)
# 連立方程式の係数行列と定数項ベクトル
A = np.array([[k_12, -k_21], [1, 1]])
b = np.array([0, D])
# 連立方程式を解く
x = np.linalg.solve(A, b)
print(f"血液中の薬物量: {x[0]:.1f} mg")
print(f"組織中の薬物量: {x[1]:.1f} mg")
出力:
血液中の薬物量: 40.0 mg
組織中の薬物量: 60.0 mg
6.2 栄養素バランスの最適化
栄養計画では、複数の栄養素要件を満たす食事の組み合わせを求める問題があります。これは連立一次方程式として表現できます。
例: 3種類の食品から2種類の栄養素要件を満たす問題
ここで、\(a_{ij}\)は食品\(j\)に含まれる栄養素\(i\)の量、\(x_j\)は食品\(j\)の摂取量、\(b_i\)は栄養素\(i\)の必要量です。
import numpy as np
from scipy.optimize import nnls
# 食品ごとの栄養素含有量(100gあたり)
# 食品: [タンパク質(g), カルシウム(mg)]
food_nutrition = np.array([
[20, 10], # 食品1: 鶏肉
[5, 120], # 食品2: 牛乳
[2, 30] # 食品3: 野菜
])
# 1日の必要栄養素量
required_nutrition = np.array([60, 800]) # [タンパク質(g), カルシウム(mg)]
# 最小二乗法で非負の解を求める(現実的には食品の摂取量は非負)
amounts, residual = nnls(food_nutrition.T, required_nutrition)
print("各食品の最適摂取量(g):")
food_names = ["鶏肉", "牛乳", "野菜"]
for i, name in enumerate(food_names):
print(f"{name}: {amounts[i]:.1f}g")
# 実際に摂取される栄養素量を計算
actual_nutrition = food_nutrition.T @ amounts
print("\n実際の栄養素摂取量:")
print(f"タンパク質: {actual_nutrition[0]:.1f}g")
print(f"カルシウム: {actual_nutrition[1]:.1f}mg")
出力:
各食品の最適摂取量(g):
鶏肉: 275.0g
牛乳: 633.3g
野菜: 0.0g
実際の栄養素摂取量:
タンパク質: 60.0g
カルシウム: 800.0mg
7. 演習問題
基本問題
-
次の連立方程式を解きなさい。 $$ \begin{cases} 3x + 2y = 7\ x - 4y = 9 \end{cases} $$
-
次の連立方程式を行列表現しなさい。 $$ \begin{cases} 2x - 3y + z = 7\ 5x + y - 2z = 4\ -x + 4y + 3z = 10 \end{cases} $$
-
次の連立方程式を解きなさい。 $$ \begin{cases} x + 2y + 3z = 14\ 2x - y + z = 4\ 3x + y - z = 2 \end{cases} $$
-
次の行列方程式を解きなさい。 $$ \begin{pmatrix} 2 & 5\ 1 & 3 \end{pmatrix} \begin{pmatrix} x\ y \end{pmatrix} = \begin{pmatrix} 16\ 10 \end{pmatrix} $$
応用問題
-
次の連立方程式の解の存在と一意性を判定し、解が存在する場合は求めなさい。 $$ \begin{cases} 2x + 4y = 6\ x + 2y = 3 \end{cases} $$
-
次の連立方程式の解の存在と一意性を判定し、解が存在する場合は求めなさい。 $$ \begin{cases} 2x + 4y = 6\ x + 2y = 4 \end{cases} $$
-
健康食品の栄養素計算 あるダイエット食品会社が、2種類の健康食品(製品AとB)を組み合わせた栄養バランス食を開発しています。製品Aは1袋あたりタンパク質15g、食物繊維5gを含み、価格は300円です。製品Bは1袋あたりタンパク質10g、食物繊維8gを含み、価格は250円です。栄養士の指導によると、1日あたりタンパク質50gと食物繊維30gを摂取することが推奨されています。1日の食事で推奨栄養素量をちょうど摂取するためには、製品AとBをそれぞれ何袋ずつ摂取する必要がありますか?また、その場合の1日あたりの総費用はいくらになりますか?
-
薬物投与の最適化: ある病院の薬剤師が、疼痛緩和のために2種類の鎮痛薬(薬剤XとY)の組み合わせを検討しています。臨床研究から、効果的な疼痛緩和と副作用の発生率を最小化するためには、以下の条件を満たす必要があることがわかっています:
- 薬剤Xの活性成分と薬剤Yの活性成分の合計が40mgになるようにする
- 薬剤Xの活性成分が薬剤Yの活性成分の60%になるようにする
薬剤Xは1錠あたり5mgの活性成分を含み、薬剤Yは1錠あたり10mgの活性成分を含んでいます。患者に処方すべき薬剤XとYの錠数をそれぞれ求めなさい。
- 健康診断センター:
健康診断センターでは、ある地域の住民のBMI(体格指数)と年齢の関係を調査しています。調査の過程で、特定の2つの年齢グループ(AとB)について以下の情報が得られました:グループAとグループBのそれぞれの人数を求めなさい。
- グループAとグループBの平均BMIはそれぞれ23.5と26.8である
- グループAとグループBを合わせた全体の平均BMIは25.7である
- グループBの人数はグループAの2倍である
- 全体の調査対象者数は300人である
8. よくある質問と解答
Q1: 連立方程式に解が存在しないとはどういうことですか?
A1: 幾何学的には、2元連立一次方程式の場合、2つの直線が平行で交わらない状態を表します。方程式の観点からは、矛盾した条件が与えられている状態です。例えば、\(x + y = 2\) と \(x + y = 3\) が同時に成り立つことはありません。
Q2: 連立方程式に無数の解があるとはどういうことですか?
A2: 2元連立一次方程式の場合、2つの直線が完全に重なっている状態を表します。例えば、\(x + y = 2\) と \(2x + 2y = 4\) は同じ直線を表すため、この直線上の無数の点が解となります。
Q3: なぜ行列で連立方程式を表現するのですか?
A3: 行列表現には以下のメリットがあります: 1. 連立方程式を簡潔に表記できる 2. 行列の演算法則を用いて効率的に解ける 3. コンピュータでの実装が容易 4. 理論的な解析がしやすい
Q4: 連立方程式の解の数と方程式の数、変数の数の関係は?
A4: 一般的に、\(n\)個の変数に対して\(n\)個の独立した方程式があれば、唯一解を持つ可能性があります。方程式の数が変数の数より少ない場合は、通常、無数の解を持ちます。方程式の数が変数の数より多い場合、解が存在しないことが多いですが、方程式に冗長性がある場合は解が存在することもあります。
Q5: データサイエンスの文脈では、連立方程式はどのように活用されますか?
A7: データサイエンスでは以下のような場面で連立方程式が活用されます: 1. 線形回帰モデル(最小二乗法) 2. 多変量解析(主成分分析など) 3. 信号処理(フィルタリング) 4. ネットワーク分析(均衡状態の解析) 5. 最適化問題(線形計画法) 特に次回以降の講義で扱う線形回帰モデルは、連立方程式の知識が直接応用される重要な例です。