プログラミング言語Pythonを使って方程式・連立方程式を解いてみたいと思います。
今回は数値計算ライブラリNumPyを使って数値的に解く方法をみていきます。
代数的に厳密に解く方法は、数式処理ライブラリSymPyを使っている次の記事
で紹介しています。
数学定数の値
まずNumPyに慣れるためにいくつかの数学定数をみてみましょう:
import numpy numpy.sqrt(2)
numpy.e
numpy.pi
numpy.log(2)
もちろんいずれも無限小数ですから誤差を含んでいることには注意が必要です:たとえば
numpy.sqrt(2)**2
と計算されて、最後の桁に誤差が現れていることがわかります。
以下ではその都度numpyとつけるのが面倒なので
import numpy as np
と省略しておきます:例えば
np.pi
代数方程式の数値解
代数方程式
の解をPythonで数値的に求めるには
import numpy as np np.roots([a_1, a_2, ..., a_n-1, a_n])
と入力します。
例えば2次方程式
を考えてみましょう。解の公式から
ですが、実際
np.roots([1, 2, 3])
と入力することにより
が出力され、確かに数値解が得られていることがわかります。
また別な例としては、一般に解の公式が存在しない5次方程式
を考えてみましょう。
この方程式は数式処理をするSymPyでは解くことができません:
import sympy sympy.var('x') sympy.solve (x**5+6*x**4+x**3+x+1, x)
ところがNumPyを用いると
np.roots([1, 6, 1, 0, 1, 1])
によって、その数値解を
と求めることができます。
連立1次方程式の数値解
(独立な)連立1次方程式は原理的に厳密に解を求めることができるので、
ことさら数値解と強調する必要はないかもしれませんが、
ここではNumPyを用いて解く方法としてまとめておきます。
連立1次方程式
の解は、行列
として求められます。
これをNumPyで計算するには、まず行列を
A = np.matrix([ [a_11, a_12, ..., a_1n], [a_21, a_22, ..., a_2n], [...., ...., ...., ....] [a_n1, a_n2, ..., a_nn] ])
で入力し、その逆行列を
np.linalg.inv(A)
によって求めます。そして列ベクトル を
Y = np.matrix([ [y_1], [y_2], [...], [y_n] ])
によって入力し、 と掛け合わせます:
np.linalg.inv(A)*Y
これで連立1次方程式の解が得られたことになります。
例えば、2変数の連立1次方程式
に対しては
A = np.matrix([ [2, 1], [1, 3] ]) Y = np.matrix([ [3], [4] ]) np.linalg.inv(A)*Y
より解
を得ます。または
np.linalg.solve(A,Y)
と入力することによっても解を得ることができます。