Un poco de Análisis en Haskell
Mayo 18 2009 :: Análisis, Haskell, Programación Funcional ::
Teniendo en cuenta que:
Se puede hacer una definición de la función derivada en Haskell como:
derivada :: (Double -> Double) -> Double -> Double
derivada f x = ( f(x + h) - f x ) / h
where h = 0.0001
Considerando que la derivada de f(x) = x2 es f’(x) = 2x, testeamos la definición:
*Main> derivada (\x -> x^2) 2
4.0001000000078335
Afinando la definición de h:
derivada :: (Double -> Double) -> Double -> Double
derivada f x = ( f(x + h) - f x ) / h
where h = 0.00000000001
Da como resultado:
*Main> derivada (\x -> x^2) 2
4.000000330961484
Independientemente ( o más bien a pesar ) de los problemas Inherentes a la aritmetica de punto flotante, se ve que Cuando h tiende a 0 más se acerca al resultado esperable.
Aplicación Parcial (Currying)
Se puede usar la definición de derivada anterior para producir una función y no un resultado, ej:
casiPor2 :: (Double -> Double)
casiPor2 = derivada (\x -> x^2)
Que si bien no es equivalente a \x -> 2 * x, (por los problemas de la aritmetica de punto flotante), se le acerca.
Una versión de testeo con diversos niveles de acercamiento.
Esto es interesante para entender gráficamente el concepto de limite.
derivada3 :: (Double -> Double) -> Double -> Double ->Double
derivada3 f x h = (f(x + h) - f x ) / h
tiendeA0 :: Double -> [Double]
tiendeA0 h = h : ( tiendeA0 (h*0.1) )
Testeo de tender a 0:
*Main> take 10 (tiendeA0 1)
[1.0, 0.1, 1.0000000000000002e-2, 1.0000000000000002e-3, 1.0000000000000003e-4, 1.0000000000000004e-5, 1.0000000000000004e-6, 1.0000000000000005e-7, 1.0000000000000005e-8, 1.0000000000000005e-9]
Ahora considerando que: f(x) = x^3 => f’(x) = 3x^2 y En particular si x=2, f’(x) = 3x^2 = 3.4 = 12; podemos probar su aplicación para ver el comportamiento extraño del punto flotante.
*Main> map ( derivada3 (\x -> x^3) 2 ) (take 10 (tiendeA0 1))
[19.0, 12.61000000000001, 12.060099999999705, 12.006000999999596, 12.000600010022563, 12.00006000026121, 12.000006002210734, 12.000000584322374, 11.999999927070343, 12.000000992884447]
Referencias
Razonando con Haskell;Blas C. Ruiz, Francisco Gutiérrez, Pablo Guerrero y José E. Gallardo;Thomson Editores Spain;2004
Calculus; M. Spivak; Editorial Reverte; 1992
Algebra de Boole Aplicada a Circuitos de Computación; M. C. Guinzburg; Biblioteca Técnica Superior; 1998
Autor: Emiliano Martínez Luque.


Deja un Comentario
Guía de los comentarios
Tu Email es requerido pero no sera publicado.
Podes usar los siguientes tags de HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>Si no comentastes antes tu comentario debera ser aprovado antes de que se lo muestre. Perdón, pero hay demasiado spam.