どうも、木村(@kimu3_slime)です。
今回は、Julia(SymPy)で連立方程式(線形方程式)を解く方法を紹介します。行列は使わず、中学校で学ぶ知識で使えるものです。
準備
SymPyを使うので、持っていなければインストールしておきましょう。
1 2 | using Pkg Pkg.add("SymPy") |
準備として、以下のコードを実行しておきます。
1 | using SymPy |
連立方程式を解く方法
変数として、複数の記号を用意しましょう。
1 | x,y,z = symbols("x y z") |
「linsolve([方程式1,方程式2],(変数1,変数2))」で連立方程式(2元連立1次方程式)を解くことができます。
\(x-y=1\)という方程式を表したいならば、右辺を0にした形\(x-y-1=0\)にして、左辺の数式「\(x-y-1\)」を使って方程式を表すことになっています。
\[ \begin{aligned} \left\{ \begin{array} {l} x-y=1\\ -2x+y=4 \end{array} \right.\end{aligned} \]
1 | linsolve([x-y-1,-2*x+y-4],(x,y)) |
\[ \begin{aligned}\left\{\left( -5, \ -6\right)\right\}\end{aligned} \]
この結果は、\(x=-5,y=-6\)が解という意味です。
方程式に代入して確かめてみましょう。「数式.subs(変数,値)」で、値を代入することができます。
1 2 | [x-y-1,-2*x+y-4] [x-y-1,-2*x+y-4].subs([(x,-5),(y,-6)]) |
\[ \begin{aligned}\left[ \begin{array}{r}x – y – 1\\- 2 x + y – 4\end{array} \right]\end{aligned} \]
\[ \begin{aligned}\left[ \begin{array}{r}0\\0\end{array}\right]\end{aligned} \]
確かに結果がどちらも0となり、方程式を満たしていることがわかります。
\[ \begin{aligned} \left\{ \begin{array} {l} x-y=1\\ 2x-2y=-4 \end{array} \right.\end{aligned} \]
1 | linsolve([x-y-1,2*x-2*y+4],(x,y)) |
\[ \begin{aligned}\emptyset\end{aligned} \]
\(\emptyset\)は空集合の記号で、方程式に解が存在しないことを意味しています。
\[ \begin{aligned} \left\{ \begin{array} {l} x-y=1\\ 0x+0y=0 \end{array} \right.\end{aligned} \]
1 | linsolve([x-y-1,0],(x,y)) |
\[ \begin{aligned}\left\{\left( y + 1, \ y\right)\right\}\end{aligned} \]
実質1本の方程式です。\(y\)を任意の数として、\(x=y+1\)と表される数が解です。
変数を3にした、3元連立1次方程式も同様に解けます。
\[ \begin{aligned} \left\{ \begin{array} {l} x+2y+3z=4\\ 5x+6y+7z=8\\9x+10y+11z=12 \end{array} \right.\end{aligned} \]
1 | linsolve([x+2*y+3*z-4,5*x+6*y+7*z-8,9*x+10*y+11*z-12],(x,y,z)) |
\[ \begin{aligned}\left\{\left( z – 2, \ 3 – 2 z, \ z\right)\right\}\end{aligned} \]
\(z\)を任意の数として、\(x=z-2,y=3-2z\)と表される数が解です。代入によって検算もできます。
1 | [x+2*y+3*z-4,5*x+6*y+7*z-8,9*x+10*y+11*z-12].subs([(x,z-2),(y,3-2*z)]) |
\[ \begin{aligned}\left[ \begin{array}{r}0\\0\\0\end{array}\right]\end{aligned} \]
以上、Julia(SymPy)で連立方程式を解く方法を紹介してきました。
解が存在しない場合や、解が無数にある場合も含め、文字で表したまま代数的に解けるのが嬉しいですね。
木村すらいむ(@kimu3_slime)でした。ではでは。
コロナ社 (2020-03-26T00:00:01Z)
¥7,353 (コレクター商品)
こちらもおすすめ
Julia(SymPy)によるテイラー級数展開の求め方(指数対数、三角、双曲線)
Julia(SymPy)で1変数関数を積分する方法(多項式、指数対数、三角関数)
Julia(SymPy)で1変数関数を微分する方法(多項式、指数対数、三角関数)
.Julia(SymPy)で有理関数を部分分数分解、通分する方法
Julia(SymPy)で多項式の展開・因数分解、方程式を解く方法
Juliaで1変数関数のグラフを描く方法(多項式、指数対数、三角関数)