当使用衍生塔的vector-space包(请参阅derivative towers)时,我遇到了区分积分的需求。 从数学是很清楚如何实现这一点:与函数如何区分积分与向量空间库(haskell)
g : R -> R
例如
f(x) = int g(y) dy from 0 to x
。
关于x的导数是:
f'(x) = g(x)
我试图通过先定义一个类 “一体化” 得到这个行为
class Integration a b where
--standard integration function
integrate :: (a -> b) -> a -> a -> b
一个基本的例子是
instance Integration Double Double where
integrate f a b = fst $ integrateQAGS prec 1000 f a b
与integrateQAGS
from hmatrix
问题带有b值代表衍生物的塔:
instance Integration Double (Double :> (NC.T Double)) where
integrate = integrateD
NC.T
是从Numeric.Complex(数字-前奏)。 功能integrateD
定义如下(但错误):
integrateD ::(Integration a b, HasTrie (Basis a), HasBasis a, AdditiveGroup b) => (a -> a :> b) -> a -> a -> (a :> b)
integrateD f l u = D (integrate (powVal . f) l u) (derivative $ f u)
的函数不返回我想要的东西,它的来源积,而不是整体。问题是,我需要一个线性地图,返回f u
。该a :> b
定义如下:
data a :> b = D { powVal :: b, derivative :: a :-* (a :> b) }
我不知道如何定义derivative
。任何帮助将不胜感激,谢谢
编辑:
我忘了提供Integration Double (NC.T Double)
实例:
instance Integration Double (NC.T Double) where
integrate f a b = bc $ (\g -> integrate g a b) <$> [NC.real . f, NC.imag . f]
where bc (x:y:[]) = x NC.+: y
,我可以给我的意思的例子: 比方说,我有一个函数
f(x) = exp(2*x)*sin(x)
>let f = \x -> (Prelude.exp ((pureD 2.0) AR.* (idD x))) * (sin (idD x)) :: Double :> Double
(AR * *)表示代数的乘法。环(数字-前奏)
我很容易这个功能与上面的功能integrateD
整合:
>integrateD f 0 1 :: Double :> Double
D 1.888605715258933 ...
当我看一看f的衍生物:
f'(x) = 2*exp(2*x)*sin(x)+exp(2*x)*cos(x)
并评估此在0
和pi/2
我得到1
和一些值:
> derivAtBasis (f 0.0)()
D 1.0 ...
> derivAtBasis (f (pi AF./ 2))()
D 46.281385265558534 ...
现在,获得积分的时候,我得到的功能f
的推导而不是它的上限
> derivAtBasis (integrate f 0 (pi AF./ 2))()
D 46.281385265558534 ...
但我值期待:
> f (pi AF./ 2)
D 23.140692632779267 ...
是的,这是真的。但是,当我在'Double:> Double'值上使用'powVal'函数时,它可以工作。但是,当然,我失去了有关衍生物的信息。我必须明确提供这些信息,这就是我卡住的地方:( – TheMADMAN 2012-07-11 19:01:39