小编The*_*MAN的帖子

衍生塔以及如何使用矢量空间包(haskell)

我现在和Haskell合作已经有一段时间了,但我远非专家.但我发现编程的功能方法最适合我.

到目前为止,我正在研究一个项目来计算一些严重的东西,比如给定结构辐射的电流和电位.

我跟着Conal Elliott写的博客(这里是一些更多的线性地图),这是非常好的和基础的.

不幸的是,我缺少一个简单的例子:)

更确切地说,我有一条曲线

f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z
Run Code Online (Sandbox Code Playgroud)

这是(0,a,2*t)处的简单直线.当我想计算f的导数,例如用于曲线的长度,我知道数学结果,这是很简单的(0,0,2),但我要如何做到这一点在Haskell,尤其是与病媒太空包?

我真的很想使用这个库,因为它的功能,这正是我所采取的方法(但我在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 …
Run Code Online (Sandbox Code Playgroud)

haskell

14
推荐指数
1
解决办法
831
查看次数

多元函数的导数和带向量空间包的对应雅可比行列式

我再次遇到了vector-space包的问题.我在最近的帖子中收到了@mnish的一个非常有用的答案,但在那里我只处理了一个仅依赖于1个变量的函数.例如,当我有一个从极坐标映射到笛卡儿的函数时会发生什么

f:(0,oo) x [0,2pi] -> R²
(r,phi) -> (r*cos(phi),r*sin(phi))
Run Code Online (Sandbox Code Playgroud)

这取决于2个变量.

我试过这个,用一种天真的方法:

polar :: Double -> Double -> ((Double,Double) :~> (Double,Double))
polar r phi = \(r,phi) ->  (((idD) r)*cos( idD phi),((idD) r)*sin( idD phi))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Couldn't match expected type `(Double, Double) :> (Double, Double)'
            with actual type `(t0, t1)'
In the expression:
  (((idD) r) * cos (idD phi), ((idD) r) * sin (idD phi))
In the expression:
  \ (r, phi)
    -> (((idD) r) * cos (idD phi), …
Run Code Online (Sandbox Code Playgroud)

haskell

6
推荐指数
1
解决办法
354
查看次数

如何区分积分与向量空间库(haskell)

当使用矢量空间包进行衍生塔(参见衍生塔)时,我遇到了区分积分的需要.从数学来看,很明显如何实现这一点:

f(x) = int g(y) dy from 0 to x
Run Code Online (Sandbox Code Playgroud)

有功能

g : R -> R
Run Code Online (Sandbox Code Playgroud)

例如.

关于x的导数将是:

f'(x) = g(x)
Run Code Online (Sandbox Code Playgroud)

我试图通过首先定义一个类"集成"来获得这种行为

class Integration a b where
--standard integration function
integrate :: (a -> b) -> a -> a -> b
Run Code Online (Sandbox Code Playgroud)

一个基本的例子是

instance  Integration Double Double where
  integrate f a b = fst $ integrateQAGS prec 1000 f a b
Run Code Online (Sandbox Code Playgroud)

integrateQAGSHMATRIX

问题来自值b代表衍生品塔:

instance Integration Double (Double :> (NC.T Double)) where
  integrate = integrateD …
Run Code Online (Sandbox Code Playgroud)

haskell

5
推荐指数
1
解决办法
313
查看次数

标签 统计

haskell ×3