2013-06-12 40 views
3

考慮:如何在Haskell中以數值方式計算給定函數導數的複數函數值?

  1. 哈斯克爾複平面上U定義
  2. 復值函數df/dz(假設zComplex Double)。
  3. 來自U的點z1其上定義了df/dz

問:

如何獲得的功能f(z)爲其df/dz是一種衍生物,點z1價值? I. e。如何恢復原始函數的值只有它的導數,假設複數平面?


這個問題與my previous question about calculating integrals of complex functions有些相關,但它們是關於不同的東西。在這裏,我不感興趣的是計算一些標量值,但是在找到起源函數給定它的導數。它基本上是計算這個導數的不確定積分。

+1

你不能做到這一點。函數的導數並不唯一確定函數。這與整合是一樣的,所以至少會有一個你不知道的常量。 – augustss

+1

你想要一個數字或符號的方法嗎?即是'df/dz'總是一些涉及加號,次數,指數,正弦等的表達式,或者你有一些數字數據?不幸的是,這兩種情況都比較困難... – luqui

+0

OMG,@augustss非常感謝你,我完全不知道如何忘記這個基本的數學問題...(facepalm)但是,我仍然需要解決這個問題至少部分。我可以使用一些附加約束來解決原始問題(因此初始數據不僅僅是「df/dz」,而且還包括一些約束),從而推斷出缺少_C_。 – hijarian

回答

5

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)

+2

事實上,它可能比'Floating'還要普遍得多,['VectorSpace'](http://hackage.haskell.org/packages/archive/vector-space/0.8.6/doc/html/ Data-VectorSpace.html#t:VectorSpace)是我想要的。 – leftaroundabout

+0

我想我需要更多的數學和哈斯克爾背景來理解'VectorSpace'的必要性,但是使用'RealFloat'的Runge-Kutta解決方案似乎是我想要的。 :) – hijarian

+0

@hijarian:沒有必要使用'VectorSpace',它只允許使用算法解決更復雜的問題。 (標準的'RealFloat'類型已經是'VectorSpace'的實例,即ℝ)。 – leftaroundabout