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.
¿Qué tan representativo es su ejemplo? Si sus polys iniciales son funciones de una sola var, el problema parece más fácil. –
+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 –
@Nikhil: sympy también hace una diferenciación simbólica. Vea mi ejemplo a continuación. –