10分钟
求函数最小值
求函数最小值:
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None,
hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
fun
:可调用对象,待优化的函数。最开始的参数是待优化的自变量;后面的参数由args
给出x0
:自变量的初始迭代值args
:一个元组,提供给fun
的额外的参数method
:一个字符串,指定了最优化算法。可以为:'Nelder-Mead'
、'Powell'
、'CG'
、'BFGS'
、'Newton-CG'
、'L-BFGS-B'
、'TNC'
、'COBYLA'
、'SLSQP'
、'dogleg'
、'trust-ncg'
jac
:一个可调用对象(最开始的参数是待优化的自变量;后面的参数由args
给出),雅可比矩阵。只在CG/BFGS/Newton-CG/L-BFGS-B/TNC/SLSQP/dogleg/trust-ncg
算法中需要。如果jac
是个布尔值且为True
,则会假设fun
会返回梯度;如果是个布尔值且为False
,则雅可比矩阵会被自动推断(根据数值插值)。hess/hessp
:可调用对象(最开始的参数是待优化的自变量;后面的参数由args
给出),海森矩阵。只有Newton-CG/dogleg/trust-ncg
算法中需要。二者只需要给出一个就可以,如果给出了hess
,则忽略hessp
。如果二者都未提供,则海森矩阵自动推断bounds
:一个元组的序列,给定了每个自变量的取值范围。如果某个方向不限,则指定为None
。每个范围都是一个(min,max)
元组。constrants
:一个字典或者字典的序列,给出了约束条件。只在COBYLA/SLSQP
中使用。字典的键为:type
:给出了约束类型。如'eq'
代表相等;'ineq'
代表不等fun
:给出了约束函数jac
:给出了约束函数的雅可比矩阵(只用于SLSQP
)args
:一个序列,给出了传递给fun
和jac
的额外的参数
tol
:指定收敛阈值options
:一个字典,指定额外的条件。键为:maxiter
:一个整数,指定最大迭代次数disp
:一个布尔值。如果为True
,则打印收敛信息
callback
:一个可调用对象,用于在每次迭代之后调用。调用参数为x_k
,其中x_k
为当前的参数向量
返回值:返回一个OptimizeResult
对象。其重要属性为:
x
:最优解向量success
:一个布尔值,表示是否优化成功message
:描述了迭代终止的原因
假设我们要求解最小值的函数为:f(x,y)=(1-x)²+100(y-x²)² ,则雅可比矩阵为:
则海森矩阵为:
于是有:
def fun(p):
x,y=p.tolist()#p 为数组,形状为 (2,)
return f(x,y)
def jac(p):
x,y=p.tolist()#p 为数组,形状为 (2,)
return np.array([df/dx,df/dy])
def hess(p):
x,y=p.tolist()#p 为数组,形状为 (2,)
return np.array([[ddf/dxx,ddf/dxdy],[ddf/dydx,ddf/dyy]])
学员评价