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