Python中scipy.optimize求解有无约束的最优化算法举例(附代码)

目录

算法需要输入的参数

算法输出的优化结果

优化算法应用举例

优化算法举例代码 

优化算法输出结果 

其他优化问题举例


最优化求解问题标准格式如下: 

标准形式如下:
目标函数:minimize f(x) ……

约束条件subject to:
g_i(x) >= 0,  i = 1,...,m

h_j(x)  = 0,  j = 1,...,p

Python中scipy库有很多包,其中一个就是scipy.optimize.minimize求解有无约束的最小化问题。

原文请参考:scipy.optimize.minimizehttps://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize

Python中scipy.optimize.minimize具体参数如下:

scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None,             
                         hessp=None, bounds=None, constraints=(), tol=None, 
                         callback=None, options=None)[source]

算法需要输入的参数:

  • fun:可调用的目标函数;
  • x0:函数的初始解,是N 维数组对象ndarray;
  • args:可选,传递给目标函数和其偏导的额外参数,如(雅可比矩阵、海塞矩阵),是元组;
  • method : 可选,求解问题的方法,应该是如下表格中的其中一个。如果不指定,根据约束条件和取值范围默认选择BFGS, L-BFGS-B, SLSQP方法;
最优化求解方法
求解方法解释
Nelder-Mead求解非线性、导函数未知的最值问题
Powell鲍威尔共轭方向法
CG共轭梯度法
BFGS变尺度法、拟牛顿方向法
Newton-CG牛顿-共轭方向法
L-BFGS-B改进的BFGS法
TNC截断牛顿法

COBYLA
线性逼近法
SLSQP序列最小二乘法
dogleg信赖域算法(狗腿法)
trust-ncg信赖域的牛顿共轭梯度法
  • jac:可选目标函数的雅可比矩阵(目标函数的一阶偏导)。这些方法会用到: CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg;
  • hess, hessp : 可选,海塞矩阵(目标函数的二阶偏导),这些方法会用到Newton-CG, dogleg, trust-ncg;
  • bounds:可选,变量约束,这些方法会用到:L-BFGS-B, TNC and SLSQP
  • constraints:可选,约束条件,字典或序列类型,每个约束有以下三个关键字:
type : str
Constraint type: '='号约束:'eq' ,'>='号约束:'ineq'.
COBYLA算法仅支持ineq

fun : callable
定义条件的函数

jac : callable, optional
约束条件的梯度函数(only for SLSQP).

args : sequence, optional
传递给目标函数或雅可比矩阵的额外的参数
  • tol : 可选,float型,终止条件的忍耐度,可以理解为精度。
  • options :可选,字典类型,算法的其他选项。具体如下:
maxiter : int
算法的最大迭代次数

disp : bool
disp=True时打印收敛信息

算法输出的优化结果:

  • res : OptimizeResult
具体信息如下:(看下后面的代码例子会懂)
x the solution array, success a Boolean flag indicating if the optimizer 
exited successfully and message which describes the cause of the termination. 

优化算法应用举例:

最小化问题,含有等式目标约束:

优化算法举例代码: 

import numpy as np
from scipy.optimize import minimize

# 定义目标函数
def func(x, sign=1.0):
    # scipy.minimize默认求最小,求max时只需要sign*(-1),跟下面的args对应
    return sign * (x[0] ** 2 + x[1] ** 2 + x[2] ** 2)
    # return sign * (np.power(x[0], 2) + np.power(x[1], 2) + np.power(x[2], 2))

# 定义目标函数的梯度
def func_deriv(x, sign=1):
    jac_x0 = sign * (2 * x[0])
    jac_x1 = sign * (2 * x[1])
    jac_x2 = sign * (2 * x[2])
    return np.array([jac_x0, jac_x1, jac_x2])

# 定义约束条件
# constraints are defined as a sequence of dictionaries, with keys type, fun and jac.
cons = (
    {'type': 'eq',
     'fun': lambda x: np.array([x[0] + 2 * x[1] - x[2] - 4]),
     'jac': lambda x: np.array([1, 2, -1])},

    {'type': 'eq',
     'fun': lambda x: np.array([x[0] - x[1] - x[2] + 2]),
     'jac': lambda x: np.array([1, -1, -1])}
    )

# 定义初始解x0
x0 = np.array([-1.0, 1.0, 1.0])

# 使用SLSQP算法求解
res = minimize(func, x0 , args=(1,), jac=func_deriv, method='SLSQP', options={'disp': True},constraints=cons)
# args是传递给目标函数和偏导的参数,此例中为1,求min问题。args=-1时是求解max问题
print(res.x) 

优化算法输出结果: 

Optimization terminated successfully.    (Exit mode 0)
            Current function value: 4.000000000000002
            Iterations: 2
            Function evaluations: 2
            Gradient evaluations: 2
[-2.22044605e-16  2.00000000e+00 -6.66133815e-16]

即函数输出最优值为:4.00,最优解为[0,2,0]。

其他优化问题举例

Optimization (scipy.optimize)https://docs.scipy.org/doc/scipy-0.18.1/reference/tutorial/optimize.html#constrained-minimization-of-multivariate-scalar-functions-minimize

### 回答1: Python scipy.optimizePython科学计算库scipy的一个模块,它提供了许多用于最小化或寻找方程根的优化算法。这些算法包括无约束和约束的优化、全局优化、最小二乘拟合以及曲线拟合等。它们可用于处理各种问题,如最小化成本、最大化效益、最大化收益等。scipy.optimize模块还支持并行计算和大规模优化问题的求解。无论是初学者还是专业人士,都可以使用Python scipy.optimize来解决他们的优化问题。 ### 回答2: PythonScipy.optimize是一个优化算法库,用于解决各种数学优化问题。这个库包含了一系列优化算法,可以帮助用户优化一些目标函数。 Scipy.optimize包含了许多优化算法,其的一些算法包括最小二乘法、有约束优化、全局优化、非线性方程求解、拟合等。由于优化问题的多样性,使用不同的算法可能会得到不同的结果,因此在选择算法时需要理解问题本身,并进行选择。 优化算法的核心是寻找一个局部最优解或全局最优解。这一过程是通过迭代方法来完成的,迭代过程的每个步骤都可以用优化算法的不同方法来处理。不同的算法对优化目标函数的形式和要求有不同的处理方式。使用Scipy.optimize库可以方便地调用这些算法,这些算法经过优化和测试,是最常用的算法。 除了包含不同类型的优化算法Scipy.optimize还集成了许多其他的辅助工具,例如最优解计算、目标函数的梯度和海森矩阵计算等。 总体而言,Scipy.optimize是一个功能强大的优化算法库,它可以处理各种数学优化问题,包括有约束和无约束问题,凸和非凸问题等等。此外,Scipy.optimize库还提供了许多实用的函数,例如求解目标函数的一阶和二阶导数的函数以及许多常用优化算法,使优化过程更高效、更方便。因此,Scipy.optimizepython优化问题求解的重要库之一。 ### 回答3: PythonScipy.optimize模块是一个专门用于求解优化问题的工具包。该模块提供了多种优化算法来最小化或最大化目标函数,并且能够针对不同类型的问题进行使用。 Scipy.optimize模块包含了多个优化算法,其大多数算法都用于非线性优化问题。这些算法包括:Nelder-Mead、Powell、CG、BFGS、L-BFGS-B和TNC等。每个算法都有自己的优缺点,并且特别适合不同类型的优化问题。 Scipy.optimize模块的另一个功能是提供了一些特定问题的专用算法。其包括线性规划、非线性规划、二次规划、整数规划、全局优化等算法。这里有一个例子:线性规划可以用于解决最小化或最大化线性方程组的问题。 在使用Scipy.optimize模块时,需要指定目标函数和隐式约束条件,并且还需要传递初始点以作为算法开始优化的初始值。例如: from scipy.optimize import minimize import numpy as np #定义目标函数 def f(x): return np.sum(x**2) #定义约束条件 #x.sum() - 1 = 0, x_i >= 0, for i=1,...,n cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1.0}, {'type': 'ineq', 'fun': lambda x: x }) #初始点 x0 = [0.25, 0.25, 0.25, 0.25] #最小化方法 res = minimize(f, x0, method='SLSQP', constraints=cons) 在这个例子,我们定义了一个目标函数f(x) = x1^2 + x2^2 + x3^2 + x4^2,并且只有一个约束条件x1 + x2 + x3 + x4 = 1和所有变量都必须大于等于0。使用Scipy.optimize模块的minimize函数进行优化,以最小化目标函数,这里使用了SLSQP算法。函数的返回值是最优点及其函数值。 总之,PythonScipy.optimize模块是一个广泛使用的工具包,可以用于求解多种类型的优化问题。它与其他Python的科学计算工具(如Numpy和Matplotlib等)很好地集成在一起,可以在整个Python科学计算生态系统广泛使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值