
Ao resolver os problemas da modelagem matemática de processos e objetos, geralmente é muito prático usar algoritmos Python usando cálculos simbólicos. Com base na biblioteca SymPy, o Python lida com êxito na solução de equações e sistemas, integrando e diferenciando, calculando limites, expandindo em séries e somando séries, simplificando expressões e procurando soluções para equações e sistemas diferenciais.
Ao usar cálculos simbólicos, o usuário tem a oportunidade de controlar o programa durante sua execução, inserindo quaisquer funções válidas com um determinado número de variáveis.
Como professor da disciplina "Engenharia e Programação de Computadores", no módulo de programação em Python, apresento aos alunos as possibilidades dessa linguagem para a pesquisa científica. Sua atenção é uma série de artigos nos quais você pode se familiarizar com a computação simbólica no Python. Quero alertar imediatamente que esses artigos não reivindicam exclusividade absoluta, uma vez que são coletados com base em materiais de várias fontes, seu objetivo é ensinar aos alunos o básico da computação simbólica.
O primeiro passo para a computação simbólica é importar as funções do módulo SymPy usando o pip, o sistema de gerenciamento de pacotes Python. Se você pode lidar com isso, vamos passar a declarar as variáveis.
Nota Para reduzir o registro, a seguinte linha não é mostrada em todos os exemplos a seguir: from sympy import *Declaração explícita de variáveis de caracteres
Para cálculos simbólicos usando o módulo
SymPy, variáveis e funções simbólicas devem ser declaradas como tal. Em programas de computação matemática, como Mathematica ou Maple, as variáveis são imediatamente consideradas simbólicas. No Python, eles devem ser declarados à força como simbólicos, e isso pode ser feito de várias maneiras. A maneira mais fácil é usar as funções de
símbolos () ou
var () . A primeira função retorna uma referência a um objeto de caractere como uma variável. O segundo, sem atribuição, cria uma variável de caractere.
Exemplo de código>>> x,y,a,b = symbols('xya b')
A principal diferença entre as funções dos
símbolos () e
var () é que a primeira função retorna uma referência ao objeto do símbolo. Para uso futuro, ele deve ser atribuído a qualquer variável. O segundo, sem atribuição, cria uma variável de caractere.
Nas funções symbols () e var (), você pode declarar variáveis de símbolo com um índice:
Você também pode atribuir um tipo e impor restrições às variáveis de símbolos diretamente nas funções symbols () e var (). Às vezes, sem essas restrições, transformações óbvias não funcionam, por exemplo, compare:
Exemplo de código >>> x = symbols('x', integer=True)
Para criar um contêiner para um único caractere, use o argumento
seq = True: >>> symbols('x',seq=True) (x,)
Determinando valores válidos para variáveis de caracteres:
>>> x, y, z = symbols('x,y,z', real=True) >>> x.is_real and y.is_real and z.is_real True
Função s ()
Às vezes, as expressões de caracteres podem ser interpretadas como constantes numéricas do Python em vez de SymPy. Portanto, para declarar variáveis simbólicas, bem como converter constantes numéricas em simbólicas, use a função S (), por exemplo, 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'>
A diferença entre uma constante Python e uma constante de caractere é que a constante de caractere pode ser calculada com um determinado grau de precisão, conforme mostrado no exemplo a seguir, comparado à função
round () padrão:
z=1/7; z
Nomes de personagens
Se você precisar usar matemática simbólica constantemente na sessão atual, poderá importar nomes simbólicos comuns do módulo
sympy.abc :
Exemplo 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']
O nome da variável pode ser removido do espaço para nome com o comando
del name1, name2, .. :
>>> type(x) <class 'sympy.core.symbol.Symbol'> >>> del x,y >>> x NameError: name 'x' is not defined
Para restaurar os valores das constantes padrão, bem como os nomes de algumas funções, é necessário recarregar o módulo sympy.
>>> from sympy import *
Método subs (...)
Deve-se lembrar que, ao escrever uma expressão simbólica, sua simplificação pode ser realizada automaticamente, por exemplo:
>>> 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
O método
subs (...) é usado para calcular uma expressão de caractere para determinados valores de variáveis, por exemplo:
>>> 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)
Se dois argumentos forem usados no método subs, eles serão interpretados como subs (antigo, novo), ou seja, o antigo identificador antigo é substituído pelo novo novo. O argumento para o método subs () pode ser uma sequência que deve conter pares (antigos, novos) ou uma expressão simbólica, por exemplo:
>>> 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)])
Vamos chamar sua atenção para a seguinte peculiaridade de trabalhar com variáveis (variáveis simbólicas e comuns do Python). Execute o seguinte código:
>>> x='Hello' >>> pr=x+'world' >>> pr 'Helloworld' >>> x='AAA'
A regra se aplica aqui: se a variável foi alterada, a expressão criada anteriormente que contém essa variável não é recalculada automaticamente. Esta regra também funciona para variáveis regulares do Python.
Operações de Fração
O módulo SymPy pode executar cálculos com frações e trazê-los para um denominador comum, por exemplo, comparar:
>>> S(1)/3+S(2)/5 11/15 >>> 1/3+2/5 0.7333333333333334
As funções
Rational (numerador, denominador) e
Inteiro (...) são usadas para criar frações racionais sem arredondamento 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
Computação de arredondamento
Na computação simbólica, a regra funciona - se nada for dito, não termine. Veja como, no primeiro caso, o Python transforma a expressão, mas deixa a raiz quadrada no registro de resposta e não realiza nenhum arredondamento; no segundo, como um dos números é especificado com um ponto decimal, o resultado será aproximado:
>>> sqrt(20) 2*sqrt(5) >>> sqrt(20.0)
Para qualquer objeto de caractere, existe um
método evalf (...) (
eval uate
f loat) que retorna sua representação decimal:
>>> sqrt(20).evalf()
O
método evalf ([n, ...]) pode usar um argumento especificando a precisão do resultado (n = o número de dígitos significativos)
>>> sqrt(20).evalf(30) 4.47213595499957939281834733746 >>> pi.evalf(20) 3.1415926535897932385
Você também precisa sempre lembrar que a aritmética real não retorna um resultado exato; compare:
>>> from sympy import * >>> one=S('one') >>> one = cos(1)**2 + sin(1)**2 >>> one.evalf()
Se for sabido que o resultado contém um erro de cálculo, você pode excluí-lo com a opção
chop = True do método
evalf () . Um valor muito pequeno da parte real ou imaginária do resultado, neste caso, é substituído por zero. Veja o exemplo anterior:
>>> (one-1).evalf()
Infinity
Após executar a primeira linha a
partir do sympy import * , o símbolo do infinito
oo (duas letras 'o') fica disponível, com o qual você também pode executar determinadas operações:
>>> oo+1 oo >>> 1000000<oo True >>> 1/oo 0
O símbolo do infinito é usado principalmente pelas funções
limit () e
integrar () ao definir limites de integração, os quais discutiremos em um dos seguintes artigos.
Conclusão
Os cálculos simbólicos considerados no artigo diferem dos métodos numéricos, pois os resultados podem ser mais investigados, por exemplo, para determinar os extremos de funções, resolver equações com variáveis incorporadas e assim por diante.
Espero que meu artigo seja útil para todos os interessados em programação em Python, estudantes e pessoas envolvidas em pesquisas científicas.