我有一个单一变量的函数,我想找到它的最小值,以及达到最小值的变量的值。目前,我通过以下Python脚本实现了这一点:
import numpy as np
from scipy.optimize import fmin
import math
x1=0.
y1=800.
x2=1100.
y2=-800.
v1=2000.
v2=4000.
def T(xi):
time=sqrt((x1-xi)**2+y1**2)/v1+sqrt((x2-xi)**2+y2**2)/v2
return time
fmin(T,0)
运行此脚本会产生以下回声:
import numpy as np
from scipy.optimize import fmin
import math
x1=0.
y1=800.
x2=1100.
y2=-800.
v1=2000.
v2=4000.
def T(xi):
time=sqrt((x1-xi)**2+y1**2)/v1+sqrt((x2-xi)**2+y2**2)/v2
return time
fmin(T,0)
Optimization terminated successfully.
Current function value: 0.710042
Iterations: 41
Function evaluations: 82
Out[24]: array([ 301.9498125])
因此,该函数的最小值为~0.71,并且对于约302的自变量值是可以获得的。然而,我想将这些值分配如下:
(Tmin,xmin)=fmin(T,0)
Optimization terminated successfully.
Current function value: 0.710042
Iterations: 41
Function evaluations: 82
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:UsersKurt.Peek<ipython-input-25-aec613726d59> in <module>()
----> 1 (Tmin,xmin)=fmin(T,0)
ValueError: need more than 1 value to unpack
所以我得到一个错误"ValueError:需要一个以上的值来解包"。有人知道如何防止这个错误并分配这两个输出吗?
fmin
有一个full_output=True
参数:
xopt, fopt, iter, funcalls, warnflag = fmin(T,0, full_output=True, disp=False)
print(xopt, fopt)
# (array([ 301.9498125]), 0.71004171552448025)
以下内容实现了相同的效果:在脚本的末尾,我添加了
xmin=fmin(T,0)
Tmin=T(xmin)
这产生了所需的输出:
xmin
Out[30]: array([ 301.9498125])
T(xmin)
Out[31]: array([ 0.71004172])
因此,我没有为fmin指定几个输出,而是只得到了参数,并再次使用该函数来获得最小值。