Pregunta

Estoy programa en Python escribir y necesito encontrar la derivada de una función (una función expresada como cadena).

  • Por ejemplo: x^2+3*x
  • Su derivada es: 2*x+3

¿Hay secuencias de comandos disponibles, o hay algo útil que me puede decir?

¿Fue útil?

Solución

sympy lo hace bien.

Otros consejos

Si usted está limitado a polinomios (que parece ser el caso), no sería básicamente tres pasos:

  1. Parse la cadena de entrada en una lista de coeficientes a x ^ n
  2. Tome esa lista de coeficientes y las convierte en una nueva lista de coeficientes de acuerdo con las reglas para derivar un polinomio.
  3. Tome la lista de los coeficientes para la derivada y crear una bonita cadena que describe la función polinómica derivado.

Si usted necesita para manejar polinomios como a*x^15125 + x^2 + c, utilizando un dict para la lista de coeficientes puede tener sentido, pero requieren un poco más de atención al hacer las iteraciones a través de esta lista.

Se puede encontrar lo que está buscando en las respuestas ya proporcionadas. Yo, sin embargo, me gustaría dar una breve explicación sobre la forma de calcular los derivados simbólicos.

El negocio se basa en la sobrecarga de operadores y la regla de la cadena de los derivados. Por ejemplo, la derivada de v^n es n*v^(n-1)dv/dx, ¿verdad? Por lo tanto, si usted tiene v=3*x y n=3, ¿cuál sería la derivada? La respuesta: si f(x)=(3*x)^3, a continuación, el derivado es:

f'(x)=3*(3*x)^2*(d/dx(3*x))=3*(3*x)^2*(3)=3^4*x^2

La regla de la cadena que permite a "cadena" de la operación: cada derivado individual es sencilla, y que acaba de "cadena" de la complejidad. Otro ejemplo, la derivada de u*v es v*du/dx+u*dv/dx, ¿verdad? Si se obtiene una función complicada, que acaba de encadenar él, decir:

d/dx(x^3*sin(x))
u=x^3; v=sin(x)
du/dx=3*x^2; dv/dx=cos(x)
d/dx=v*du+u*dv

Como se puede ver, la diferenciación es sólo una cadena de operaciones simples.

Ahora, la sobrecarga de operadores.

Si usted puede escribir un programa de análisis (prueba Pyparsing) a continuación, puede solicitarlo para evaluar tanto la función como derivado! He hecho esto (con Flex / Bison) sólo por diversión, y es bastante potente. Para que obtener la idea, el derivado se calcula de forma recursiva por la sobrecarga del operador correspondiente, y aplicar de forma recursiva la regla de la cadena, por lo que la evaluación de "*" correspondería a u * v para el valor de la función y u*der(v)+v*der(u) para el valor derivado (probarlo en C ++, también es divertido).

Y esto es todo, sé que no me refiero a escribir su propio programa de análisis - por todos los medios use el código existente (visita www.autodiff.org para la diferenciación automática de Fortran y C / C ++ de código). Pero siempre es interesante saber cómo esta materia trabaja.

Saludos,

Juan

Diferenciación simbólica es una impresionante introducción al tema, al menos por no especializado como yo :) El código está escrito en C ++ por cierto.

diferenciación automática. Hay herramientas para Python . Además, este .

Mejor tarde que nunca?

Siempre he hecho la diferenciación simbólica en cualquier idioma mediante el trabajo con un árbol de análisis. Pero también recientemente di cuenta de otro método utilizando números complejos .

El enfoque de árbol de análisis consiste en traducir el siguiente código Lisp pequeña en cualquier idioma que como:

(defun diff (s x)(cond
  ((eq s x) 1)
  ((atom s) 0)
  ((or (eq (car s) '+)(eq (car s) '-))(list (car s)
    (diff (cadr s) x)
    (diff (caddr s) x)
    ))
  ; ... and so on for multiplication, division, and basic functions
  ))

ya través de ella con un simplificador adecuada, por lo que deshacerse de adiciones de 0, multiplicando por 1, etc.

Sin embargo, el método del complejo, mientras que completamente numérico, tiene una cierta cualidad mágica. En lugar de programar sus cálculos F de doble precisión, hacerlo en el complejo de doble precisión. Entonces, si necesita la derivada de la computación con respecto a la variable X, establezca la parte imaginaria de X para un número muy pequeño h, al igual que 1e-100. A continuación, realice el cálculo y obtener el resultado R. Ahora real (R) es el resultado que normalmente conseguir, y imag (R) / h = dF / dx a muy alta exactitud!

¿Cómo funciona? Tomemos el caso de la multiplicación de números complejos:

(a+bi)(c+di) = ac + i(ad+bc) - bd

Ahora supongamos que las partes imaginarias son todos cero, excepto queremos que la derivada con respecto al a. Hemos establecido b a un muy pequeño número h. Ahora ¿qué obtenemos?

(a+hi)(c) = ac + hci

Así que la parte real de esto es ac, como era de esperar, y la parte imaginaria, dividido por h, es c, que es la derivada de ac con respecto al a.

El mismo tipo de razonamiento parece aplicarse a todas las reglas de diferenciación.

Si está pensando en escribir el programa de diferenciación a partir de cero, sin utilizar otras bibliotecas como ayuda, entonces el algoritmo / método de calcular la derivada de cualquier ecuación algebraica he descrito en mi blog será útil.

Puede intentar crear una clase que representará un límite de rigor y luego evaluarla para (f (x) -f (a)) / (x-a) cuando x tiende a. Esto debería dar un valor bastante exacto del límite.

A menos que cualquier biblioteca ya hecho que deriva es bastante complejo porque hay que analizar y funciones de la manija y expresiones.

Derivación de por sí es una tarea fácil, ya que es mecánica y se puede hacer de forma algorítmica pero se necesita una estructura básica para almacenar una función.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top