2016-11-29 1 views
1

Ich versuche, eine einfache Einschränkung in Sympy zu lösen, die den Or Logik Operator enthält:arithmetische Constraints mit logischen Operatoren in Sympy Solving

from sympy import * 
a,b = symbols("a b") 

print(solve(Or(Eq(3, b*2), Eq(3, b*3)))) 
# In other words: (3 equals b*2) or (3 equals b*3) 
# [1,3/2] was the answer that I expected 

Überraschenderweise führt dies zu einem Fehler statt:

TypeError: unsupported operand type(s) for -: 'Or' and 'int' 

ich kann dieses Problem umgehen Piecewise verwenden, aber das ist viel ausführlicher:

from sympy import * 
a,b = symbols("a b") 
print(solve(Piecewise((Eq(3, b*2),Eq(3, b*2)), (Eq(3, b*3),Eq(3, b*3))))) 
#prints [1,3/2], as expected 
Überraschenderweise

, diese Behelfslösung schlägt fehl, wenn ich versuche, für zwei Variablen zu lösen, anstatt ein:

from sympy import * 
a,b = symbols("a b") 

print(solve([Eq(a,3+b),Piecewise((Eq(b,3),Eq(b,3)), (Eq(b,4),Eq(b,4)))])) 
#AttributeError: 'BooleanTrue' object has no attribute 'n' 

Gibt es eine zuverlässige Art und Weise zu lösen Einschränkungen wie diese in Sympy?

Antwort

4

Jede Gleichung kann als etwas ausgedrückt werden, das mit 0 gleichgesetzt wird. Zum Beispiel 3-2 * b = 0 anstelle von 3 = 2 * b. (In Sympy, Sie haben nicht einmal die =0 Teil zu schreiben haben, angenommen wird.) Dann können Sie einfach Gleichungen multiplizieren, um die ODER-Logik auszudrücken:

>>> from sympy import * 
>>> a,b = symbols("a b") 
>>> solve((3-b*2)*(3-b*3)) 
[1, 3/2] 
>>> solve([a-3-b, (3-b*2)*(3-b*3)]) 
[{b: 1, a: 4}, {b: 3/2, a: 9/2}] 
3

Um auf zaq Antwort zu erweitern, ist SymPy nicht erkennen logische Operatoren in solve, aber man kann die Tatsache nutzen, dass

a*b = 0 

zu

a = 0 OR b = 0 

entspricht das heißt, multiplizieren die beiden Gleichungen

solve((3 - 2*b)*(3 - 3*b), b) 

Als zusätzliche Anmerkung, wenn Sie AND anstelle von OR verwenden möchten, können Sie für ein System lösen. Das heißt,

solve([eq1, eq2]) 

entspricht

eq1 = 0 AND eq2 = 0 
zur Lösung
Verwandte Themen