51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Python 非线性规划 scipy.optimize.minimize

在 python 里用非线性规划求极值,最常用的就是 scipy.optimize.minimize(),本文记录相关内容。

简介 {#简介}

scipy.optimize.minimize() 是 Python 计算库 Scipy 的一个功能,用于求解函数在某一初始值附近的极值,获取 一个或多个变量的标量函数的最小化结果 ( Minimization of scalar function of one or more variables. )。

注意:**这个函数常用于非线性规划的极值求解,只给出一个极值,并且不保证全局最优

函数定义 {#函数定义}

函数格式 {#函数格式}

参数含义 {#参数含义}

| 参数 | 类型 | 含义 | |-----------------|-----------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------| | fun | callable | 要最小化的目标函数。 fun(x, *args) -> float ​ 其中 $x$ 是一个带有形状($n$)的一维数组,$args$ 是完全指定函数所需的固定参数的元组。 | | x0 | ndarray, shape (n,) | 初始猜测: 大小为($n$)的实元素的数组,其中 $n$ 是变量的数目。 | | args | tuple, optional | 额外的参数传递给目标函数及其导数(fun、 jac 和 hess 函数)。 | | method | str or callable, optional | 求解器的类型,如果没有给出,则根据问题是否有约束或边界,选择 BFGS、 L-BFGS-B、 SLSQP 中的一个。 | | jac | {callable, '2-point', '3-point', 'cs', bool}, optional | 梯度向量的计算方法。只适用于 CG,BFGS,Newton-CG,L-BFGS-B,TNC,SLSQP,dogleg,trust-ncg,trust-krylov,trust-fine 和 trust-Constr。如果它是可调用的,那么它应该是一个返回梯度向量的函数 | | hess | {callable, '2-point', '3-point', 'cs', HessianUpdateStrategy}, optional | 计算 Hessian 矩阵的一种方法。只适用于 Newton-CG,dogleg,trust-ncg,trust-krylov,trust-fine 和 trust-constr. 。如果它是可调用的,它应该返回黑森矩阵 | | hessp | callable, optional | 目标函数的 Hessian 乘以任意向量 p。只适用于 Newton-CG,trust-ncg,trust-krylov,trust-Constr。只需要一个 Hessp 或者 Hess 就够了。如果提供 hess,那么 hessp 将被忽略。Hessp 必须计算 Hessian 乘以任意向量。 | | bounds | sequence or Bounds, optional | Nelder-Mead,L-BFGS-B,TNC,SLSQP,Powell 和 trust-conr 方法的变量界。 | | constraints | {Constraint, dict} or List of {Constraint, dict}, optional | 约束条件。仅适用于 COBYLA、 SLSQP 和 trust-Constr。 | | tol | float, optional | 终止公差。 指定 tol 后,所选的最小化算法会将一些相关的特定于求解器的公差设置为 tol。 要进行详细控制,请使用特定于求解器的选项。 | | options | dict, optional | 求解器选项字典。除 TNC 外的所有方法都接受以下通用选项: maxiter **int:**要执行的最大迭代次数。 根据方法,每次迭代可能使用多个函数评估。 disp bool: 设置为 True 可打印消息。 | | callback | callable, optional | 在每次迭代之后调用。对于" trust-conr",它是一个带有签名的可调用函数 | | res | Optimize Result | 优化结果表示为 OptimizeResult 对象。 重要的属性有: x 解决方案数组 success 一个布尔标志,指示优化器是否成功退出,以及描述终止原因的消息。 有关其他属性的说明,请参阅 OptimizeResult。 |

method 支持的算法 {#method-支持的算法}

| 求解器 | 中文名 | jac要求 | hess要求 | 边界约束 | 条件约束 | 求解规模 | |--------------|------------|-------|--------|------|------|------| | Nelder-Mead | 单纯形法 | 无 | 无 | 可选 | 无 | 小 | | Powell | 鲍威尔法 | 无 | 无 | 可选 | 无 | 小 | | CG | 共轭梯度法 | 可选 | 无 | 无 | 无 | 中小 | | BFGS | 拟牛顿法 | 可选 | 无 | 无 | 无 | 中大 | | L-BFGS-B | 限制内存BFGS法 | 可选 | 无 | 可选 | 无 | 中大 | | TNC | 截断牛顿法 | 可选 | 无 | 可选 | 无 | 中大 | | COBYLA | 线性近似法 | 无 | 无 | 无 | 可选 | 中大 | | SLSQP | 序列最小二乘法 | 可选 | 无 | 可选 | 可选 | 中大 | | trust-constr | 信赖域算法 | 无 | 可选 | 可选 | 可选 | 中大 | | Newton-CG | 牛顿共轭梯度法 | 必须 | 可选 | 无 | 无 | 大 | | dogleg | 信赖域狗腿法 | 必须 | 可选 | 无 | 无 | 中大 | | trust-ncg | 牛顿共轭梯度信赖域法 | 必须 | 可选 | 无 | 无 | 大 | | trust-exact | 高精度信赖域法 | 必须 | 可选 | 无 | 无 | 大 | | trust-krylov | 子空间迭代信赖域法 | 必须 | 可选 | 无 | 无 | 大 |

注:

jac可选,代表jac有五种选项{callable, 2-point, 3-point, cs, bool},可任选其一。默认为None,即采用有限差分近似计算;2/3-point 或者 cs 采用2点、3点、中心差分近似计算;若为True,则目标函数需返回目标函数值和jac向量;若为callable,则提供jac计算函数。

hess 也有五种选项{callable, 2-point, 3-point, cs, HessianUpdateStrategy},但要注意,只有jac提供计算函数,hess才可以使用差分近似,我想这也是避免因差分二次近似导致数值耗散的缘故。

constraints {#constraints}
  • COBYLASLSQP 的约束定义为字典列表:

| 参数 | 类型 | 含义 | |----------|------------------------|-------------------------------------| | type | str | eq 表示等式约束,ineq 表示不等式约束(函数结果非负)。 | | fun | callable | 定义约束的函数。 | | jac | callable, optional | fun 的 Jacobian 矩阵(对于 SLSQP) | | args | sequence, optional | 要传递给函数和 Jacobian 的额外参数。 |

COBYLA 只支持不等式约束。

使用示例 {#使用示例}

例一 {#例一}

  • 计算 1/x+x 的最小值
  • 输出:

事实上 $1/x+x$ 是没有最小值的,这里能求解是因为在正数范围内 $x=1$ 时取到极小值,负数范围内没有最小值,因此如果初始值选择负数则无法找到极小值:

例二 {#例二}

  • 计算 $ (2+x_1)/(1+x_2) - 3x_1+4x_3 $ 的最小值 $x_1,x_2,x_3$ 的范围都在 0.1到0.9 之间

带约束的优化问题需要用到约束条件

  • 输出

例三 {#例三}

  • 最小化函数: $ \log _{2}\left(1+\frac{x[0] 2}{3}\right)+\log _{2}\left(1+\frac{x[1] 3}{4}\right) $
  • 约束条件:$ \log 2\left(1+\frac{x[0] 2}{5}\right) \geq 5 , \log 2\left(1+\frac{x[1] 6}{4}\right) \geq 5 $
  • 输出:

例四 {#例四}

  • 最小化 $8xyz$
  • 约束条件 : $ x ^2+ y ^2+z ^2=1$ ,$x,y,z>0$
  • 输出:

参考资料 {#参考资料}



文章链接:
https://www.zywvvd.com/notes/coding/python/scipy-optimize/scipy-optimize-minimize/

赞(0)
未经允许不得转载:工具盒子 » Python 非线性规划 scipy.optimize.minimize