2016-07-17 23 views
6

Tworzę skrypt w bibliotece Python Sympy i próbuję uzyskać dostęp do wyniku zwróconego przez funkcje solveset() i linsolve(). Mój problem polega na tym, że obiekt zwracany przez te funkcje jest typu finiteset i chcę wybrać niektóre wyniki automatycznie, aby ponownie wprowadzić je w innych równaniach. Jakieś ciało mogłoby mi pomóc?Uzyskaj wartość z zestawu rozwiązań zwróconego jako skończony zestaw przez Sympy

przykład: tworzę listę równań z dwoma nieznanymi zmiennymi:

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

Potem go rozwiązać metodą linsolve().

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

Wynik jest poprawny, ale nie mogę uzyskać tych wyników w zmiennej.

O wypróbowane dics, listy, krotki, polecenia indeksowania, ale zawsze zwraca błąd. „Obiekty Finiteset ma atrybut«komenda»”

Odpowiedz

2

Można użyć iter dostać iterator opartą na planie, a następnie next wrócić jeden element tego zestawu (jeśli trzeba tylko jeden element).

przykład:

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

teraz x0 6/5 i 4/5 Y0.

2

Nieco bardziej ogólne rozwiązanie jest po prostu przekonwertować FiniteSet do standardowego pytona list

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

Następnie można wyodrębnić elementy za pomocą standardowego indeksowanie - w tym przypadku a[0]. Ale jeśli masz wiele rozwiązań, możesz po prostu wyciągnąć to, co chcesz.

4

znalazłem sympy sposób biblioteki w ten link http://docs.sympy.org/latest/tutorial/manipulation.html

Stosować .args atribute w funkcji lub wynikowego obiektu. Jeśli mam funkcję:

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

To samo dotyczy wyniku, który jest zbiorem typu skończony.

+0

To jest właściwa odpowiedź – shrewmouse

0

tuple można używać w połączeniu z rozpakowywania argumentu:

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) 

Teraz można sprawdzić rozwiązanie:

eqs[0].subs([(x, x0), (y, y0), (z, z0)]) 
eqs[1].subs([(x, x0), (y, y0), (z, z0)])