Criando funções em Haskell
Através do Cálculo Algébrico de Derivadas
Roque Mendes Prado Trindade
Leandro Pereira Silva de Novais∗
Diogo Pereira Silva de Novais
Departamento de Ciências Exatas- Universidade Estadual do Sudoeste da Bahia- UESB
Estrada do Bem Querer, Caminho 4-Vitória da Conquista- Ba- Brasil
E-mail: [email protected], [email protected], [email protected].
RESUMO
Computadores possuem capacidade finita de representação de números, logo, a implementação
de modelos infinitos em computadores, por exemplo cálculos envolvendo números reais, pode
resultar em erros de discretização, aproximação ou truncamento, que são “os erros cometidos
quando se substitui qualquer processo infinito por um processo finito ou discreto” [2]. Durante
o cálculo de métodos numéricos, principalmente os iterativos, estes erros podem acontecer com
maior frequência, pois nestes métodos a quantidade de operações envolvendo números é muito
grande e pode envolver diversos erros de aproximação ou truncamento.
Do ponto de vista computacional, o reaproveitamento dos cálculos realizados numericamente
é mais complexo se comparado à forma algébrica. A derivada, por exemplo, numericamente é
calculada para um ponto dado, enquanto algebricamente fornece uma função através da qual
pode se obter o valor da derivada num ponto dado apenas aplicando o valor na função. Exemplo claro seria o uso da derivação numérica no método de Newton-Raphson (muito usado em
calculadoras) para encontrar raı́zes de funções, no qual uma nova aproximação do valor é dada
por [7]:
f (xn )
xn+1 = xn − 0
f (xn )
Se a derivada for calculada numericamente, será necessário repetir este mesmo cálculo a cada
iteração, levando a um grande número de aproximacões quando somado às inerentes ao método
de Newton-Raphson. Por outro lado, algebricamente, a derivada seria calculada uma única vez
e a função obtida usada para calcular o valor de cada iteração.
Este trabalho consiste na implementação em Haskell do cálculo algébrico de derivadas, onde
o programa receberá como entrada uma função em forma de texto, usando uma linguagem
baseada na MPL (pseudo-linguagem Matemática, do inglês Mathematical pseudo-language)[3]
adaptada às necessidades do trabalho, e retornará a derivada como uma função de Haskell na
notação lambda[8].
As derivadas serão calculadas através de técnicas de manipulação simbólica, similarmente a
sistemas de álgebra computacional como Maple e Mathematica. Para tal, as funções simples serão
calculadas diretamente de acordo com as derivadas das funcões polinomiais, trigonométricas, exponenciais e logarı́timicas [7], e as funções compostas serão reduzidas recursivamente e calculadas
como funções simples usando as regras de soma, subtracão, produto, quociente, regra da cadeia
[7] e derivada de função composta exponencial [6].
Dentre as caracterı́sticas que levaram à escolha do Haskell, está o fato de ter sido desenvolvida
para ter notação tão aproximada da matemática quanto possı́vel [4], além de possuir funções de
∗
Licenciando em Matematica pela UESB.
982
alta ordem, que podem ser tratadas como tipos da linguagem [1], facilitando o uso de funções
como argumentos e retorno de outras funções. Além disso, as funções do Haskell respeitam as
mesmas propriedades das funções matemáticas [5] excetuando, obviamente, a capacidade infinita
de representação de números.
O programa desenvolvido poderá ser utilizado como parte de métodos, numéricos ou não,
que façam uso de derivadas em seus cálculos, para plotagem de gráficos, enfim aplicações em
geral envolvendo derivadas.
O presente trabalho pode ser aprimorado através do uso de propriedades das funções obtidas,
propriedades de logaritmos e funções trigonométricas por exemplo, para tornar as funções mais
eficientes computacionalmente.
Palavras-chave: Derivação algébrica, erros, Haskell,Computação simbólica
Referências
[1] S. Araújo, B. Acióly, “Introdução ao Haskell”, Edições UESB, Vitória da Conquista, 2007.
[2] D. Claudio, J. Marins, “Cálculo Numérico e Computacional teoria e prática”, 2 Ed., Atlas,
São Paulo, 1994.
[3] J. S. Cohen ”Computer Algebra and Symbolic Computation Mathematical Methods”,
O’Reilly Media; 1 Ed. A K Peters, 2003.
[4] P. Hudak, J. Hughes, S. Jones, A History of Haskell: being lazy with class, em Third ACM
SIGPLAN History of Programming Languages Conference, San Diego, CA, 2007, pp. 12-66.
[5] D. Novais, R. Trindade, Haskell Implementation of Methods for Solving Systems of Linear
Equations, World Academy of Science, Engineering and Technology, 61, 2010, pp. 366-369.
[6] N. Piskounov, “Cálculo Diferencial e Integral”, Vol. 1, 9 Ed., Lopes da Silva Editora, Porto,
1982.
[7] J. Stewart, “Cálculo”, Vol. 1, 6 Ed., Cengage Learning, 2009.
[8] B. Sullivan, J. Goerzen, D. Stewart, “Real Word Haskel” 1 Ed., O’Reilly, 2009.
983
Download

2010Computação Científica P-IC Criando funções em Haskell