pythonを使うと連立方程式を簡単に計算することができます。
pythonで連立方程式を解く2つの方法
pythonで連立方程式を計算する方法は2つあります。sympy.solve()、numpy.linalg.solve()です。
sympy.solve()の方がコードが分かりやすい、2元2次方程式も簡単に計算できるのでおすすめです。
sympy.solve()で連立方程式を計算する
sympyはxやyなどの記号を使用した計算をするためのライブラリです。連立方程式はもちろん、因数分解や微分方程式なども計算することができます。
この記事のコーディングは全てグーグルコラボラトリーを使っています。
連立一次方程式を解く
次の連立一次方程式をsympy.solve()で計算します。
\(
\begin{eqnarray}
\left\{
\begin{array}{l}
2x – y = 1 \\
x + y = 5
\end{array}
\right.
\end{eqnarray}
\)
import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
equation1 = 2*x - y - 1
equation2 = x + y - 5
print(sympy.solve([equation1, equation2]))
出力: {x: 2, y: 3}
コードは以下の手順で書かれています。
- sympyをインポート
- 使う記号を宣言(今回はxとy)
- 方程式を0=の形に変形させて作成
- sympy.solve([方程式1, 方程式2])で連立方程式を計算
方程式を0=の形に変形させる際に、符号を変える必要があるので注意してください。
sympyでの計算はどのような連立方程式を計算したいのか一目でわかりますね。
3変数の連立方程式を解く
x, y, zのような3変数の連立方程式も先ほどと同様のコードで簡単に計算することが可能です。それでは次の3変数の連立方程式を解いてみましょう。
\(
\begin{eqnarray}
\left\{
\begin{array}{l}
x + y – z = -6 \\
2x + 4y + 3z = 9 \\
5x + 3y + z = 4
\end{array}
\right.
\end{eqnarray}
\)
import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
z = sympy.Symbol('z')
equation1 = x + y - z + 6
equation2 = 2*x + 4*y + 3*z - 9
equation3 = 5*x + 3*y + z - 4
print(sympy.solve([equation1, equation2, equation3]))
出力: {x: 2, y: 5, z: 3}
今回は3変数のため、x, y, zと3つの記号を宣言しました。sympy.solve()に3つの式を入れることでそれぞれの解が得られました。
2元2次連立方程式を解く
2次方程式の連立方程式(2元2次連立方程式)もsympy.solve()で計算できます。次の連立方程式を解いてみます。
\(
\begin{eqnarray}
\left\{
\begin{array}{l}
x^2 + 2x – y^2 – 2y = 5 \\
2x + y = 1
\end{array}
\right.
\end{eqnarray}
\)
import sympy
x = sympy.Symbol('x')
y = sympy.Symbol('y')
equation1 = x**2 + 2*x - y**2 - 2*y - 5
equation2 = 2*x + y - 1
print(sympy.solve([equation1, equation2]))
出力: [{x: 4/3, y: -5/3}, {x: 2, y: -3}]
x2はx**2と記述します。同様にx3はx**3、x4はx**4と記述します。自分で計算すると手間がかかる2元2次連立方程式も、pythonとsympyを使うことで簡単に計算できました。
numpy.linalg.solve()で連立方程式を解く
numpyは行列のような配列の計算を容易にしてくれるライブラリです。numpyで連立方程式を解く場合、連立方程式を行列に変形して計算します。2元2次連立方程式を行列に変形することは難しいため、計算したい場合はsympyを使いましょう。
連立一次方程式を解く
連立一次方程式を行列に変換すると次のようになります。
\(
\begin{eqnarray}
\left\{
\begin{array}{l}
2x – y = 1 \\
x + y = 5
\end{array}
\right.
\end{eqnarray}
\Longrightarrow
\begin{bmatrix}
2 & -1 \\
1 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y
\end{bmatrix}
=
\begin{bmatrix}
1 \\
5
\end{bmatrix}
\)
この行列をnumpy.linalg.slove()で計算します。
import numpy as np
left = [[2, -1],
[1, 1]]
right = [1, 5]
print(np.linalg.solve(left, right))
出力: [2. 3.]
0が省略されていますが、x=2, y=3の結果が得られました。numpyでも連立一次方程式が計算出来ましたね。
3変数の連立方程式を解く
3変数の連立方程式はどうでしょう。まずは行列に変形してみます。
\(
\begin{eqnarray}
\left\{
\begin{array}{l}
x + y – z = -6 \\
2x + 4y + 3z = 9 \\
5x + 3y + z = 4
\end{array}
\right.
\end{eqnarray}
\Longrightarrow
\begin{bmatrix}
1 & 1 & -1 \\
2 & 4 & 3\\
5 & 3 & 1
\end{bmatrix}
\begin{bmatrix}
x \\
y \\
z
\end{bmatrix}
=
\begin{bmatrix}
-6 \\
9 \\
4
\end{bmatrix}
\)
それでは変形した行列をnumpy.linalg.slove()で計算します。
import numpy as np
left = np.array([[1, 1, -1],
[2, 4, 3],
[5, 3, 1]])
right = np.array([-6, 9, 4])
print(np.linalg.solve(left, right))
出力: [ 1. -2. 5.]
こちらも先ほどと同じ答えになりました。numpyを用いた方法は符号の変換が無い分、記述間違いが少ないです。
2元2次連立方程式を解くことは難しい
numpyでの2元2次連立方程式の計算はおすすめしません。2次方程式を行列に変形することに手間がかかるためです。どうしても2元2次連立方程式を計算したい場合はsympyを使いましょう。
まとめ
今回はpythonで連立方程式を解く方法を2つ紹介しました。どちらの方法でも計算できますが、コードのわかりやすさや2次方程式も容易に計算できる点から、sympyをおすすめします。
コメント