2013-09-28 5 views
5

Wenn ich SymPy bitten, die singuläre MatrixWarum gibt mir SymPy die falsche Antwort, wenn ich eine symbolische Matrix reihum reduziere? es kehrt zu rudern-reduce

nu = Symbol('nu') 
lamb = Symbol('lambda') 
A3 = Matrix([[-3*nu, 1, 0, 0], 
      [3*nu, -2*nu-1, 2, 0], 
      [0, 2*nu, (-1 * nu) - lamb - 2, 3], 
      [0, 0, nu + lamb, -3]]) 
print A3.rref() 

dann die Identitätsmatrix

(Matrix([ 
[1, 0, 0, 0], 
[0, 1, 0, 0], 
[0, 0, 1, 0], 
[0, 0, 0, 1]]), [0, 1, 2, 3]) 

, die sie nicht tun sollten, da die Matrix singulär ist. Warum gibt SymPy mir die falsche Antwort und wie bekomme ich es, um mir die richtige Antwort zu geben?

Ich weiß SymPy kennt die Matrix singulär ist, weil, wenn ich für A3.inv fragen(), gibt es

raise ValueError("Matrix det == 0; not invertible.") 

Außerdem, wenn ich Lamm aus der Matrix (entspricht Einstellung Lamm = 0) entfernen gibt SymPy die richtige Antwort:

(Matrix([ 
[1, 0, 0, -1/nu**3], 
[0, 1, 0, -3/nu**2], 
[0, 0, 1, -3/nu], 
[0, 0, 0,  0]]), [0, 1, 2]) 

, die mich führt zu glauben, dass dieses Problem nur mit mehr als einer variablen geschieht.

EDIT: Interessanterweise habe ich gerade die richtige Antwort, wenn ich rref() das Argument "simplify = True" übergeben. Ich habe immer noch keine Ahnung, warum das so ist.

+0

Beachten Sie, dass dies jetzt in der Entwicklungsversion von SymPy ordnungsgemäß funktioniert. – moorepants

Antwort

1

Der Rref-Algorithmus erfordert grundsätzlich die Fähigkeit zu erkennen, ob die Elemente der Matrix identisch Null sind. In SymPy weist die Option simplify=True SymPy an, die Einträge zuerst in der relevanten Stufe des Algorithmus zu vereinfachen. Bei symbolischen Einträgen ist dies notwendig, da Sie leicht symbolische Ausdrücke haben können, die identisch null sind, die aber nicht automatisch so einfach werden, wie x*(x - 1) - x**2 + x. Die Option ist standardmäßig deaktiviert, da eine solche Vereinfachung im Allgemeinen teuer sein kann, indem sie durch die Eingabe einer weniger allgemeinen Simplifikationsfunktion als simplify gesteuert wird (für rationale Funktionen verwenden Sie cancel). Die Voreinstellungen könnten hier möglicherweise intelligenter sein.

Verwandte Themen