2016-07-17 62 views
6

PythonのSympyライブラリでスクリプトを作成し、solveset()とlinsolve()関数から返された結果にアクセスしようとしています。私の問題は、これらの関数によって返されるオブジェクトがfiniteset型であることと、他の式で再入力するためにいくつかの結果を自動的に選択したいということです。 体はどんなものでも助けてくれますか?sympyによってfinitesetとして返された解集合から値を取得

例:関数linsolve()メソッドとそれを解決そして

>>>lista=[eq2_1,eq2_2] 
>>>str(lista) 
[-3*a1/10 - 3*a2/20 + 1/12, -3*a1/20 - 13*a2/105 + 1/20] 

: 私は2つの未知変数を方程式のリストを作成します。

>>>a=linsolve(lista,a1,a2) 
>>>a 
{(71/369, 7/41)} 

結果は正しいですが、これらの結果を変数に取り込むことができません。

Oはdics、lists、tuples、indexingコマンドを試しましたが、常にエラーを返します。 "Finitesetオブジェクトには属性 'コマンドがありません"

答えて

2

iterを使用して、セットに基づいたイテレータを取得し、次にnextを使用して、そのセットの1つの要素を返します(要素が1つだけ必要な場合)。

例:

from sympy import * 
var('x y') 
sol = linsolve([x+y-2, 2*x-3*y], x, y) 
(x0, y0) = next(iter(sol)) 

今x0が6/5で、Y0は4/5です。この場合a[0]に -

2

Aもう少し一般的な解決策は、単純に、あなたは、標準のインデックスを使用して要素を抽出することができますlist

>>> a=list(linsolve(lista,a1,a2)) 
>>> a 
[(71/369, 7/41)] 

標準のpythonにFiniteSetを変換することです。しかし、複数のソリューションがある場合は、必要なものだけを引き出すことができます。

4

私は、関数または結果オブジェクトでhttp://docs.sympy.org/latest/tutorial/manipulation.html

使用.args atributeこのリンクにsympyライブラリ方法を見つけました。 私が機能している場合:

>>>func = Eq(u(x),−x+sin(x)) 
>>>func 
u(x) = -x + sin(x) 
>>>func.args[0] 
u(x) 
>>>func.args[1] 
-x+sin(x) 

を同じ有限集合タイプである結果のために適用されます。

+0

をこれが正しい答えであります – shrewmouse

0

あなたは、引数の開梱との組み合わせでtupleを使用することができます。

var('x y z') 
eqs = [ x + y + z - 1, x + y + 2*z - 3 ] 
sol = linsolve(eqs, x, y, z) 
(x0, y0, z0) = tuple(*sol) 

は今、あなたが解決策を確認することができます。

eqs[0].subs([(x, x0), (y, y0), (z, z0)]) 
eqs[1].subs([(x, x0), (y, y0), (z, z0)]) 
関連する問題