データ解析や科学技術計算の分野では、複数の変数を持つ方程式(連立一次方程式)を解く場面が頻繁に発生します。Pythonの数値計算ライブラリであるNumPyを使用することで、これらの計算を効率的かつ少ないコード量で実装可能です。
本記事では、numpy.linalg.solve 関数を用いた連立方程式の解法と、計算結果の検算方法について解説します。
連立一次方程式の定義とNumPyでの表現
ここでは、具体的な例として以下の2変数の連立方程式を考えます。ある店舗における商品Aと商品Bの販売セット価格から、それぞれの単価を算出するようなケースです。
方程式の例
- 商品Aを2個、商品Bを1個買った場合の合計金額:400円
- 商品Aを1個、商品Bを3個買った場合の合計金額:450円
これを数式(テキスト表現)で整理すると以下のようになります。
2x + 1y = 400 1x + 3y = 450
この方程式を行列の形式で扱う場合、以下のように係数行列と定数ベクトルに分解します。
係数行列(左辺の係数) [[2, 1], [1, 3]]
定数ベクトル(右辺の値) [400, 450]
numpy.linalg.solveを用いた実装
NumPyの linalg モジュールに含まれる solve 関数を使用すると、係数行列と定数ベクトルを渡すだけで解(x, y)を求めることができます。
以下に、上記の方程式を解くための完全なPythonコードを示します。
import numpy as np
def solve_linear_equations():
"""
NumPyを用いて連立一次方程式を解く関数
方程式:
2x + 1y = 400
1x + 3y = 450
"""
# 係数行列 (2x2)
# 行列の各行が1つの方程式に対応します
coefficient_matrix = np.array([
[2, 1],
[1, 3]
])
# 定数ベクトル (右辺の値)
dependent_values = np.array([400, 450])
# 連立方程式を解く
# 解 solution は [x, y] の順で格納されます
solution = np.linalg.solve(coefficient_matrix, dependent_values)
# 結果の表示
print("--- 計算結果 ---")
print(f"商品Aの単価 (x): {solution[0]}")
print(f"商品Bの単価 (y): {solution[1]}")
return coefficient_matrix, solution, dependent_values
def verify_solution(coef_matrix, sol, dep_values):
"""
計算された解が正しいか検算を行う関数
(係数行列) × (解) が (定数ベクトル) と一致するか確認します
"""
# 行列積を計算: Ax = b になるか確認
calculated_values = np.dot(coef_matrix, sol)
print("\n--- 検算 ---")
print(f"方程式への代入結果: {calculated_values}")
print(f"元の定数ベクトル : {dep_values}")
# 数値的に近似しているか確認 (浮動小数点計算の誤差を考慮)
is_correct = np.allclose(calculated_values, dep_values)
print(f"検算結果: {'正解' if is_correct else '不正解'}")
if __name__ == "__main__":
# 方程式を解く
coef, sol, dep = solve_linear_equations()
# 検算を行う
verify_solution(coef, sol, dep)
コードの解説
- 係数行列の定義:
np.arrayを用いて、変数(x, y)にかかる係数を2次元配列として定義します。 - 定数ベクトルの定義: 方程式の右辺となる値を1次元配列として定義します。
- 解の計算:
np.linalg.solve(A, b)を呼び出すことで、Ax = b を満たす x(解ベクトル)が返されます。
計算精度の確認(検算)
得られた解が正しいかどうかを確認するには、元の係数行列と解ベクトルの行列積(ドット積)を計算し、それが元の定数ベクトルと一致するかを見ます。
上記のコードでは np.dot 関数を用いて検算を行っています。また、浮動小数点計算には微細な誤差が含まれる場合があるため、厳密な一致判定ではなく np.allclose を使用して、「数値的に十分近いか」を判定するのが一般的です。
実行結果は以下の通りとなります。
--- 計算結果 ---
商品Aの単価 (x): 150.0
商品Bの単価 (y): 100.0
--- 検算 ---
方程式への代入結果: [400. 450.]
元の定数ベクトル : [400 450]
検算結果: 正解
このように、NumPyを使用することで、複雑な行列演算を意識することなく連立一次方程式の解を求めることが可能です。3変数以上の方程式であっても、行列のサイズを拡張するだけで同様の手順で処理できます。
