numpy.root通过scipy.optimize.fmin

时间:2017-06-10 22:08:02

标签: numpy scipy

所以我正在处理一个处理多项式根的函数,我想找到这样函数的最小点(例如通过fmin):

import numpy as np
from scipy.optimize import fmin

def sumroots(t):
    c0 = t*np.exp(-t)
    c1 = t+1
    c2 = t+2
    z = np.roots([c0, c1, c2])
    return np.abs(np.sum(z))

fmin(sumroots, 1)

理想情况下,我应该可以通过上面代码的最后一行fmin这个函数,但它会让我回到错误:

  File "<ipython-input-163-c7353335fcca>", line 5, in sumroots
    z = np.roots([c0, c1, c2])

  File "C:\Users\user\Anaconda3\lib\site-packages\numpy\lib\polynomial.py", line 209, in roots
    raise ValueError("Input must be a rank-1 array.")

ValueError: Input must be a rank-1 array.

感谢您提前抽出时间和帮助。

1 个答案:

答案 0 :(得分:0)

错误消息

ValueError: Input must be a rank-1 array.

暗示我们正在将值传递给期望排名为1的数组但是 正在得到别的东西。回溯错误消息显示问题是 发生在sumroots函数内部。我们不直接调用sumroots函数; fmin为我们致电sumroots。因此,要调查fmin调用sumroots的方式,让我们在函数中放置一个print语句:

def sumroots(t):
    print(type(t), t)
    c0 = t*np.exp(-t)
    ...

现在运行代码打印

<class 'numpy.ndarray'> [ 1.]

啊哈。 t是一个长度为1的NumPy数组,现在错误很容易重现:

In [164]: sumroots(np.array([1]))
...
ValueError: Input must be a rank-1 array.

此外,np.roots需要rank-1 array of polynomial coefficients,而是获取数组列表。由于NumPy数组t的长度为1,因此我们可以使用item method提取其单个值:

import numpy as np
import scipy.optimize as optimize

def sumroots(t):
    c0 = t*np.exp(-t)
    c1 = t+1
    c2 = t+2
    z = np.roots([c0, c1, c2])
    return np.abs(np.sum(z))

print(optimize.fmin(lambda t: sumroots(t.item()), 1))

打印

Optimization terminated successfully.
         Current function value: 4.857178
         Iterations: 14
         Function evaluations: 28
[ 0.61806641]