|
|
O cálculo que realizamos, fornece o resultado desejado, mas tem uma falha séria: As equações foram manualmente montadas. Isso é inconveniente e facilita a ocorrência de erros, e não conduz a uma generalização útil. Nessa seção exploramos um melhor algorítmo para escolher as equações.
r: 1/(x^2*(x^2 + 1));
1
-----------
2 2
x (x + 1)
Agora, informamos as três frações elementares que podem ocorrer na decomposição em frações parciais daquela expressão:
p1: a/x;
a
-
x
p2: b/x^2;
b
--
2
x
p3: (c*x + d)/(x^2 + 1);
c x + d
-------
2
x + 1
A decomposição em frações parciais é a adição dessas três frações:
p1 + p2 + p3;
c x + d a b
------- + - + --
2 x 2
x + 1 x
Para comparar os coeficientes do numerador desconhecido com o numerador da expressão dada, temos que reescrever aquela adição sobre um denominador comum:
ratsimp(%);
3 2
(c + a) x + (d + b) x + a x + b
---------------------------------
4 2
x + x
Agora, acessamos o numerador dessa fração:
n: num(%);
3 2
(c + a) x + (d + b) x + a x + b
isso é uma adição, mas precisamos transformar suas parcelas em uma lista. Para reescrever uma adição como uma lista de suas parcelas, temos que usar a função maplist:
parcelas: maplist (lambda ([item ], item), %);
3 2
[(c + a) x , (d + b) x , a x, b]
A seguinte expressão transforma a lista de termos em uma lista de equações. Para cada termo em "parcelas", o termo coeficiente é igualado ao coeficiente correspondente em r
map(lambda ([parcelas], coeff(parcelas, x, hipow(parcelas, x)) = coeff(r, x, hipow(parcelas, x))),
parcelas);
[c + a = 0, d + b = 0, a = 0, b = 1]
Que corresponde a um sistema de equações lineares. Podemos resolvê-lo com solve:
solve(%, [a, b, c, d]);
[[a = 0, b = 1, C = 0, d = - 1]]
at(p1 + p2 + p3, first(%));
1 1
-- - ------
2 2
x x + 1
|
|