鉴于:
- 哈斯克尔
df/dz
在复平面上定义的复值函数U
(假设z
是 aComplex Double
)。z1
从定义的U
点开始df/dz
。
问题:
如何获得作为导数的函数f(z)
的值?IE。假设复平面,如何仅给出原始函数的导数来恢复原始函数的值?df/dz
z1
这个问题与我之前关于计算复杂函数积分的问题有些相关,但它们是关于不同的事情。在这里,我感兴趣的不是计算一些标量值,而是在给定导数的情况下找到原点函数。它本质上是计算这个导数的不定积分。
鉴于:
df/dz
在复平面上定义的复值函数U
(假设z
是 a Complex Double
)。z1
从定义的U
点开始df/dz
。问题:
如何获得作为导数的函数f(z)
的值?IE。假设复平面,如何仅给出原始函数的导数来恢复原始函数的值?df/dz
z1
这个问题与我之前关于计算复杂函数积分的问题有些相关,但它们是关于不同的事情。在这里,我感兴趣的不是计算一些标量值,而是在给定导数的情况下找到原点函数。它本质上是计算这个导数的不定积分。
您可以使用一些数值求解器,例如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)