通过scipy.optimize.fmin从numpy.root发送的错误
因此,我正在使用一个处理多项式根的函数,我想找到这类函数的最小点(例如通过fmin): 因此,理想情况下,我应该能够通过上述代码的最后一行输入此函数,但它会返回一个错误:通过scipy.optimize.fmin从numpy.root发送的错误,numpy,scipy,Numpy,Scipy,因此,我正在使用一个处理多项式根的函数,我想找到这类函数的最小点(例如通过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\pol
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.
文件“”,第5行,在sumroots中
z=np.根([c0,c1,c2])
文件“C:\Users\user\Anaconda3\lib\site packages\numpy\lib\polynomy.py”,第209行,根目录
raise VALUERROR(“输入必须是秩1数组”)
ValueError:输入必须是秩1数组。
提前感谢您的时间和帮助。错误消息
ValueError: Input must be a rank-1 array.
提示我们正在向一个函数传递一个值,该函数需要一个秩1数组,但
他得到了别的东西。回溯错误消息显示问题已解决
在sumrots
函数中发生。我们不直接调用sumroots
函数fmin
为我们调用sumroots
。因此,为了研究fmin
如何调用sumroots
,让我们在函数中放入一条print语句:
def sumroots(t):
print(type(t), t)
c0 = t*np.exp(-t)
...
现在运行代码打印
<class 'numpy.ndarray'> [ 1.]
而且,np.roots
需要一个数组,而不是数组列表。由于NumPy数组t
的长度为1,因此我们可以使用其:
印刷品
Optimization terminated successfully.
Current function value: 4.857178
Iterations: 14
Function evaluations: 28
[ 0.61806641]
非常感谢您的回复,它确实有效。但是,通过修改t=t.item(),如果t是一个float(AttributeError:“float”对象没有属性“item”),则函数现在无法生成结果。有没有更简单的方法来处理这个问题,或者我必须忍受设置一个逻辑门?您可以保持
sumrots
原样,并将lambda t:sumrots(t.item())
传递到optimize.fmin
。我已经修改了上面的帖子来表达我的意思。
In [164]: sumroots(np.array([1]))
...
ValueError: Input must be a rank-1 array.
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]