Khi sử dụng gói vector-space cho tháp phái sinh (xem derivative towers) Tôi thấy cần phải phân biệt các tích phân. Từ toán học nó là khá rõ ràng làm thế nào để đạt được điều này:Cách phân biệt tích phân với thư viện không gian véc tơ (haskell)
f(x) = int g(y) dy from 0 to x
với một chức năng
g : R -> R
ví dụ.
Các phái sinh đối với x sẽ là:
f'(x) = g(x)
tôi đã cố gắng để có được hành vi này bằng cách đầu tiên xác định một lớp "Hội nhập"
class Integration a b where
--standard integration function
integrate :: (a -> b) -> a -> a -> b
một ví dụ cơ bản là
instance Integration Double Double where
integrate f a b = fst $ integrateQAGS prec 1000 f a b
với integrateQAGS
từ hmatrix
vấn đề đi kèm với giá trị b đại diện cho tháp của các dẫn xuất:
instance Integration Double (Double :> (NC.T Double)) where
integrate = integrateD
NC.T
là từ Numeric.Complex (số-khúc dạo đầu). Chức năng integrateD
được định nghĩa như sau (nhưng sai):
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)
Chức năng không trả lại những gì tôi muốn, nó xuất phát integrand, nhưng không phải là không thể thiếu. Vấn đề là, tôi cần một bản đồ tuyến tính trả về f u
. a :> b
được định nghĩa như sau:
data a :> b = D { powVal :: b, derivative :: a :-* (a :> b) }
Tôi không biết cách xác định derivative
. Bất kỳ trợ giúp sẽ được đánh giá cao, nhờ
chỉnh sửa:
Tôi quên để cung cấp các ví dụ cho 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
và tôi có thể đưa ra một ví dụ về những gì tôi có nghĩa là: Hãy nói rằng tôi có một chức năng
f(x) = exp(2*x)*sin(x)
>let f = \x -> (Prelude.exp ((pureD 2.0) AR.* (idD x))) * (sin (idD x)) :: Double :> Double
(AR. *) có nghĩa là nhân từ Đại số.Vòng (số-khúc dạo đầu)
tôi có thể dễ dàng tích hợp chức năng này với các chức năng trên integrateD
:
>integrateD f 0 1 :: Double :> Double
D 1.888605715258933 ...
Khi tôi hãy nhìn vào đạo hàm của f:
f'(x) = 2*exp(2*x)*sin(x)+exp(2*x)*cos(x)
và đánh giá này tại 0
và pi/2
Tôi nhận được 1
và một số giá trị:
> derivAtBasis (f 0.0)()
D 1.0 ...
> derivAtBasis (f (pi AF./ 2))()
D 46.281385265558534 ...
Bây giờ, khi phát sinh sự không thể thiếu, tôi nhận được nguồn gốc của hàm f
không giá trị của nó ở phía trên bên ràng buộc
> derivAtBasis (integrate f 0 (pi AF./ 2))()
D 46.281385265558534 ...
Nhưng tôi mong đợi:
> f (pi AF./ 2)
D 23.140692632779267 ...
Đúng vậy. Nhưng nó hoạt động, khi tôi sử dụng hàm 'powVal' trên một giá trị' Double:> Double'. Nhưng tất nhiên, tôi mất thông tin về đạo hàm. Tôi phải cung cấp thông tin này một cách rõ ràng, và đó là nơi tôi bị mắc kẹt: ( – TheMADMAN