haskell - 如何在 Haskell 中数值计算复杂函数的值(给定该函数的导数)?

标签 haskell complex-numbers integral derivative

给定:

  1. haskell
  2. 在复平面 U 上定义的复值函数 df/dz(假设 z 是一个 Complex Double >).
  3. 定义 df/dzU 上的点 z1

问题:

如何获取函数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/

相关文章:

performance - 创建集合中所有元素对的 Data.Set 的最有效方法是什么?

c - 使用 Cubature C 包对复杂函数进行数值积分

python - 使用Python进行三重积分的数值计算

r - 从 R 中的插值样条获取多项式系数

haskell - 如何使我的 Haskell 函数尽可能短?

haskell - Parsec:特定位置的错误消息

generics - 自由箭头的有用操作

c++ - std::complex 的模板函数重载

python - 如何处理 Python 中的不确定形式

matlab - 在Matlab中实现积分方程的迭代求解