operator - haskell simbolos
Towers derivativos y cómo usar el paquete vector-space(haskell) (2)
Es una biblioteca interesante. Gracias por compartir. Aunque todavía no entiendo el concepto de la biblioteca, ¿qué hay de este código?
{-# LANGUAGE Rank2Types, TypeOperators, FlexibleContexts, TypeFamilies #-}
module Main where
import Data.LinearMap
import Data.Maclaurin
diff :: (Double :~> (Double,Double,Double) ) -> (Double :~> (Double,Double,Double))
diff f = /x -> (atBasis (derivative (f x)) ())
eval :: (Double :~> (Double,Double,Double)) -> Double -> (Double,Double,Double)
eval f x = powVal (f x)
f :: Double :~> (Double,Double,Double)
f x = tripleD (pureD 0,pureD 1,(2*idD) x)
*Main> map (eval f) [0,0.2 .. 1]
[(0.0,1.0,0.0),(0.0,1.0,0.4),(0.0,1.0,0.8),(0.0,1.0,1.2000000000000002),
(0.0,1.0,1.6000000000000003),(0.0,1.0,2.0000000000000004)]
*Main> map (eval (diff f)) [0,0.2 .. 1]
[(0.0,0.0,2.0),(0.0,0.0,2.0),(0.0,0.0,2.0),(0.0,0.0,2.0),(0.0,0.0,2.0),
(0.0,0.0,2.0)]
*Main> map (eval (diff $ diff f)) [0,0.2 .. 1]
[(0.0,0.0,0.0),(0.0,0.0,0.0),(0.0,0.0,0.0),(0.0,0.0,0.0),(0.0,0.0,0.0),(0.0,0.0,0.0)]
Pruebe también gx = tripleD (pureD 0, idD x, (idD * idD) x) (que parecen representar la curva (0, x, x ^ 2)).
Estoy trabajando con Haskell desde hace bastante tiempo, pero estoy lejos de ser un experto. Pero veo que el enfoque funcional de la programación me sienta mejor.
Hasta ahora estoy trabajando en un proyecto para calcular algunas cosas serias, como corrientes y potenciales irradiados desde una estructura determinada.
Seguí el blog escrito por Conal Elliott (aquí hay algunos mapas lineales más) que es muy bueno y fundamental.
Lamentablemente, me falta un simple ejemplo :)
Para ser más preciso, tengo una curva
f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z
que es una línea recta simple en (0, a, 2 * t). Cuando quiero calcular la derivada de f, por ejemplo, para la longitud de la curva, conozco el resultado matemático, que es bastante simple (0,0,2), pero ¿cómo lo logro en Haskell, especialmente con el vector-? paquete espacial ?
Realmente quiero usar esta biblioteca debido a su funcionalidad, es exactamente el enfoque que yo también tomaría (pero no estoy tan lejos en la carretera Haskell)
Lo que tengo hasta ahora es esto:
{-# LANGUAGE Rank2Types, TypeOperators, FlexibleContexts, TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}
import Numeric.GSL.Integration
import Data.VectorSpace
import Data.Basis
import Data.Cross
import Data.Derivative
import Data.LinearMap
type Vec3 s = Three s
prec :: Double
prec = 1E-9
f1 :: (Floating s, VectorSpace s, Scalar s ~ s) => s -> s
f1 = id
c1 :: Double -> Vec3 Double
c1 = /t -> linearCombo [((v 0 0 1),f1 t),(( v 0 1 0),2)]
derivC :: Double -> Vec3 (Double :> Double)
derivC t = c1 (pureD t)
Es la implementación real de la función pureD, hasta ahora nada de lo que he intentado funciona para compilar este fragmento. Obtuve el siguiente error:
tests.hs:26:12:
Couldn''t match expected type `Double :> Double''
with actual type `Double''
Expected type: Vec3 (Double :> Double)
Actual type: Vec3 Double
In the return type of a call of `c1''
In the expression: c1 (pureD t)
Failed, modules loaded: none.
También hay una biblioteca de gráficos que utiliza el espacio vectorial e incluso hay un ejemplo en un toro, donde se usa pureD. Traté de deducir el ejemplo, pero no veo cómo puedo asignarlo a mi problema.
Cualquier ayuda sería muy apreciada.
Gracias por adelantado
PD: No puedo publicar todos los enlaces que me gustaría, pero estoy dispuesto a proporcionar
Es posible que desee probar el paquete de ad
, que hace todo lo posible para facilitar la diferenciación automática de las funciones escritas en Haskell idiomático transparente.
$ cabal install ad
$ ghci
Prelude> :m + Numeric.AD
Prelude Numeric.AD> diffF (/t->let a=3 in [0,a,2*t]) 7
[0,0,2]
Prelude Numeric.AD> let f t = let a=3 in [0,a,2*t]
Prelude Numeric.AD> diffF f 17
[0,0,2]