Numpy和numdifftools多维函数

时间:2017-08-01 15:08:50

标签: python numpy

我正在使用包numddifftools来计算多维函数的hessians(从R ^ n到R ^ n)。在更改代码以使用numpy数组而不是列表时,我发现这样做会破坏代码。具体做法是:

import numpy as np 
import numdifftools as nd

def function(x):

    out = np.zeros(2)
    out[0] = x[0] - x[1]**2/2.0

    return float(out[0])

tempHessian = nd.Hessian(function, method='complex')
tempHessian([0.4,0.4])

产生错误: ... \ Continuum \ Anaconda3 \ lib \ site-packages \ ipykernel_launcher.py:8:ComplexWarning:将复杂值转换为实际丢弃虚部

并给出零粗麻布。

然而,这个工作正常:

import numpy as np 
import numdifftools as nd

def function(x):

    return x[0] - x[1]**2/2.0

tempHessian = nd.Hessian(function, method='complex')
tempHessian([0.4,0.4])

任何想法可能是什么问题?谢谢!

1 个答案:

答案 0 :(得分:0)

创建out时如下:

    out = np.zeros(2)

它的类型为numpy.float64。您无法为此类数组指定复杂值。根据您使用的numpy版本,您将收到警告或错误。

用于数值微分的complex step method要求您的函数使用复杂值。强制outnumpy.float64会破坏该方法。使用float(out[0])将返回值转换为浮点值也会破坏方法。

您可以尝试这样的事情:

def function(x):

    out = np.zeros(2, dtype=x.dtype)
    out[0] = x[0] - x[1]**2/2.0

    return out[0]

这会创建out,其数据类型与x相同。因此,如果x很复杂,则返回值也很复杂,正如复杂步骤方法所要求的那样。

(当然,当我们只使用第一个元素时,我们不知道为什么你创建out大小为2。大概这是你正在使用的实际代码的简化。)< / p>