gpt4 book ai didi

haskell - 导数塔以及如何使用向量空间包 (haskell)

转载 作者:行者123 更新时间:2023-12-03 22:38:54 25 4
gpt4 key购买 nike

我现在和 Haskell 一起工作了很长一段时间,但我远非专家。但我发现编程的函数式方法最适合我。
到目前为止,我正在做一个项目来计算一些重要的东西,比如从给定结构辐射的电流和电势。
我关注了 Conal Elliott 写的博客(这里还有一些 Linear Maps )非常好和基本。
不幸的是,我缺少一个简单的例子:)
更准确地说,我有一条曲线

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:我无法发布我想要的所有链接,但愿意提供

最佳答案

那是一个有趣的图书馆。谢谢分享。
虽然我还不明白图书馆的概念,
这段代码怎么样:

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

关于haskell - 导数塔以及如何使用向量空间包 (haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9313994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com