2016-07-17 1 views
6

Ich bin ein Skript in Python Sympy-Bibliothek erstellen und versuchen, auf das Ergebnis von lostset() und linsolve() Funktionen zurückgegeben. Mein Problem ist, dass das von diesen Funktionen zurückgegebene Objekt vom Typ finitset ist und ich einige Ergebnisse automatisch auswählen möchte, um es in anderen Gleichungen wieder einzugeben. Jeder Körper könnte mir helfen?Holen Sie einen Wert von Lösungssatz zurückgegeben als endlichen Satz von Sympy

Ein Beispiel: ich eine Liste von Gleichungen mit zwei unbekannten Variablen:

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

eine es dann lösen mit dem linsolve() -Methode.

Das Ergebnis ist korrekt, aber ich bin nicht in der Lage, diese Ergebnisse in eine Variable zu erhalten.

O versuchte dics, Listen, Tupel, Indexierungsbefehle, aber immer den Fehler zurück. „Finiteset Objekte haben kein Attribut‚Befehl‘“

Antwort

2

Sie iter verwenden können, um einen Iterator zu erhalten basierend auf dem Satz, und dann next zurück ein Element dieses Satzes (wenn Sie nur ein Element benötigen).

Beispiel:

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

Jetzt x0 ist 6/5 und y0 ist 4/5.

2

Eine etwas allgemeinere Lösung ist, einfach die FiniteSet in einen Standard-Python zu konvertieren list

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

Dann können Sie Elemente mit Standard-Indizierung extrahieren - in diesem Fall a[0]. Aber wenn Sie mehrere Lösungen erhalten, können Sie einfach die gewünschte auswählen.

4

fand ich die sympy Bibliothek Art und Weise in diesem Link http://docs.sympy.org/latest/tutorial/manipulation.html

Verwenden .args in der Funktion oder Ergebnisobjekt atribute. Wenn ich eine Funktion:

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

Das gleiche gilt für ein Ergebnis, das eine endliche Menge Typ ist.

+0

Das ist die richtige Antwort – shrewmouse

0

Sie können tuple in Kombination mit dem Argument auspacken verwenden:

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) 

Jetzt können Sie die Lösung überprüfen:

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