如何在Haskell中给出该函数的导数,从而在数值上计算复函数的值?

时间:2013-06-12 05:53:51

标签: haskell complex-numbers integral derivative

鉴于:

  1. 的Haskell
  2. 复杂平面df/dz上定义的复值函数U(假设zComplex Double)。
  3. 从定义z1的{​​{1}}开始点U
  4. 问题:

    如何在df/dz点获得f(z)衍生的函数df/dz的值? I. e。假设复平面,如何只给出它的导数,如何恢复原函数的值?


    这个问题与my previous question about calculating integrals of complex functions有些相关,但它们是关于不同的事情。在这里,我感兴趣的不是计算一些标量值,而是在找到原始函数时给出它的导数。它基本上是计算这个导数的不定积分。

1 个答案:

答案 0 :(得分: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代替(您可以在复杂中使用runge-kutta)。

完整示例:

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)