课程评价 (0)

请对课程作出评价:
0/300

学员评价

暂无精选评价
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:一个序列,给出了传递给funjac的额外的参数
  • 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]])