Computación de personajes con Python. Parte 1. Los fundamentos

imagen

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') #    ,      >>> f=a**3*x + 3*a**2*x**2/2 + a*x**3 + x**4/4 #  f    >>> type(f) <class 'sympy.core.add.Add'> >>> var('u,v') (u, v) >>> f=sin(u)**2+tan(v) #  f    >>> type(f) <class 'sympy.core.add.Add'> 


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:

Ejemplo de código
 >>> x=symbols('x:9'); x #    0  9 (x0, x1, x2, x3, x4, x5, x6, x7, x8) >>> x=symbols('x5:10'); x #    5  9 (x5, x6, x7, x8, x9) >>> x=var('x:9'); x #    0  9 (x0, x1, x2, x3, x4, x5, x6, x7, x8) >>> x=var('x5:10'); x #    5  9 (x5, x6, x7, x8, x9) 


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) #   >>> sqrt(x**2) Abs(x) >>> x = symbols('x', positive = True, integer=True) >>> sqrt(x**2) x >>> x = symbols('x') >>> sqrt(x**2) #  x,  x≥0 sqrt(x**2) >>> x = var('x', integer=True) >>> sqrt(x**2) Abs(x) >>> x = var('x', positive = True, integer=True) >>> sqrt(x**2) x >>> x = var('x') >>> sqrt(x**2) #  x,  x≥0 sqrt(x**2) 


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 #   z    0.14285714285714285 z1=S(1)/7; z1 1/7 z2=z1.n(30); z2 #   z2    30   0.142857142857142857142857142857 z3=round(z1,30); z3 0.14285714285714285 

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) #   f   a    x**4/4 + x**3 + 3*x**2/2 + x 

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)]) #   a=1, b=2, c=3, d=4 x**3 + 2*y**2 + 3*z + 4 >>> pr= x**3+4*x**2+6*x+10 >>> pr.subs(x,1/x) #     10 + 6/x + 4/x**2 + x**(-3) 

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' #   x   >>> pr 'Helloworld' 

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) #        4.47213595499958 

Para cualquier objeto de carácter, hay un método evalf (...) ( eval uate f loat) que devuelve su representación decimal:

 >>> sqrt(20).evalf() #  sqrt()  sympy 4.47213595499958 >>> E.evalf() 2.71828182845905 

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() #  1 1.00000000000000 >>> (one-1).evalf() #    0 -0.e-124 

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() #    0 -0.e-124 >>> (one - 1).evalf(chop=True) 0 

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.

Source: https://habr.com/ru/post/es423731/


All Articles