[Cascavel-pm] Perl pode calcular derivadas!
Breno G. de Oliveira
breno em clavis.com.br
Quarta Novembro 2 08:37:16 PST 2005
Luis Campos de Carvalho wrote:
>
> Isto pode ser implementado.
> O problema de calcular derivadas depende muito de dois fatores mais ou menos interdependentes:
>
> 1) Notação: a notação (de cálculo) pode fazer você pirar. Escolher com cuidado é fundamental.
> Existem duas ou três notações populares entre os matemáticos, e pelo que eu pude perceber entre os
> engenheiros e físicos devem existir pelo menos mais duas. Recomendo que você experimente com
> cuidado e não ouse muito no começo.
>
> 2) Complexidade das Expressões: não acho que alguém tenha dúvidas que isso está ligado à forma
> como você representa as expressões. E tenho certeza de que existem derivadas e "Derivadas" (notem
> o "D"). Derivar polinômios algébricos em perl pode ser tão simples quanto procurar e substituir
> strings. ;-) Claro, conforme a operação se sofisticar, isso pode ficar arbitráriamente complicado.
> Por isso cálculo e álgebra são campos em que humanos podem fazer melhor.
>
> Se você estiver procurando por algum tipo de derivada específica, ou conseguir isolar e fazer
> com que seu programa compreenda quando e como aplicar algumas das técnicas, posso ajudar a
> construir um módulo capaz de resolver *algumas* derivadas. Principalmente as polinomiais com
> expoentes naturais positivos. ;-)
>
Oi Champs!
Obrigado pelas dicas e pelo apoio, realmente tenho muito medo em
automatizar operações algébricas já que mesmo ferramentas consagradas
como o Maple e o Mathematica cometem erros capazes de jogar uma pesquisa
toda no lixo.
Achei o módulo
Math::Calculus::Differentiate
que consegue derivar relativamente bem, até onde eu pude testar. O
autor, Jonathan Worthington, colocou alguns exemplos de seus módulos
online em http://www.jwcs.net/~jonathan/math/ e ele aparentemente
retorna a expressão algébrica corretamente. Por exemplo, ele diz que a
derivada de
x^3 * e^x
é
x^3*ln(e)*exp(ln(e)*x) + 3*e^x*x^2
o que é verdade, mas ln(e) == 1, então isso na verdade deveria ser:
x^3 * e^x + 3 * e^x * x^2
Existe no módulo o método "simplify" que deve fazer isso, e ainda não
testei exaustivamente problemas de divisão por zero. Outro problema
menos grave é a resolução da equação para um determinado valor de x
(sendo um ponto na reta ou uma faixa de valores). Enfim, precisa de mais
testes! ;)
Mas pode deixar que se eu tiver algum problema volto a perturbar vcs ;)
Obrigado!
breno
Mais detalhes sobre a lista de discussão Cascavel-pm