Uma equação diferencial homogênea de coeficientes constantes é uma equação diferencial de ordem arbitrária que pode ser colocada na forma
(1)
com condições iniciais
(2)
onde
é a ordem da equação,
é a derivada de n-ésima ordem da variável dependente, e
são os coeficientes (constantes) da equação. Esta equação pode ser solucionada supondo que a resposta seja do tipo:

sendo
a variável independente, e as constantes
e
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
e
. A n-ésima derivada da equação 3 é dada por

Substituindo na equação 1 obtemos
(5)
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)
As soluções desse polinômio fornecem os valores
que estão nos expoentes da solução. Uma vez que existem
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

onde
são as raízes do polinômio característico. Para calcular o valor das constantes
, 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

Substituindo
e o respectivo valor da condição inicial, obtemos

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

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)
com condições iniciais
e
. O polinômio característico dessa equação é

cujas soluções são dadas por
e
. Portanto, a solução tem a forma

Substituindo
e
nesta equação, obtemos

Substituindo
e
na derivada da equação, obtemos

Solucionando este sistema, obtemos
e
. Portanto, a solução é

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.





