Encontrando Soluções#
O Sympy tem diversas ferramentas para encontrar a soluções de equações, sistemas, EDO, etc de forma simbólica.
from sympy import init_session
init_session(use_latex="mathjax")
IPython console for SymPy 1.14.0 (Python 3.11.12-64-bit) (ground types: python)
These commands were executed:
>>> from sympy import *
>>> x, y, z, t = symbols('x y z t')
>>> k, m, n = symbols('k m n', integer=True)
>>> f, g, h = symbols('f g h', cls=Function)
>>> init_printing()
Documentation can be found at https://docs.sympy.org/1.14.0/
Equações#
O solveset é uma função do SymPy utilizada para encontrar soluções de equações etc de forma simbólica.
Antigamente, a função utilizada era solve(), mas ela foi substituída (veja mais em http://docs.sympy.org/latest/modules/solvers/solveset.html).
A sintaxe é
solveset(equação, variável)
No exemplo abaixo tentamos buscar o conjunto solução da equação \(x^2-x=4\), que para denota-lá usamos Eq(x**2 - x,4)
solveset(Eq(x**2 - x,4), x)
Se Eq() não for utilizado, assume-se que a equação é igual a 0.
solveset(x**2 - x, x)
A função solveset no SymPy permite restringir as soluções de uma equação a um determinado domínio. Os principais domínios de restrição são:
S.Reals:Restringe as soluções aos números reais.
Exemplo: Encontrar soluções reais para uma equação.
S.Integers:Restringe as soluções aos números inteiros.
Exemplo: Encontrar soluções inteiras para uma equação.
S.Complexes:Restringe as soluções aos números complexos.
Este é o comportamento padrão se nenhum domínio for especificado.
Exemplo: Encontrar soluções complexas para uma equação.
Interval:Restringe as soluções a um intervalo específico.
Você pode definir um intervalo com a função
sp.Interval(inicio, fim), ondeinicioefimsão os limites do intervalo.Exemplo: Encontrar soluções de uma equação dentro do intervalo [0, 3].
solveset(sin(x) - 1, x, domain=S.Reals)
em que o conjunto Z representa os inteiros.
O root é um método do SymPy que permite encontrar a raiz de uma equação ou expressão simbólica. Ele é mais usaddo para encontrar raízes diretas de polinômios simples, enqual o solveset para equações gerais com maior flexibilidade e controle sobre o domínio.
solveset(x**3 - 6*x**2 + 9*x, x)
roots(x**3 - 6*x**2 + 9*x, x)
O número 0 representa uma raiz única, enquanto o número 3 indica duas raízes que coincidem.
Sistemas Lineares#
O linsolve() é uma função do SymPy utilizada para encontrar soluções de sistemas de equações lineares de forma simbólica.
Sua sintaxe é:
linsolve([expr1, expr2], [variavel1, variavel2])
linsolve([x - y + 2, x + y - 3], [x, y])
linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Equações Diferenciais#
É necessário ter uma função indefinida (f e g já estão definidas como indefinidas por meio da nossa init_session() mencionada acima, mas é provável que já tenhamos reiniciado essas funções).
f, g = symbols('f g', cls=Function)
Assim
f(x)
Para termos a derivida de \(f\) fazemos
f(x).diff(x)
Consequentemos podemos escrever uma equação usando derivadas
diffeq = Eq(f(x).diff(x, 2) - 2*f(x).diff(x) + f(x), sin(x))
diffeq
Tais equações envolvendo derivadas ordinárias são chamadas de EDO (equações diferencias ordinárias) e para resolve-las o Sympy tem a função dsolve
dsolve(diffeq, f(x))
Matrizes#
Considere uma matriz qualquer
Vamos trabalhar com a matriz de Vandermonde para exemplificar
Para definir a mariz usamos o comando Matrix, mas antes precisamos especificar os simbolos que vamos utilizar usando symbols
p, u, c = symbols('p u c')
A = Matrix([[u, p, 0], [0, u, p**-1], [0, c**2 * p, u]])
A
Caso quisessemos letras gregas precisariamos importar ela diretamente de sympy.ab, utilizando o comando:
from sympy.abc import + letra
from sympy.abc import rho, alpha
p, u, c = symbols('rho alpha c')
A = Matrix([[u, p, 0], [0, u, p**-1], [0, c**2 * p, u]])
A
A.row(0)
The eigenvalues of the system are the speeds at which information propagates
A.eigenvals()
A diagonalização (ou decomposição espectral) de uma matriz quadrada \(A\) é dada por: $\( A = PDP^{-1}\)\( onde \)P\( é a matriz dos autovetores e \)D$ a matriz dos autovalores.
Podemos obter tais matrizes utilizando .diagonalize
P, D = A.diagonalize()
Assim, \(D\) irá fornecer uma matriz diagonal cujos elementos são os autovalores de \(A\).
D
Enquanto \(P\) a matriz cujas colunas são os autovetores de \(A\).
P
Além disso, podemos calcula a inversa de \(A\) utilizando **-1
A**-1
ou usando o comando .inv()
A.inv()
Além disso ele faz operações de multiplicação apenas utilizando o comando *
C = A**-1
A * C
Usando o simplify, obtemos a matriz A
simplify(A*C)