微分タワー (微分タワーを参照) にベクトル空間パッケージを使用する場合、積分を微分する必要があります。数学から、これを達成する方法は非常に明確です。
f(x) = int g(y) dy from 0 to x
機能付き
g : R -> R
例えば。
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
hmatrixintegrateQAGS
から_
問題には、導関数の塔を表す値 b が伴います。
instance Integration Double (Double :> (NC.T Double)) where
integrate = integrateD
NC.T
Numeric.Complex (numeric-prelude) からのものです。関数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.*) Algebra.Ring からの乗算を意味します (numeric-prelude)
この関数を上記の関数と簡単に統合できます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 ...