Производные башни и как использовать пакет векторного пространства (haskell) - PullRequest
14 голосов
/ 16 февраля 2012

Я работаю с Haskell довольно давно, но я далеко не эксперт.Но я вижу, что функциональный подход к программированию подходит мне лучше всего.

Пока я работаю над проектом по вычислению некоторых серьезных вещей, таких как токи и потенциалы, излучаемые данной структурой.

Я следил за блогом, написанным Конал Эллиотт (вот еще несколько Линейные карты ), который очень хорош и фундаментален.)

Точнее, у меня есть кривая

f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z

, представляющая собой простую прямую линию в точке (0, a, 2 * t).Когда я хочу вычислить производную от f, например, для длины кривой, я знаю математический результат, который довольно прост (0,0,2), но как мне сделать это в Haskell, особенно с vector-space пакет?

Я действительно хочу использовать эту библиотеку из-за ее функциональности, это именно тот подход, который я бы тоже выбрал (но я не так далеко впереди на пути к Haskell)

На данный момент у меня есть следующее:

{-# 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)

Это реальная реализация функции pureD, и пока ничего из того, что я пробовал, не работает, чтобы заставить этот фрагмент компилироваться.Я получаю следующую ошибку:

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.

Существует также графическая библиотека, которая использует векторное пространство, и даже есть пример на торе, где используется pureD.Я попытался вывести пример, но не понимаю, как сопоставить его с моей проблемой.

Любая помощь будет принята с благодарностью.

Заранее спасибо

PS: Я не могу опубликовать все ссылки, которые хотел бы, но готов предоставить

Ответы [ 2 ]

5 голосов
/ 17 февраля 2012

Это интересная библиотека .. Спасибо, что поделились. Хотя я еще не понимаю концепцию библиотеки, как насчет этого кода:

{-# 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)]

Попробуйте также g x = tripleD (pureD 0, idD x, (idD * idD) x) (которые, кажется, представляют кривую (0, x, x ^ 2)).

0 голосов
/ 10 апреля 2013

Возможно, вы захотите попробовать пакет ad, который делает все возможное, чтобы упростить автоматическое дифференцирование функций, написанных на прозрачном идиоматическом языке Haskell.

$ 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...