2010-06-22 8 views
6

Necesito escribir algún código que se ocupe de generar y manipular polinomios multivariables. Esbozaré mi tarea con un ejemplo simplificado.Bibliotecas para manipular polinomios multivariantes

Digamos que me dan tres expresiones: 2x^2, 3y + 1 y 1z. Entonces necesito multiplicarlos juntos, lo que me daría 6x^2yz + 2x^2z. Entonces me gustaría encontrar las derivadas parciales de esta expresión con respecto a x, y y z. Esto me daría 12xyz + 4xz, 6x^2z y 6x^2y + 2x^2.

Mi problema se trata de hacer manipulaciones simples como esta en expresiones que contienen miles de variables y necesito una manera fácil de hacer esto sistemáticamente. Realmente me gustaría usar Python ya que tengo muchas funcionalidades relacionadas con proyectos completadas usando numpy/scipy/matplotlib, pero si hay una caja de herramientas robusta en otro idioma, estoy abierto a usar eso también. Estoy haciendo investigación universitaria, así que estoy abierto a usar Matlab también.

No he podido encontrar ninguna buena biblioteca de python que pueda hacer esto por mí fácilmente y, idealmente, me gustaría algo similar al scipy polynomial routines que podría funcionar en polinomios multidimensionales. ¿Alguien sabe de una buena biblioteca que parece adecuada para este problema y que sería fácil de integrar en el código python ya existente?

Gracias!

Seguimiento: Pasé un par de días trabajando con Sympy, que resultó ser muy fácil de usar. Sin embargo, fue mucho más lento para el tamaño del problema en el que estoy trabajando, así que ahora voy a explorar matlab. Para dar una estimación extremadamente aproximada de la velocidad usando un tamaño de muestra pequeño, se tardó aproximadamente 5 segundos en calcular cada una de las derivadas parciales de un polinomio de orden 2 que contiene 250 variables.

Seguimiento # 2: Probablemente debería haber hecho esto de nuevo cuando todavía estaba trabajando en este problema, pero también podría dejar que todos sepan que la biblioteca simbólica de matlab era extremadamente comparable en velocidad a sympy. En otras palabras, fue brutalmente lento para grandes cálculos. Ambas bibliotecas fueron increíblemente fáciles de usar, por lo que para pequeñas computaciones yo recomiendo mucho.

Para resolver mi problema, calculé los degradados a mano, los simplifiqué y luego usé los patrones que encontré para codificar algunos valores en mi código. Fue más trabajo, pero hizo que mi código fuera exponencialmente más rápido y finalmente utilizable.

+0

¿Qué tan representativo es su ejemplo? Si sus polys iniciales son funciones de una sola var, el problema parece más fácil. –

+1

+1: Muy buena pregunta. Iba a sugerir SymPy, que obviamente hace cómputo simbólico (a diferencia de las bibliotecas etiquetadas), ¡pero parece que solo hace una diferenciación numérica! http://docs.sympy.org/modules/mpmath/calculus/differentiation.html –

+0

@Nikhil: sympy también hace una diferenciación simbólica. Vea mi ejemplo a continuación. –

Respuesta

9

sympy es perfecto para esto: http://code.google.com/p/sympy/

Documentación: http://docs.sympy.org/

ejemplos de diferenciación desde el tutorial: http://docs.sympy.org/tutorial.html#differentiation

import sympy 

x, y, z = sympy.symbols('xyz') 

p1 = 2*x*x 
p2 = 3*y + 1 
p3 = z 

p4 = p1*p2*p3 

print p4 

print p4.diff(x) 
print p4.diff(y) 
print p4.diff(z) 

Salida:

2*z*x**2*(1 + 3*y) 
4*x*z*(1 + 3*y) 
6*z*x**2 
2*x**2*(1 + 3*y) 
+0

+1: Al volver a leer los documentos, mencionan que los argumentos numéricos son opcionales y por qué ... es extraño que tengan ejemplos ** no ** con solo diferenciación simbólica. –

+0

Esto es perfecto para lo que necesito. ¡Gracias por el ejemplo también! – Spike

+0

@Nikhil: ¡Gracias también por investigar esto por mí! Estoy realmente impresionado por la ayuda que obtuve aquí en SO – Spike

1

Matlab y otras herramientas que mencionas suelen hacer cálculos numéricos. Debería considerar usar Mathematica o una alternativa Computer Algebra System (CAS) para el cálculo simbólico. Vea el enlace de la wiki: http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems para una comparación de varias CAS.

+0

Gracias por la entrada. Voy a probar Sympy primero porque me encanta Python y será, con mucho, el más fácil de codificar. Si es demasiado lento por la razón que sea (he encontrado que ciertos métodos de optimización scipy son lentos en los grandes conjuntos de datos anteriores), entonces lo probaré en otro entorno. – Spike

2

Si está utilizando MATLAB, el n el TB simbólico funciona bien, SI lo tienes. De lo contrario, utiliza mi caja de herramientas sympoly. Solo descárguelo del intercambio de archivos.

sympoly x y z 
A = 2*x^2; B = 3*y + 1;C = 1*z; 
gradient(A*B*C) 

ans = 
Sympoly array has size = [1 3] 

Sympoly array element [1 1] 
    4*x*z + 12*x*y*z 
Sympoly array element [1 2] 
    6*x^2*z 
Sympoly array element [1 3] 
    2*x^2 + 6*x^2*y 

Tenga en cuenta que esto indica que cometió un error al diferenciar el resultado con respecto a z en su pregunta.

+0

Gracias por encontrar mi error. Tu caja de herramientas de simulación se ve bien y si termino teniendo que utilizar Matlab para este problema, voy a darle un giro. – Spike

Cuestiones relacionadas