所以我正在处理一个处理多项式根的函数,我想找到这样函数的最小点(例如通过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.
感谢您提前抽出时间和帮助。
答案 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]