鉴于:

  • Haskell
  • 在复平面 df/dz 上定义的复值函数 U (假设 z 是一个 Complex Double )。
  • 从定义 z1U 指向 df/dz

  • 问题:

    f(z) 点上,如何获取 df/dz 是导数的函数 z1 的值?
    IE。假设复平面,如何仅在给定导数的情况下恢复原始函数的值?

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

    最佳答案

    ( 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)

    关于haskell - 如何在 Haskell 中给定该函数的导数以数值方式计算复函数的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17058512/

    10-12 14:26
    查看更多