2016-04-19 10 views
7

Ho scritto uno script in python che utilizza sympy per calcolare una coppia di formule vettore/matrice. Tuttavia, quando cerco di convertire quelli a funzioni che posso valutare con sympy.lambdify, ho uno SyntaxErrorConversione di espressioni che coinvolgono la trasposizione del vettore in una funzione numerica con lambdify

: EOL durante la scansione stringa letterale

ecco qualche codice con lo stesso errore, in modo da che puoi vedere cosa intendo.

import sympy 
x = sympy.MatrixSymbol('x',3,1) 
f = sympy.lambdify(x, x.T*x) 

Quindi, l'errore di sintassi ha a che fare con la "x'.dot (x)" espressione e la conversione di ".T" per'.

Come posso aggirare questo per definire correttamente f da lambdify sopra?

+2

Sentiti libero di riferire questo tipo di cose al tracker dei problemi di SymPy. Ho aperto https://github.com/sympy/sympy/issues/11044 per questo. – asmeurer

+0

@asmeurer Sì, lo terrò a mente. Grazie! – Konstantinos

risposta

2

Trovato un lavoro in giro, anche se non la soluzione dall'aspetto più pulito ... ma funziona.

Utilizzare il metodo implementation_function() da sympy per definire la funzione. Leggi la documentazione completa qui: http://docs.sympy.org/latest/modules/utilities/lambdify.html

Ecco il codice:

import sympy 
import numpy as np 
from sympy.utilities.lambdify import implemented_function 


x = sympy.MatrixSymbol('x',3,1) 

f = implemented_function(sympy.Function('f'), lambda x: x.T*x) 

lam_f= sympy.lambdify(x, f(x)) 

Spero che questo risolve il problema :)

+1

Probabilmente vorrai definire qualcosa che in realtà usi 'np.dot' per la valutazione. – asmeurer

+0

Sì, questo fa solo moltiplicazione di elementi. – Konstantinos

0

E 'stato risolto nella versione sympy> = 1.1

Edit:

Esempio

quando si definisce questo x = sympy.MatrixSymbol('x',3,1) si sta creando una matrice,

è possibile controllare la sua indicizzazione e la forma utilizzando print(sympy.Matrix(x))

Ora che si desidera moltiplicare Trasposizione di x per x, si dovrà dare x una matrice dello stesso forma che è stata definita prima

qui provate questo:

from sympy import MatrixSymbol, lambdify, Matrix 
x = MatrixSymbol('x', 3, 1) 
f = lambdify(x, x.T*x) 
a = Matrix([[1], [2], [3]]) 
print(f(a)) 

è possibile controllare questo li nk out per capire meglio lambdify: http://docs.sympy.org/latest/modules/utilities/lambdify.html

+0

Grazie per l'aggiornamento. Vedo che 'f = sympy.lambdify (x, x.T * x)' non genera un errore ora. Ma potresti aggiungere un esempio di come si può usare questo 'f'? Ciò renderebbe la tua risposta molto più preziosa. – FTP

+0

Ho modificato il post, puoi vedere l'esempio :) –

+0

un'altra cosa, non so se è rilevante per te, tuttavia, se hai numpy installato sul tuo sistema, avrai output '14' altrimenti' [ 14] '. –

Problemi correlati