现在做个网站多少钱,外国网站快速申请qq,长春网站制作诚推源晟,广西建设工程造价信息网非线性规划是指目标函数或约束条件中包含非线性函数的规划问题#xff0c;实际就是非线性最优化问题。从线性规划到非线性规划#xff0c;不仅是数学方法的差异#xff0c;更是解决问题的思想方法的转变。非线性规划问题没有统一的通用方法#xff0c;我们在这里学习的当然…
非线性规划是指目标函数或约束条件中包含非线性函数的规划问题实际就是非线性最优化问题。从线性规划到非线性规划不仅是数学方法的差异更是解决问题的思想方法的转变。非线性规划问题没有统一的通用方法我们在这里学习的当然不是数学方法而是如何建模、如何编程求解。『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 1. 从线性规划到非线性规划
本系列的开篇我们介绍了线性规划 Linear Programming 并延伸到整数规划、0-1规划以及相对复杂的固定费用问题、选址问题。这些问题的共同特点是目标函数与约束条件都是线性函数。如果目标函数或约束条件中包含非线性函数则是非线性规划。
通常非线性问题都比线性问题复杂得多困难得多非线性规划也是这样。非线性规划没有统一的通用方法、算法来解决各种方法都有特定的应用范围和适用条件。另一方面很多非线性规划问题在实践中不能获得全局最优解只能得到局部最优解或近似最优解。
这意味着什么对于数学研究来说这也许意味着存在新的课题和挑战可以研究更有效的算法。确实如此即便线性规划问题的研究也在不断前进非线性规划问题的研究更是丰富多彩。但热闹是他们的我什么也没有。
我所想到的是数学建模学习/课程/竞赛的根本目的是什么是掌握各种算法的推演努力编程以实现还是练习分析问题建立模型的能力使用软件和工具求解问题的能力显然是后者。可是为什么培训课上老师讲的都是算法呢到了例题例程不是一带而过就是跳步骤讲。听课时津津有味下课了题目还是不会做程序还是调不通。于是…
不过到了非线性规划这一课我们发现老师也不再不厌其烦地讲算法了不知道是讲不下去还是讲不过来了 20世纪50年代H.W.Kuhn 和 A.W.Tucker 提出了非线性规划的基本定理为非线性规划奠定了理论基础 50、60 年代出现了许多解非线性规划问题的有效算法80年代后随着计算机技术的快速发展非线性规划方法取得了长足进步在信赖域法、稀疏拟牛顿法、并行计算、内点法和有限存储法等领域取得了丰硕的成果。
所以没关系的都一样——参见章北海文集。
这意味着什么呢这意味着对于学习数学建模的小白学会把问题简化为非线性规划的标准方程学会按照本文的方法使用求解工具包的函数才能求解非线性规划问题才能完赛。 欢迎关注 『Python小白的数学建模课 Youcans』 系列持续更新 Python小白的数学建模课-01.新手必读 Python小白的数学建模课-02.数据导入 Python小白的数学建模课-03.线性规划 Python小白的数学建模课-04.整数规划 Python小白的数学建模课-05.0-1规划 Python小白的数学建模课-06.固定费用问题 Python小白的数学建模课-07.选址问题 Python小白的数学建模课-09.微分方程模型 Python小白的数学建模课-10.微分方程边值问题 Python小白的数学建模课-12.非线性规划 Python小白的数学建模课-15.图论的基本概念 Python小白的数学建模课-16.最短路径算法 Python小白的数学建模课-17.条件最短路径算法 Python小白的数学建模课-18.最小生成树问题 Python小白的数学建模课-19.网络流优化问题 2. Scipy 库求解非线性规划问题
2.1 非线性规划问题的描述
首先我们回顾线性规划问题的标准形式
minf(x)∑j1ncjxjs.t.:{∑j1naijxjbi,xj≥0min\;f(x) \sum_{j1} ^n c_j x_j\\ s.t.:\begin{cases} \sum_{j1} ^n a_{ij} x_j b_i, \\ x_j \geq 0 \end{cases} minf(x)j1∑ncjxjs.t.:{∑j1naijxjbi,xj≥0
类似地可以写出非线性规划的一般形式
minf(x)s.t.:{hj(x)≤0,j1,qgi(x)0,i1,pmin\;f(x) \\ s.t.:\begin{cases} h_j(x) \leq 0, j1,q\\ g_i(x) 0, i1,p \end{cases} minf(x)s.t.:{hj(x)≤0,gi(x)0,j1,qi1,p
其中x[x1,...,xn]Tx[x_1,...,x_n]^Tx[x1,...,xn]T 为决策变量f(x)f(x)f(x) 为目标函数hj(x)h_j(x)hj(x) 和 gi(x)g_i(x)gi(x) 为约束条件。
由此可见非线性规划问题实际上就是带有约束条件的非线性函数优化问题。
按照我们的学习模式非线性规划问题的建模和求解与线性规划问题是类似的按照以下步骤进行
问题定义确定决策变量、目标函数和约束条件模型构建由问题描述建立数学方程并转化为标准形式的数学模型模型求解用标准模型的优化算法对模型求解得到优化结果。 2.2 Scipy 求解非线性规划问题的函数
Scipy 是 Python 算法库和数学工具包包括最优化、线性代数、积分、插值、特殊函数、傅里叶变换、信号和图像处理、常微分方程求解等模块。
本文推荐和讲解使用 Scipy 工具包中的 optimize 模块求解常见的非线性规划问题。
scipy.optimize 模块中提供了多个用于非线性规划问题的方法适用于不同类型的问题。 brent()单变量无约束优化问题混合使用牛顿法/二分法。 fmin()多变量无约束优化问题使用单纯性法只需要利用函数值不需要函数的导数或二阶导数。 leatsq()非线性最小二乘问题用于求解非线性最小二乘拟合问题。 minimize()约束优化问题使用拉格朗日乘子法将约束优化转化为无约束优化问题。 2.3 scipy.optimize.brent() 求解单变量无约束优化问题
非线性规划最简单的形式是一维搜索一维搜索的常用方法是函数逼近法和区间收缩法。
brent() 函数是 SciPy.optimize 模块中求解单变量无约束优化问题最小值的首选方法。这是牛顿法和二分法的混合方法既能保证稳定性又能快速收敛。
scipy.optimize.brent(func, args(), brackNone, tol1.48e-08, full_output0, maxiter500)optimize.brent() 的主要参数
*func: callable f(x,args) 目标函数 f(x)f(x)f(x)以函数形式表示可以通过 *args 传递参数args: tuple 可选项以 f(x,*args) 的形式将可变参数 p 传递给目标函数 f(x,p)f(x,p)f(x,p) 。brack: tuple 可选项搜索算法的开始区间不是指 x 的上下限
optimize.brent() 的主要返回值
**xmin: ** 返回函数达到最小值时的 x注意是局部最优不一定是全局最优。**fval: ** 返回函数的最优值默认不返回仅当 full_output 为 1 时返回。
optimize.brent() 的使用例程
from scipy.optimize import brent, fmin_ncg, minimize
import numpy as np# 1. Demo1单变量无约束优化问题(Scipy.optimize.brent)
def objf(x): # 目标函数fx x**2 - 8*np.sin(2*xnp.pi)return fxxIni -5.0
xOpt brent(objf, brack(xIni,2))
print(xIni{:.4f}\tfxIni{:.4f}.format(xIni,objf(xIni))
print(xOpt{:.4f}\tfxOpt{:.4f}.format(xOpt,objf(xOpt)))例程运行结果
xIni-5.0000 fxIni29.3522
xOpt-0.7391 fxOpt-7.41952.4 scipy.optimize.fmin() 求解多变量无约束优化问题
多变量无约束优化问题的算法很多分类方式也很多。从使用者的角度来说可以分为只使用目标函数值、使用导数梯度下降法、使用二阶导数。大体来说使用导数的算法收敛较快使用二阶导数收敛更快但是收敛快也容易陷入局部最优。
fmin() 函数是 SciPy.optimize 模块中求解多变量无约束优化问题最小值的首选方法采用下山单纯性方法。下山单纯性方法又称 Nelder-Mead 法只使用目标函数值不需要导数或二阶导数值是最重要的多维无约束优化问题数值方法之一。
scipy.optimize.fmin(func, x0, args(), xtol0.0001, ftol0.0001, maxiterNone, maxfunNone, full_output0, disp1, retall0, callbackNone, initial_simplexNone)optimize.fmin() 的主要参数
*func: callable f(x,args) 目标函数 f(x)f(x)f(x)以函数形式表示可以通过 *args 传递参数。x0: nadarray 搜索算法的初值。args: tuple 可选项以 f(x,*args) 的形式将可变参数 p 传递给目标函数 f(x,p)f(x,p)f(x,p) 。
optimize.fmin() 的主要返回值
**xopt: ** 返回最小值时的 x 值。**fopt: ** 返回最小值时的目标函数值foptfunc(xopt)。
optimize.fmin() 的使用例程
from scipy.optimize import brent, fmin, minimize
import numpy as np# 2. Demo2多变量无约束优化问题(Scipy.optimize.brent)
# Rosenbrock 测试函数
def objf2(x): # Rosenbrock benchmark functionfx sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 (1 - x[:-1]) ** 2.0)return fxxIni np.array([-2, -2])
xOpt fmin(objf2, xIni)
print(xIni{:.4f},{:.4f}\tfxIni{:.4f}.format(xIni[0],xIni[1],objf2(xIni)))
print(xOpt{:.4f},{:.4f}\tfxOpt{:.4f}.format(xOpt[0],xOpt[1],objf2(xOpt)))例程运行结果
xIni-2.0000,-2.0000 fxIni3609.0000
xOpt1.0000,1.0000 fxOpt0.00003. scipy.optimize.minimize() 求解非线性规划问题
3.1 scipy.optimize.minimize() 函数说明
minimize() 函数是 SciPy.optimize 模块中求解多变量优化问题的通用方法可以调用多种算法支持约束优化和无约束优化。
scipy.optimize.minimize(fun, x0, args(), methodNone, jacNone, hessNone, hesspNone, boundsNone, constraints(), tolNone, callbackNone, optionsNone)optimize.minimize() 的主要参数
*fun: callable f(x,args) 目标函数 f(x)f(x)f(x)以函数形式表示可以通过 *args 传递参数。x0: nadarray, shape(n,) 搜索算法的初值n 是决策变量个数。args: tuple 可选项将可变参数传递给目标函数 fun、导数函数 jac 和二阶导数函数 hess。method: str 可选项选择优化算法。默认算法为 BFGS, L-BFGS-B, SLSQP取决于问题有没有边界条件和约束条件**jac: ** 可选项梯度计算方法。可以以函数形式表示或选择 ‘2-point’, ‘3-point’, ‘cs’。该选项只能用于 CG, BFGS, Newton-CG, L-BFGS-B, TNC, SLSQP, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法。**hess: ** 可选项Hessian 矩阵计算方法。可以以函数形式表示或选择 ‘2-point’, ‘3-point’, ‘cs’。该选项只能用于 Newton-CG, dogleg, trust-ncg, trust-krylov, trust-exact 和 trust-constr 算法。**bounds: ** 可选项变量的边界条件上下限lbxub。该选项只能用于 Nelder-Mead, L-BFGS-B, TNC, SLSQP, Powell 和 trust-constr 算法。**constraints: ** 可选项定义约束条件 f(x)0。该选项只能用于 COBYLA, SLSQP 和 trust-constr 算法注意不同算法中对于约束条件的定义是不同的。
optimize.minimize() 的主要返回值
**res: ** 返回优化结果以对象方式表示主要包括优化是否成功、决策变量的优化值 xOpt。
optimize.minimize() 的优化算法选项
optimize.minimize() 的默认算法为 BFGS, L-BFGS-B, SLSQP取决于问题有没有边界条件和约束条件可以通过 “methodNone” 选项调用多种算法
无约束问题优化算法 **method‘CG’ ** 非线性共轭梯度算法只能处理无约束优化问题需要使用一阶导数函数。 **method‘BFGS’ ** BFGS 拟牛顿法只能处理无约束优化问题需要使用一阶导数函数。BFGS 算法性能良好是无约束优化问题的默认算法。 **method‘Newton-CG’ ** 截断牛顿法只能处理无约束优化问题需要使用一阶导数函数适合处理大规模问题。 **method‘dogleg’ ** dog-leg 信赖域算法需要使用梯度和 Hessian必须正定只能处理无约束优化问题 **method‘trust-ncg’ ** 采用牛顿共轭梯度信赖域算法需要使用梯度和 Hessian必须正定只能处理无约束优化问题适合大规模问题。 method‘trust-exact’ 求解无约束极小化问题的信赖域方法需要梯度和Hessian不需要正定。 method‘trust-krylov’ 使用Newton-GLTR 信赖域算法度需要使用梯度和 Hessian必须正定只能处理无约束优化问题适合中大规模问题。
边界约束条件问题优化算法 method‘Nelder-Mead’ 下山单纯性法可以处理边界约束条件决策变量的上下限只使用目标函数不使用导数函数、二阶导数鲁棒性强。 **method‘L-BFGS-B’ ** 改进的 BFGS 拟牛顿法L- 指有限内存-B 指边界约束可以处理边界约束条件需要使用一阶导数函数。L-BFGS_B 算法性能良好消耗内存量很小适合处理大规模问题是边界约束优化问题的默认算法。 method‘Powell’ 改进的共轭方向法可以处理边界约束条件决策变量的上下限。 **method‘TNC’ ** 截断牛顿法可以处理边界约束条件
带有约束条件问题优化算法 **method‘COBYLA’ ** 线性近似约束优化方法通过对目标函数和约束条件的线性逼近处理非线性问题。只使用目标函数不需要导数或二阶导数值可以处理约束条件。 **method‘SLSQP’ ** 序贯最小二乘规划算法可以处理边界约束、等式约束和不等式约束条件。SLSQP 算法性能良好是带有约束条件优化问题的默认算法。 **method‘trust-constr’ ** 信赖域算法通用的约束最优化方法适合处理大规模问题。
由于 optimize.minimize() 实际是多种算法的集成接口各种算法对于问题、约束条件和参数的定义并不完全相同对于各种算法的研究和应用已超出本文的内容有兴趣的读者可以阅读官方文档 scipy.optimize.minimize — SciPy v1.7.0 Manual https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html#scipy.optimize.minimize
我们还是针对数学建模的常用需求和小白的特点结合实际案例来学习基本应用。 3.2 scipy.optimize.minimize() 函数使用例程
编程步骤说明
导入 scipy、numpy 包定义目标函数 objf3(x)输入变量 x 表示向量返回值 fx 是目标函数的计算结果 。定义边界约束即优化变量的上下限 minimize() 默认无边界约束条件即各自变量的取值范围没有限制如果设置边界约束要对每个自变量决策变量定义其上下限注意定义边界约束的格式如果某个自变量没有上限下限则表示为 None 。 定义 x 的初值。求解最小化问题 resRosen其中目标函数 objf3 和搜索的初值点 xIni 是必需的指定优化方法和边界条件是可选项。如果优化问题是求最大值 maxFx可以通过 minFx - maxFx 的变换来实现。通过调用最小化问题的返回值 resRosen.x 得到最优点 xOpt。
Python 例程
from scipy.optimize import brent, fmin, minimize
import numpy as np# 3. Demo3多变量边界约束优化问题(Scipy.optimize.minimize)
# 定义目标函数
def objf3(x): # Rosenbrock 测试函数fx sum(100.0 * (x[1:] - x[:-1] ** 2.0) ** 2.0 (1 - x[:-1]) ** 2.0)return fx# 定义边界约束优化变量的上下限
b0 (0.0, None) # 0.0 x[0] Inf
b1 (0.0, 10.0) # 0.0 x[1] 10.0
b2 (-5.0, 100.) # -5.0 x[2] 100.0
bnds (b0, b1, b2) # 边界约束# 优化计算
xIni np.array([1., 2., 3.])
resRosen minimize(objf3, xIni, methodSLSQP, boundsbnds)
xOpt resRosen.xprint(xOpt {:.4f}, {:.4f}, {:.4f}.format(xOpt[0],xOpt[1],xOpt[2]))
print(min f(x) {:.4f}.format(objf3(xOpt)))例程运行结果
xOpt 1.0000, 1.0000, 1.0000
min f(x) 0.00004. 约束非线性规划问题实例
4.1 非线性规划问题的数学模型
minf(x)a∗x12b∗x22c∗x32ds.t.:{x12−x2x32≥0x1x22x33≤20−x1−x2220x22x323x1,x2,x3≥0min\;f(x) a*x_1^2 b*x_2^2 c*x_3^2 d\\ s.t.:\begin{cases} x_1^2 - x_2 x_3^2 \geq 0\\ x_1 x_2^2 x_3^3 \leq 20\\ -x_1 - x_2^2 2 0\\ x_2 2x_3^2 3\\ x_1, x_2, x_3 \geq 0 \end{cases} minf(x)a∗x12b∗x22c∗x32ds.t.:⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2x32≥0x1x22x33≤20−x1−x2220x22x323x1,x2,x3≥0
由于 minimize() 函数中对约束条件的形式定义为 f(x)0因此要将问题的数学模型转换为标准形式 minf(x)a∗x12b∗x22c∗x32ds.t.:{x12−x2x32≥0−(x1x22x33−20)≥0−x1−x2220x22x32−30x1,x2,x3≥0min\;f(x) a*x_1^2 b*x_2^2 c*x_3^2 d\\ s.t.:\begin{cases} x_1^2 - x_2 x_3^2 \geq 0 \\ -(x_1 x_2^2 x_3^3 - 20) \geq 0 \\ -x_1 - x_2^2 2 0 \\ x_2 2x_3^2 - 3 0 \\ x_1, x_2, x_3 \geq 0 \end{cases} minf(x)a∗x12b∗x22c∗x32ds.t.:⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2x32≥0−(x1x22x33−20)≥0−x1−x2220x22x32−30x1,x2,x3≥0 4.2 Python 例程 1
程序说明
在本例程中目标函数中的参数 a, b, c, d 在子程序中直接赋值这种实现方式最简单定义边界约束即优化变量的上下限与 3.2 中的例程相同用 minimize() 函数中的选项 boundsbnds 进行定义。定义约束条件 本案例有 4个约束条件2个等式约束、2个不等式约束上节中已写成标准形式本例程将每个约束条件作为一个子函数定义minimize() 函数对约束条件按照字典格式 {‘type’: ‘ineq’, ‘fun’: functionname} 进行定义。‘type’ 的键值可选 ‘eq’ 和 ‘ineq’分别表示的是约束和不等式约束functionname是定义约束条件的函数名。 求解最小化问题 res其中目标函数 objF4 和搜索的初值点 x0 是必需的指定优化方法和边界条件、约束条件是可选项。通过调用最小化问题的返回值可以得到优化是否成功的说明res.message、自变量的优化值res.x和目标函数的优化值res.fun。
Python 例程
from scipy.optimize import brent, fmin, minimize
import numpy as np# 4. Demo4约束非线性规划问题(Scipy.optimize.minimize)
def objF4(x): # 定义目标函数a, b, c, d 1, 2, 3, 8fx a*x[0]**2 b*x[1]**2 c*x[2]**2 dreturn fx# 定义约束条件函数
def constraint1(x): # 不等式约束 f(x)0return x[0]** 2 - x[1] x[2]**2
def constraint2(x): # 不等式约束 转换为标准形式return -(x[0] x[1]**2 x[2]**3 - 20)
def constraint3(x): # 等式约束return -x[0] - x[1]**2 2
def constraint4(x): # 等式约束return x[1] 2*x[2]**2 -3# 定义边界约束
b (0.0, None)
bnds (b, b, b)# 定义约束条件
con1 {type: ineq, fun: constraint1}
con2 {type: ineq, fun: constraint2}
con3 {type: eq, fun: constraint3}
con4 {type: eq, fun: constraint4}
cons ([con1, con2, con3,con4]) # 3个约束条件# 求解优化问题
x0 np.array([1., 2., 3.]) # 定义搜索的初值
res minimize(objF4, x0, methodSLSQP, boundsbnds, constraintscons)print(Optimization problem (res):\t{}.format(res.message)) # 优化是否成功
print(xOpt {}.format(res.x)) # 自变量的优化值
print(min f(x) {:.4f}.format(res.fun)) # 目标函数的优化值例程 1 运行结果
Optimization problem (res): Optimization terminated successfully
xOpt [0.6743061 1.15138781 0.96140839]
min f(x) 13.87904.3 Python 例程 2
程序说明 本例程的问题与 4.2 中的例程 1 是相同的结果也相同但编程实现的方法进行了改进 本例程中目标函数中的参数 a, b, c, d 在主程序中赋值通过 args 把参数传递到子程序这种实现方式使参数赋值更为灵活特别是适用于可变参数的问题注意目标函数的定义不是 def objF5(x,args)而是 def objF5(args)要特别注意目标函数的定义和实现方法。 定义约束条件 本案例有 4 个约束条件2个等式约束、2个不等式约束上节中已写成标准形式本例程将 4 个约束条件放在一个子函数中定义是程序更加简洁。注意每个约束条件仍然按照字典格式 {‘type’: ‘ineq’, ‘fun’: functionname} 进行定义但 functionname 并不是函数名而是一个 lambda 匿名函数。 通过调用最小化问题的返回值可以得到优化是否成功的说明res.message、自变量的优化值res.x和目标函数的优化值res.fun。
Python 例程 2
from scipy.optimize import brent, fmin, minimize
import numpy as np# 5. Demo5约束非线性规划问题(Scipy.optimize.minimize)
def objF5(args): # 定义目标函数a,b,c,d argsfx lambda x: a*x[0]**2 b*x[1]**2 c*x[2]**2 dreturn fxdef constraint1(): # 定义约束条件函数cons ({type: ineq, fun: lambda x: (x[0]**2 - x[1] x[2]**2)}, # 不等式约束 f(x)0{type: ineq, fun: lambda x: -(x[0] x[1]**2 x[2]**3 - 20)}, # 不等式约束 转换为标准形式{type: eq, fun: lambda x: (-x[0] - x[1]**2 2)}, # 等式约束{type: eq, fun: lambda x: (x[1] 2*x[2]**2 - 3)}) # 等式约束return cons# 定义边界约束
b (0.0, None)
bnds (b, b, b)
# 定义约束条件
cons constraint1()
args1 (1,2,3,8) # 定义目标函数中的参数
# 求解优化问题
x0 np.array([1., 2., 3.]) # 定义搜索的初值
res1 minimize(objF5(args1), x0, methodSLSQP, boundsbnds, constraintscons)print(Optimization problem (res1):\t{}.format(res1.message)) # 优化是否成功
print(xOpt {}.format(res1.x)) # 自变量的优化值
print(min f(x) {:.4f}.format(res1.fun)) # 目标函数的优化值例程 2 运行结果
Optimization problem (res1): Optimization terminated successfully
xOpt [0.6743061 1.15138781 0.96140839]
min f(x) 13.87904.4 Python 例程 3
程序说明
本例程的问题与 4.3 中的例程 2 是相同的结果也相同但编程实现的方法进行了改进本例程中约束条件中的参数在主程序中赋值通过 args 把参数传递到约束条件定义的子程序这种实现方式使参数赋值更为灵活特别是适用于可变参数的问题。本例程中将边界约束条件即自变量的取值范围作为不等式约束条件处理不另作边界条件设置。通过调用最小化问题的返回值可以得到优化是否成功的说明res.message、自变量的优化值res.x和目标函数的优化值res.fun。
Python 例程 3
from scipy.optimize import brent, fmin, minimize
import numpy as np# 6. Demo6约束非线性规划问题(Scipy.optimize.minimize)
def objF6(args): # 定义目标函数a,b,c,d argsfx lambda x: a*x[0]**2 b*x[1]**2 c*x[2]**2 dreturn fxdef constraint2(args):xmin0, xmin1, xmin2 argscons ({type: ineq, fun: lambda x: (x[0]**2 - x[1] x[2]**2)}, # 不等式约束 f(x)0{type: ineq, fun: lambda x: -(x[0] x[1]**2 x[2]**3 - 20)}, # 不等式约束 转换为标准形式{type: eq, fun: lambda x: (-x[0] - x[1]**2 2)}, # 等式约束{type: eq, fun: lambda x: (x[1] 2*x[2]**2 - 3)}, # 等式约束{type: ineq, fun: lambda x: (x[0] - xmin0)}, # x0 xmin0{type: ineq, fun: lambda x: (x[1] - xmin1)}, # x1 xmin1{type: ineq, fun: lambda x: (x[2] - xmin2)}) # x2 xmin2return cons# 求解优化问题
args1 (1,2,3,8) # 定义目标函数中的参数
args2 (0.0, 0.0, 0.0) # xmin0, xmin1, xmin2
cons2 constraint2(args2)x0 np.array([1., 2., 3.]) # 定义搜索的初值
res2 minimize(objF6(args1), x0, methodSLSQP, constraintscons2)print(Optimization problem (res2):\t{}.format(res2.message)) # 优化是否成功
print(xOpt {}.format(res2.x)) # 自变量的优化值
print(min f(x) {:.4f}.format(res2.fun)) # 目标函数的优化值例程 3 运行结果
Optimization problem (res2): Optimization terminated successfully
xOpt [0.6743061 1.15138781 0.96140839]
min f(x) 13.87905. 小结
Scipy 工具包中的 minimize() 函数集成了多种求解线性规划问题的算法可以处理边界条件和等式、不等式约束对于常见的非线性规划问题都能获得较好的解。
minimize() 函数对于等式约束、不等式约束条件的编程定义了标准形式和输入格式通过对比 4.24.4 的 3个例程可以帮助读者理解有关的格式要求。
【本节完】 版权说明
欢迎关注『Python小白的数学建模课 Youcans』 原创作品
CSDN 原创作品转载必须标注原文链接https://blog.csdn.net/youcans/article/details/118396836。
Copyright 2021 Youcans, XUPT
Crated2021-06-30 欢迎关注 『Python小白的数学建模课 Youcans』 系列持续更新 Python小白的数学建模课-01.新手必读 Python小白的数学建模课-02.数据导入 Python小白的数学建模课-03.线性规划 Python小白的数学建模课-04.整数规划 Python小白的数学建模课-05.0-1规划 Python小白的数学建模课-06.固定费用问题 Python小白的数学建模课-07.选址问题 Python小白的数学建模课-09.微分方程模型 Python小白的数学建模课-10.微分方程边值问题 Python小白的数学建模课-12.非线性规划 Python小白的数学建模课-15.图论的基本概念 Python小白的数学建模课-16.最短路径算法 Python小白的数学建模课-17.条件最短路径算法 Python小白的数学建模课-18.最小生成树问题 Python小白的数学建模课-19.网络流优化问题 Python小白的数学建模课-A1.国赛赛题类型分析 Python小白的数学建模课-A2.2021年数维杯C题探讨 Python小白的数学建模课-A3.12个新冠疫情数模竞赛赛题及短评 Python小白的数学建模课-B2. 新冠疫情 SI模型 Python小白的数学建模课-B3. 新冠疫情 SIS模型 Python小白的数学建模课-B4. 新冠疫情 SIR模型 Python小白的数学建模课-B5. 新冠疫情 SEIR模型 Python小白的数学建模课-B6. 新冠疫情 SEIR改进模型 Python数模笔记-PuLP库 Python数模笔记-StatsModels统计回归 Python数模笔记-Sklearn Python数模笔记-NetworkX Python数模笔记-模拟退火算法