
Al resolver los problemas de modelado matemático de procesos y objetos, a menudo es muy práctico usar algoritmos de Python usando cálculos simbólicos. Basado en la biblioteca SymPy, Python se las arregla con éxito para resolver ecuaciones y sistemas, integrando y diferenciando, calculando límites, expandiendo en series y sumando series, simplificando expresiones y buscando soluciones a ecuaciones y sistemas diferenciales.
Al usar cálculos simbólicos, el usuario tiene la oportunidad de controlar el programa durante su ejecución al ingresar cualquier función válida con un número determinado de variables.
Como profesor de la disciplina "Ingeniería informática y programación", en el módulo sobre programación en Python, presento a los estudiantes las posibilidades de este lenguaje para la investigación científica. Su atención es una serie de artículos en los que puede familiarizarse con la computación simbólica en Python. Quiero advertir de inmediato que estos artículos no reclaman unicidad absoluta, ya que se recopilan sobre la base de materiales de diversas fuentes, su objetivo es enseñar a los estudiantes los conceptos básicos de la computación simbólica.
El primer paso hacia la computación simbólica es importar las funciones del módulo SymPy usando pip, el sistema de administración de paquetes Python. Si puede manejar esto, pasemos a declarar las variables.
Nota Para acortar el registro, no se proporciona la siguiente línea en todos los ejemplos siguientes: desde importación importada *Declaración explícita de variables de caracteres.
Para los cálculos simbólicos que utilizan el módulo
SymPy, las variables y funciones simbólicas deben declararse como tales. En programas de computación matemática como Mathematica o Maple, las variables se consideran inmediatamente simbólicas. En Python, deben ser declarados por la fuerza simbólicos, y esto se puede hacer de varias maneras. La forma más fácil es usar las funciones de
símbolos () o
var () . La primera función devuelve una referencia a un objeto de carácter como una variable. El segundo, sin asignación, crea una variable de caracteres.
Ejemplo de código>>> x,y,a,b = symbols('xya b')
La principal diferencia entre las funciones de
símbolos () y
var () es que la primera función devuelve una referencia al objeto de símbolo. Para uso futuro, debe asignarse a cualquier variable. El segundo, sin asignación, crea una variable de caracteres.
En las funciones de símbolos () y var (), puede declarar variables de símbolo con un índice:
También puede asignar un tipo e imponer restricciones a las variables de símbolos directamente en las funciones de símbolos () y var (). A veces sin tales restricciones, las transformaciones obvias no funcionan, por ejemplo, compare:
Ejemplo de código >>> x = symbols('x', integer=True)
Para crear un contenedor para un solo carácter, use el argumento
seq = True: >>> symbols('x',seq=True) (x,)
Determinación de valores válidos para variables de caracteres:
>>> x, y, z = symbols('x,y,z', real=True) >>> x.is_real and y.is_real and z.is_real True
Función s ()
A veces, las expresiones de caracteres se pueden interpretar como constantes numéricas de Python en lugar de SymPy. Por lo tanto, para declarar variables simbólicas, así como para convertir constantes numéricas en simbólicas, use la función S (), por ejemplo, compare:
>>> expr = x**2 + sin(y) + S(10)/2; expr x**2 + sin(y) + 5 >>> type(10) <class 'int'> >>> type(S(10)) # <class 'sympy.core.numbers.Integer'>
La diferencia entre una constante de Python y una constante de caracteres es que una constante de caracteres se puede calcular con un cierto grado de precisión, como se muestra en el siguiente ejemplo, en comparación con la función
round () estándar:
z=1/7; z
Nombres de personajes
Si necesita usar matemática simbólica constantemente en la sesión actual, puede importar nombres simbólicos comunes desde el módulo
sympy.abc :
Ejemplo de código >>> import sympy.abc >>> dir(sympy.abc) ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_clash', '_clash1', '_clash2', 'a', 'alpha', 'b', 'beta', 'c', 'chi', 'd', 'delta', 'division', 'e', 'epsilon', 'eta', 'exec_', 'f', 'g', 'gamma', 'greeks', 'h', 'i', 'iota', 'j', 'k', 'kappa', 'l', 'lamda', 'm', 'mu', 'n', 'nu', 'o', 'omega', 'omicron', 'p', 'phi', 'pi', 'print_function', 'psi', 'q', 'r', 'rho', 's', 'sigma', 'string', 'symbols', 't', 'tau', 'theta', 'u', 'upsilon', 'v', 'w', 'x', 'xi', 'y', 'z', 'zeta']
El nombre de la variable se puede eliminar del espacio de nombres con el comando
del name1, name2, .. :
>>> type(x) <class 'sympy.core.symbol.Symbol'> >>> del x,y >>> x NameError: name 'x' is not defined
Para restaurar los valores de las constantes estándar, así como los nombres de algunas funciones, debe volver a cargar el módulo sympy.
>>> from sympy import *
Método subs (...)
Debe recordarse que al escribir una expresión simbólica, su simplificación se puede realizar automáticamente, por ejemplo:
>>> a,b,c,d,x,y,z,u,v,w = symbols('abcdxyzuv w') >>> x - z + 20 -z- 15 + 3*sin(pi/2)+2*z x + 8
El método
subs (...) se usa para calcular una expresión de caracteres para valores dados de variables, por ejemplo:
>>> a, x = symbols('a x') >>> f= a**3*x + 3*a**2*x**2/2 + a*x**3 + x**4/4 >>> f.subs(a,1)
Si se utilizan dos argumentos en el método subs, se interpretan como subs (antiguo, nuevo), es decir, el viejo identificador viejo se reemplaza por el nuevo nuevo. El argumento del método subs () puede ser una secuencia que debe contener pares (antiguo, nuevo) o puede ser una expresión simbólica, por ejemplo:
>>> a,b,c,d,x,y,z = symbols('abcdxy z') >>> f=a*x**3 +b*y**2 + c*z+d >>> f.subs([(a,1),(b,2),(c,3),(d,4)])
Permítanos llamar su atención sobre la siguiente peculiaridad de trabajar con variables (variables simbólicas y ordinarias de Python). Ejecute el siguiente código:
>>> x='Hello' >>> pr=x+'world' >>> pr 'Helloworld' >>> x='AAA'
La regla se aplica aquí: si la variable ha cambiado, la expresión creada anteriormente que contiene esta variable no se recalcula automáticamente. Esta regla también funciona para las variables regulares de Python.
Operaciones de fracciones
El módulo SymPy puede realizar cálculos con fracciones y llevarlos a un denominador común, por ejemplo, comparar:
>>> S(1)/3+S(2)/5 11/15 >>> 1/3+2/5 0.7333333333333334
Las funciones
Racional (numerador, denominador) e
Integer (...) se utilizan para crear fracciones racionales sin redondeo decimal:
>>> z=Rational(1, 7)+Rational(2, 5); z 19/35 >>> Integer(1)/Integer(5) 1/5 >>> 1/5 0.2 >>> z=Integer(1)/Integer(5)+Rational(2, 7); z 17/35
Computación de redondeo
En computación simbólica, la regla funciona: si no se dice nada, no redondee. Vea cómo, en el primer caso, Python transforma la expresión, pero deja la raíz cuadrada en el registro de respuesta y no realiza ningún redondeo, y en el segundo, dado que uno de los números se especifica con un punto decimal, el resultado será aproximado:
>>> sqrt(20) 2*sqrt(5) >>> sqrt(20.0)
Para cualquier objeto de carácter, hay un
método evalf (...) (
eval uate
f loat) que devuelve su representación decimal:
>>> sqrt(20).evalf()
El
método evalf ([n, ...]) puede usar un argumento que especifica la precisión del resultado (n = el número de dígitos significativos)
>>> sqrt(20).evalf(30) 4.47213595499957939281834733746 >>> pi.evalf(20) 3.1415926535897932385
También siempre debe recordar que la aritmética real no devuelve un resultado exacto, compare:
>>> from sympy import * >>> one=S('one') >>> one = cos(1)**2 + sin(1)**2 >>> one.evalf()
Si se sabe que el resultado contiene un error de cálculo, puede eliminarlo con la opción
chop = True del método
evalf () . Un valor muy pequeño de la parte real o imaginaria del resultado en este caso se reemplaza por cero. Toma el ejemplo anterior:
>>> (one-1).evalf()
Infinito
Después de ejecutar la primera línea
desde Sympy Import * , el símbolo de infinito
oo (dos letras 'o') está disponible, con el cual también puede realizar ciertas operaciones:
>>> oo+1 oo >>> 1000000<oo True >>> 1/oo 0
El símbolo de infinito es utilizado principalmente por las funciones
limit () eintegrar () al establecer límites de integración, que discutiremos en uno de los siguientes artículos.
Conclusión
Los cálculos simbólicos considerados en el artículo difieren de los métodos numéricos en que los resultados pueden investigarse más a fondo, por ejemplo, para determinar los extremos de las funciones, resolver ecuaciones con variables incrustadas, etc.
Espero que mi artículo sea útil para todos los interesados en la programación de Python, los estudiantes y los involucrados en la investigación científica.