Fórmulas y funciones simbólicas con Sympy-Python

Referencia: https://www.sympy.org/es/

SymPy es una libreria usada para manejar de forma algebraica las expresiones matemáticas. Se requiere definir el símbolo que representa la variable en la expresión, por ejemplo la letra ‘x‘. Si la librería sympy no está disponible o sale un error la puede revisar las instrucciones del enlace instalar con pip.

Una formula o función matemática descrita como fx se puede derivar, integrar, simplificar sus términos. También se puede construir una expresión matemática, por ejemplo desarrollar los términos para un polinomio como Taylor.

Expresiones con Sympy

f(x) como un polinomio

f(x) = (1-x)^5 + 5 x ((1-x)^4) - 0.4
import sympy as sym
x = sym.Symbol('x')
fx = (1-x)**5 + 5*x*((1-x)**4) - 0.4

Simplificar o expandir los términos del el polinomio es solo una instrucción,

fx = fx.expand()
print(fx)

obteniendo el siguiente resultado:

4*x**5 - 15*x**4 + 20*x**3 - 10*x**2 + 0.6

o una presentación diferente con sym.pprint():

>>> sym.pprint(fx)
           4          5      
5*x*(1 - x)  + (1 - x)  - 0.4
>>> 

Evaluar una expresión fx con Sympy

Las expresiones simbólicas se pueden evaluar en un punto, ejemplo x0=0.1 usando la instrucción fx.subs(x,x0), que sustituye el símbolo de la variable x con el valor definido para x0.

k = fx.subs(x,0.1)
print(k)
0.518540000000000

Conversión de forma simbólica a forma numérica Lambda

Para evaluar varios puntos en la expresión  en forma numérica para usar ‘x’ con valores en un vector o matriz como un arreglo, se convierte a la forma numérica Lambda con la instrucción sym.lambdify(x,fx)

>>> formula = sym.lambdify(x,fx)
>>> formula(0.1)
0.51854

expresiones de Funciones matemáticas

Para el ejemplo se usa la expresión:

f(x) = \cos (x)

El ejemplo se desarrolla en la ventana iterativa ¨shell¨.

>>> import sympy as sym
>>> x = sym.Symbol('x')
>>> fx = sym.cos(x)  

Derivadas con Sympy

Las expresiones de la derivada se obtienen con la expresión fx.diff(x,k), indicando la k-ésima  derivada de la expresión.

>>> x
x
>>> fx
cos(x)
>>> fx.diff(x,1)
-sin(x)
>>> fx.diff(x,2)
-cos(x)

Ejemplos: Sistemas LTI CT – Respuesta a entrada cero con Sympy-Python

Derivadas como expresión de Sympy sin evaluar

Cuando se requiere expresar tan solo la operación de derivadas, que será luego usada o reemplazada con otra expresión, se usa la derivada sin evaluar. Ejemplo:

y = \frac{d}{dx}f(x)

Para más adelante definir f(x).

En Sympy, la expresión de y se realiza indicando que f será una variable

x = sym.Symbol('x', real=True)
f = sym.Symbol('f', real=True)
y = sym.diff(f,x, evaluate=False) # derivada sin evaluar
g = sym.cos(x) + x**2
yg = y.subs(f,g).doit() # sustituye f con g y evalua .doit()
>>> y
Derivative(f, x)
>>> g
x**2 + cos(x)
>>> yg
2*x - sin(x)

Evaluación de las expresiones Sympy

Se define la expresión ‘derivada’ y se la usa con la instrucción fx.subs(x,valor)

>>> fx.subs(x,0)
1
>>> fx.subs(x,1/3)
0.944956946314738
>>> derivada = fx.diff(x,1)
>>> derivada
-sin(x)
>>> derivada.subs(x,1/3)
-0.327194696796152
>>> 

Generar otras expresiones a partir de otras existentes

A una función simbólica se pueden añadir más términos con el mismo símbolo

>>> gx = fx + x
>>> gx
x + cos(x)
>>> gx = gx - 2
>>> gx
x + cos(x) - 2

Por lo que las funciones simbólicas son útiles cuando se construyen expresiones, como en el caso de series de Taylor descritas en la Unidad01


Observaciones:

La forma simbólica de las funciones matemátivas se usan para crear expresiones finales. Si se requiere evaluar por ejemplo varios puntos por medio de un vector es necesario convertirla a la funcion numérica «lambda».

Para evaluar en un punto x0 una función simbólica, requieren más tiempo de procesamiento (milisegundos), por lo que una vez construida la expresión pueden convertirla a la forma numérica «lambda», mejora los tiempos de ejecución del algoritmo.

Dentro de las utilidades de sympy se dispone de la función lambdify para realizar éste cambio. Por ejemplo:

>>> fx.subs(x,0.1)
0.995004165278026

>>> fxn = sym.lambdify(x,fx,'numpy')
>>> fxn(0.1)
0.99500416527802582

la última parte de la expresión ‘numpy’, se usa para indicar la librería numérica de equivalencia de por ejemplo el cos().

Integrales con Sympy

>>> import sympy as sym
>>> t = sym.Symbol('t',real=True)
>>> x = 10*sym.exp(-3*t)
>>> x
10*exp(-3*t)
>>> y = sym.integrate(x,(t,0,10))
>>> y
10/3 - 10*exp(-30)/3
>>> y = sym.integrate(x,(t,0,sym.oo))
>>> y
10/3