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]])
学员评价