Derivadas e Lisp

Com algumas poucas linhas de código pode-se ter uma implementação de derivadas em Common Lisp. Claro que com tão pouco código não teremos a derivada em si, mas o valor dela para aquele x. Essa implementação serve como demonstração de como funções que retornam funções podem ser úteis.

A definição de derivada é basicamente:
\lim_{h\to0} \frac{f\left( x+h\right) - f\left( x\right)}{h}

Como não temos como fazer essa representação de limite em Lisp, usaremos um valor pequeno o suficiente, e para evitar problemas com precisão de floats, eu usei ratios ao invés de floats. Sabendo disso, eis a função deriv que retorna a derivada de fn:

(defun deriv (fn)
  (let ((dx 1/1000000000))
    #'(lambda (x)
        (/ (- (funcall fn (+ x dx)) (funcall fn x))
           dx))))

Se rodarmos algo como (deriv #'(lambda (x) (* x x))) ela retornará a derivada de (* x x), ou melhor dizendo, a derivada de x^2. Só isso não é lá muito útil, até porque essa derivada que é retornada não é uma função que pode ser lida; se rodarmos (print (deriv #'(lambda (x) (* x x))), não receberemos nenhuma informação muito útil sobre essa função.

Para usá-la, podemos fazer de duas formas (na verdade é a mesma, mas usando uma variável):

(funcall (deriv #'(lambda (x) (* x x))) 2)
;; ou...
(defvar derivada (deriv #'(lambda (x) (* x x))))
(funcall derivada 2)

Convenhamos que isso é meio chato (embora mais eficiente se formos usar várias vezes a mesma derivada), então definimos uma segunda função que deriva e já aplica o resultado a um valor de x:

(defun d/dx (fn x)
  (funcall (deriv fn) x))

E por último, uma forma de usar derivadas consecutivas:

(defun Dn (n fn x)
  (if (< n 2)
    (d/dx fn x)
    (Dn (1- n) (deriv fn) x)))

Só lembrando que na maioria dos casos nós não teremos um valor exato, mas sim uma aproximação bastante boa.

Publicidade

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: