環境
- Julia 1.7.2
- SymPy 1.1.4
背景
SymPy を使って連立方程式の解を求めたところまでは良かったのですが、その値を取り出すのに苦労したので自分のやりかたを書いておきます。
コメントで WolfMoon 様にご教示いただいたのですが、連立方程式を解く際に linsolve ではなく solve を用いれば結果が Dict で戻ってくるようです。その場合は以下のような手順を踏まずとも、もっと楽に結果が取得できます。
以下のようにそのまま取り出そうとするとうまく行きません。
julia> using SymPy;
julia> @vars x y;
julia> f = x + y - 1;
julia> g = x - y - 3;
julia> results = sympy.linsolve([f, g], (x, y))
{(2, -1)}
julia > results[1]
{(2, -1)}
方法
results が SymPy の Set なので SymPy で用意されている elements 関数を使うと取り出せます。ただ各要素は Sym 型なので pyobject を取得してから値を取り出すようにします。
julia> elements(results)
1-element Vector{Sym}:
(2, -1)
julia> pytuple = first(elements(results)).__pyobject__
PyObject (2, -1)
julia> pytuple[1]
2
PyObject のタプルまで変換すればイテレータも使えるようになるので関数への代入も簡単です。
julia> pairs = Tuple(zip((x, y), pytuple))
((x, 2), (y, -1))
julia> f.subs(pairs)
0
もっとスマートな方法があれば是非ご教示ください。