2013-09-28 10 views
5

Se chiedo SymPy remare-ridurre la matrice singolarePerché SymPy mi dà la risposta sbagliata quando eseguo una riduzione a righe di una matrice simbolica?

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() 

allora restituisce la matrice identità

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

che non dovrebbe fare, dal momento che la matrice è singolare. Perché SymPy mi sta dando la risposta sbagliata e come posso farmi avere la risposta giusta?

so SymPy conosce la matrice è singolare, perché quando chiedo A3.inv(), dà

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

Inoltre, quando viene rimosso dalla matrice agnello (equivalente all'impostazione agnello = 0) , SymPy dà la risposta corretta:

(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]) 

che mi porta a credere che questo problema si verifica solo con più di una variabile.

EDIT: È interessante notare che ho appena ottenuto la risposta corretta quando passo rref() l'argomento "Simplify = True". Non ho ancora idea del perché sia ​​così.

+0

Si noti che ora funziona correttamente nella versione di sviluppo di SymPy. – moorepants

risposta

1

L'algoritmo rref richiede fondamentalmente la capacità di stabilire se gli elementi della matrice sono identicamente zero. In SymPy, l'opzione simplify=True indica a SymPy di ​​semplificare prima le voci nella fase pertinente dell'algoritmo. Con le voci simboliche, questo è necessario, poiché puoi facilmente avere espressioni simboliche che sono identicamente pari a zero ma che non semplificano in modo automatico come x*(x - 1) - x**2 + x. L'opzione è disattivata per impostazione predefinita in quanto in genere tale semplificazione può essere costosa, tramite questa può essere controllata passando in una funzione di semplificazione meno generale rispetto a simplify (per le funzioni razionali, utilizzare cancel). Le impostazioni predefinite qui potrebbero probabilmente essere più intelligenti.

Problemi correlati