(Runge–Kutta in Haskell)
你可以使用一些數值求解像Runge-Kutta
-- define 4th order Runge-Kutta map (RK4)
rk4 :: Floating a => (a -> a) -> a -> a -> a
rk4 f h x = x + (1/6) * (k1 + 2*k2 + 2*k3 + k4)
where k1 = h * f (x)
k2 = h * f (x + 0.5*k1)
k3 = h * f (x + 0.5*k2)
k4 = h * f (x + k3)
在這種情況下,函數簽名是Floating
但你可以使用RealFloat
代替(你可以使用龍格 - 庫塔在複雜的)。
完整的示例:
Prelude> import Data.Complex
Prelude Data.Complex> let rk4 f h x = x + (1/6) * (k1 + 2*k2 + 2*k3 + k4) where {k1 = h * f(x);k2 = h * f (x + 0.5*k1);k3 = h * f (x + 0.5*k2);k4 = h * f (x + k3)}
Prelude Data.Complex> let f z = 2 * z
Prelude Data.Complex> rk4 f (0.1 :+ 0.2) (0.3 :+ 1.2)
(-0.2334199999999999) :+ 1.4925599999999999
Prelude Data.Complex>
在另一方面,@leftaroundabout建議延長該行爲VectorSpace
(偉大的歷程:!d)
你不能做到這一點。函數的導數並不唯一確定函數。這與整合是一樣的,所以至少會有一個你不知道的常量。 – augustss
你想要一個數字或符號的方法嗎?即是'df/dz'總是一些涉及加號,次數,指數,正弦等的表達式,或者你有一些數字數據?不幸的是,這兩種情況都比較困難... – luqui
OMG,@augustss非常感謝你,我完全不知道如何忘記這個基本的數學問題...(facepalm)但是,我仍然需要解決這個問題至少部分。我可以使用一些附加約束來解決原始問題(因此初始數據不僅僅是「df/dz」,而且還包括一些約束),從而推斷出缺少_C_。 – hijarian