美文网首页
利用 SciPy 求解一些简单的最优化问题

利用 SciPy 求解一些简单的最优化问题

作者: bdd1b3ad7323 | 来源:发表于2017-09-12 08:55 被阅读673次

首先将优化目标写成如图一所示的形式(在 SciPy 中,要将不等约束写成大于的形式)


图一

然后导入包

import numpy as np
import scipy.optimize as opt

基本形式为

opt.minimize(目标函数, 初始值, constraints=约束条件, bounds=约束边界, jac=雅可比函数, ...)

除了前两个条件外,后面的都可以省略。
举个例子,求解如下目标函数的最小值



约束条件为



可以用如下代码
# 目标函数
def func(x, sign=1.0):
    """ Objective function """
    return sign*(2*x[0]*x[1] + 2*x[0] - x[0]**2 - 2*x[1]**2)

# 目标函数的导函数
def func_deriv(x, sign=1.0):
    """ Derivative of objective function """
    dfdx0 = sign*(-2*x[0] + 2*x[1] + 2)
    dfdx1 = sign*(2*x[0] - 4*x[1])
    return np.array([ dfdx0, dfdx1 ])

# 约束条件
cons = ({'type': 'eq',
         'fun' : lambda x: np.array([x[0]**3 - x[1]]),
         'jac' : lambda x: np.array([3.0*(x[0]**2.0), -1.0])},
        {'type': 'ineq',
         'fun' : lambda x: np.array([x[1] - 1]),
         'jac' : lambda x: np.array([0.0, 1.0])})
>>> res = minimize(func, [-1.0,1.0], args=(-1.0,), jac=func_deriv,
...                method='SLSQP', options={'disp': True})
Optimization terminated successfully.    (Exit mode 0)
            Current function value: -2.0
            Iterations: 4                       # may vary
            Function evaluations: 5
            Gradient evaluations: 4
>>> res
     fun: -2.0
     jac: array([-0., -0.])
 message: 'Optimization terminated successfully.'
    nfev: 5
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([ 2.,  1.])
>>> print(res.x)
     [ 2.  1.]

当然,在导函数未知的情况下,也可以不写,但这样可能会影响速度和精度。

# 约束条件
cons = ({'type': 'eq',
         'fun' : lambda x: np.array([x[0]**3 - x[1]]),},
        {'type': 'ineq',
         'fun' : lambda x: np.array([x[1] - 1]),})
res = opt.minimize(func, [-1.0,1.0], args=(-1.0,), 
                   method='SLSQP', options={'disp': True})

相关文章

  • 利用 SciPy 求解一些简单的最优化问题

    首先将优化目标写成如图一所示的形式(在 SciPy 中,要将不等约束写成大于的形式) 然后导入包 基本形式为 除了...

  • 10. python的优化算法包

    sciPy优化算法包sciPy中的optimize中的函数linprog使用simplex方法来求解线性规划问题,...

  • 4.3 拟合与求解optimize模块

    SciPy的optimize模块提供了许多数值优化的算法,一些经典的优化算法包括线性回归、函数极值和根的求解以及确...

  • 使用Python+SymPy 求解线性方程组

    最近几天在复习线性代数,想用Python求解线性方程组,最开始想用SciPy,但是SciPy求解方程组好像要求系数...

  • 梯度下降训练线性回归(最优化2)

    实验目的 梯度下降法是一个最优化算法,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一...

  • 线性回归(机器学习4)

    实验目的 梯度下降法是一个最优化算法,通常也称为最速下降法。最速下降法是求解无约束优化问题最简单和最古老的方法之一...

  • 简单递归分析及优化(洛谷 1028)

    本系列文章为作者原创,未经作者书面同意,不得转载! 简单递归分析及优化递归算法在求解一些问题时,代码实现非常简单,...

  • SicPy求定积分

    Sicpy求解定积分: 可以利用Scipy模块下的子模块integrate里的quad函数来求计算值。 结果:2.5

  • 05-Scipy

    一.Scipy简介 -Scipy依赖于Numpy-Scipy提供了真正的矩阵-Scipy包含的功能:最优化、线性代...

  • 使用scipy库的root和fsolve函数求解方程

    求解非线性方程 使用scipy库的 root, fsolve 函数求解非线性方程。 求解传热方程(热辐射+热传导)...

网友评论

      本文标题:利用 SciPy 求解一些简单的最优化问题

      本文链接:https://www.haomeiwen.com/subject/ysgqsxtx.html