Equações Homogêneas de Coeficientes Constantes

Uma equação diferencial homogênea de coeficientes constantes é uma equação diferencial de ordem arbitrária que pode ser colocada na forma

(1)
\begin{align} a_N y^{(N)} + a_{N-1} y^{(N-1)} + \ldots + a_2 y^{\prime\prime} + a_1 y^\prime + a_0 y = 0 \end{align}

com condições iniciais

(2)
\begin{align} y^{(n)}(0) = y^{(n)}_0, \; \mbox{ para } n = 0, 1, \ldots, N \end{align}

onde $N$ é a ordem da equação, $y^{(n)}$ é a derivada de n-ésima ordem da variável dependente, e $a_n$ são os coeficientes (constantes) da equação. Esta equação pode ser solucionada supondo que a resposta seja do tipo:

(3)
\begin{equation} y(x) = A e^{s x} \end{equation}

sendo $x$ a variável independente, e as constantes $A$ e $s$ dependentes da equação. Se calcularmos as derivadas da equação 3 e substituirmos os resultados na equação 1, podemos encontrar os valores desconhecidos de $A$ e $s$. A n-ésima derivada da equação 3 é dada por

(4)
\begin{align} \frac{d^ny}{dx^n} = A s^n e^{s x} \end{align}

Substituindo na equação 1 obtemos

(5)
\begin{align} a_N A s^N e^{s x} + a_{N-1} A s^{N-1} e^{s x} + \ldots + a_2 A s^2 e^{s x} + a_1 A s e^{s x} + a_0 e^{s x} = 0 \end{align}

Uma vez que a exponencial nunca é zero para valores reais ou complexos de seu expoente, podemos simplificar a equação, obtendo o polinômio característico da equação diferencial, dado por

(6)
\begin{align} a_N s^N + a_{N-1} s^{N-1} + \ldots + a_2 s^2 + a_1 s + a_0 = 0 \end{align}

As soluções desse polinômio fornecem os valores $s$ que estão nos expoentes da solução. Uma vez que existem $N$ soluções para a equação 6, teremos várias soluções para a equação diferencial. E, considerando que derivadas e integrais tem a propriedade da superposição (ou seja, a soma de duas soluções também é uma solução), podemos reescrever a solução como

(7)
\begin{align} y(x) = \sum_{i = 0}^{N} A_i e^{s_i x} \end{align}

onde $s_i$ são as raízes do polinômio característico. Para calcular o valor das constantes $A_i$, utilizamos as condições iniciais. As condições iniciais são os valores assumidos pela variável dependente e suas derivadas quando o valor da variável dependente é feito igual a zero. Portanto, precisamos calcular as derivadas da solução na equação 8. Uma vez que aquela equação é um somatório de exponenciais, é fácil ver que a derivada de n-ésima ordem é dada por

(8)
\begin{align} y^{(n)}(x) = \sum_{i = 0}^{N} A_i s_i^n e^{s_i x} \end{align}

Substituindo $x = 0$ e o respectivo valor da condição inicial, obtemos

(9)
\begin{align} y^{(n)}_0 = \sum_{i = 0}^{N} A_i s_i^n, \; \mbox{ para } n = 0, 1, \ldots, N \end{align}

A equação 9, na verdade, leva a um conjunto de equações lineares com incógnitas $A_i$. Extendendo essa equação, para deixar mais clara a relação, obtemos:

(10)
\begin{align} \left\{ \begin{array}{l} A_1 + A_2 + ... + A_N = y_0 \\ s_1 A_1 + s_2 A_2 + ... + s_N A_N = y^\prime_0 \\ s_1^2 A_1 + s_2^2 A_2 + ... + s_N^2 A_N = y^{\prime\prime}_0 \\ \ldots \\ s_1^N A_1 + s_2^N A_2 + ... + s_N^N A_N = y^{(N)}_0 \end{array} \right. \end{align}

A solução do sistema de equações lineares nos dará os valores das constantes e portanto a solução do problema.

Exemplo

Suponha que desejamos solucionar a equação

(11)
\begin{align} y^{\prime\prime} - 5 y^\prime + 6 y = 0 \end{align}

com condições iniciais $y(0) = 1$ e $y^\prime(0) = 0$. O polinômio característico dessa equação é

(12)
\begin{equation} s^2 - 5 s + 6 = 0 \end{equation}

cujas soluções são dadas por $s_1 = 2$ e $s_2 = 3$. Portanto, a solução tem a forma

(13)
\begin{equation} y(x) = A_1 e^{2x} + A_2 e^{3x} \end{equation}

Substituindo $x = 0$ e $y = 1$ nesta equação, obtemos

(14)
\begin{equation} A_1 + A_2 = 1 \end{equation}

Substituindo $x = 0$ e $y = 0$ na derivada da equação, obtemos

(15)
\begin{equation} 2A_1 + 3A_2 = 0 \end{equation}

Solucionando este sistema, obtemos $A_1 = 3$ e $A_2 = -2$. Portanto, a solução é

(16)
\begin{equation} y(x) = -3 e^{2t} + 2 e^{3t} \end{equation}

Solucionando com Python

Vamos resolver o mesmo exemplo, mas utilizando Python. Para solucionarmos uma equação com o Python, além do NumPy, necessitaremos também do SciPy, que contém algumas funções para trabalharmos com polinômios. Na linha de comando, digitamos

>>> from scipy import *
>>> from numpy import *

Lembramos que na linha de comando, um from … import * não causa muito problema, mas em scripts é recomendável utilizar import … para preservar o espaço de nomes. Suponha que os coeficientes da equação diferencial sejam dados em uma lista. Para criar e solucionar o polinômio característico, utilizamos as funções do SciPy como abaixo:

>>> edo = [ 1., -5., 6. ]
>>> pc = poly1d(edo)
>>> pc
poly1d([ 1., -5.,  6.])
>>> s = pc.roots
>>> s
array([ 3.+0.j,  2.+0.j])

A função poly1d() cria um polinômio com os coeficientes dados na lista. Os coeficientes aparecem na ordem com que costumamos escrever as equações, ou seja, o coeficiente relacionado à potência de maior grau vem em primeiro lugar. A propriedade poly1d.roots retorna as raízes do polinômio. Note que, por padrão, as funções trabalham com números complexos, o que pode ser um excelente recurso.

Para encontrarmos os valores das constantes multiplicativas, precisamos das condições iniciais, e também montar a matriz que representa o sistema linear na equação 10. Com o Python, e usando o NumPy, isso é fácil:

>>> sn = s.reshape((2, 1)) ** arange(N)
>>> sn
array([[ 1.+0.j,  3.+0.j],
       [ 1.+0.j,  2.+0.j]])
>>> sn = matrix(sn)
>>> sn
matrix([[ 1.+0.j,  3.+0.j],
        [ 1.+0.j,  2.+0.j]])

Usamos o método reshape() para transformar o vetor de uma dimensão que contém as raízes em uma matriz-coluna com duas linhas. Fazemos isso para aproveitarmos a habilidade de broadcasting do NumPy. Note também que convertemos o resultado para uma matriz, para que possamos utilizar as operações de álgebra de matrizes que o NumPy tem disponível. Para solucionar o sistema de equações, fazemos:

>>> ci = matrix([[ 1., 0. ]])
>>> A = ci * sn.getI()
>>> A
matrix([[-2.+0.j,  3.+0.j]])

Na segunda linha, o método getI() obtém a inversa da matriz sn. A ordem em que a multiplicação das matrizes é feita pode parecer meio estranha para quem está familiarizado com a forma matricial da solução de sistemas lineares. Poderíamos transpor as matrizes para colocar na ordem costumeira, mas essa é uma operação desnecessária, pois o resultado obtido é o mesmo. Podemos criar uma função que toma como parâmetros os dados da solução e retorna pontos arbitrários da curva:

def fn(x, s, A):
    s = array(s)
    A = array(A)
    return sum(A*exp(s*x))

Na segunda e terceira linha, convertemos as soluções de volta para o formato de um arranjo. Fazemos isso para garantir que não existirão problemas com as dimensões dos vetores. Essa função tem a vantagem de ser vetorizada, ou seja, funcionará tanto com valores numéricos como com arranjos de valores.
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License