NumPy使ってn元一次の連立方程式といてみた

数学用語の使い方は突っ込むんじゃない!
NumPyの行列でといてみた。行列習ってないけど。
というわけで、行列とは何かを考える野暮大変なことはしない。
InputとOutput!これから習うんだから行列は華麗にスルー。

たとえば、
\{0.5x-0.5y=1\\0.5x+y=2
のx,yを求めてみる。
ちなみに解は、\{x=\frac{8}{3}\\y=\frac{2}{3}になる。
どうやらこれは行列を使って
\(\begin{array}0.5&-0.5\\0.5&1\end{array}\)\(\begin{array}x\\y\end{array}\)=\(\begin{array}1\\2\end{array}\)
とあらわせるらしい。ちょっとかじった行列の掛け算考えてもまぁそうか。

で、この\(\begin{array}0.5&-0.5\\0.5&1\end{array}\)\(\begin{array}1\\2\end{array}\)を与えるとxとyを出す関数がNumpyにはある。
どうやってやってるのかはよくわかんないけど。逆行列?なにそれ。まぁそのうち行列勉強するです。

とりあえずNumPyをダウンロードしてインスコ
それで、インタラクティブシェルを開いてこんな風に打っておく。

>>> from numpy import *
>>> from numpy.linalg import solve

さて、見てわかるとおり二つの行列を与えると解を返すsolveです。
次に、\(\begin{array}0.5&-0.5\\0.5&1\end{array}\)\(\begin{array}1\\2\end{array}\)pythonであらわしてみる。

>>> a = array([[0.5, -0.5], [0.5, 1]])
>>> b = array([1, 2])

どうやら、NumPyではarray([列のリスト(行),列のリスト(行)・・・])とあらわすっぽい。
それで最後に

>>> x = solve(a, b)
>>> x
array([ 2.66666667,  0.66666667])

できあがり。
x=\frac{8}{3}=2.\dot~6だし、y=\frac{2}{3}=0.\dot~6なので問題無いっぽい。
めでたしめでたし。

ちなみに。
今回のaの行列は、列の数と行の数が同じ、つまり正方形の形をしている必要があり、
bの行列は列の数が1で行の数はaの行の数と同じである必要がある。
じゃないとsolveに与えたときにエラー吐く。
なぜかっていうのは想像だけど、
aの行列は列の数がn元一次方程式のnを示すからだと思う。
二元一次の連立方程式に必要な式の数は普通xとyの二文字を使ってるから2だし、
三元一次の連立方程式に必要な式の数は普通xとyとzの三文字を使ってるから3だし。
bの行列の列の数に関しては当たり前な気がする。

・・記事を書いた時間の80%はTeXを調べることに費やしています。
はてな記法便利なんだけどねー

参考資料