【数学建模笔记 03】数学建模的非线性规划

03. 非线性规划

定义

如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。

非线性规划目前还没有适于各种问题的一般算法。

非线性规划模型描述如:
min ⁡ f ( x ) , \min f(x), minf(x),

s . t . { g i ( x ) ≤ 0 , i = 1 , 2 , … , m , h j ( x ) = 0 , j = 1 , 2 , … , l , s.t.\left\{\begin{aligned} &g_i(x)\le0,i=1,2,\dots,m,\\ &h_j(x)=0,j=1,2,\dots,l, \end{aligned}\right. s.t.{gi(x)0,i=1,2,,m,hj(x)=0,j=1,2,,l,

其中 x = [ x 1 , x 2 , … , x n ] T x=[x_1,x_2,\dots,x_n]^T x=[x1,x2,,xn]T,而 f , g i , h j f,g_i,h_j f,gi,hj 都是实值函数。

一般非线性规划只能得到局部最优解,不能保证是全局最优解。

无约束非线性规划求解

f ( x ) f(x) f(x) 具有连续的一阶偏导数,且 x ∗ x^* x​ 是无约束问题的局部极小点,则
∇ f ( x ∗ ) = 0 \nabla f(x^*)=0 f(x)=0
其中 ∇ f ( x ) \nabla f(x) f(x) 表示 f ( x ) f(x) f(x) 的梯度。

f ( x ) f(x) f(x) 具有对各个变量的二阶偏导数,称矩阵
( ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 … ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 … ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 … ∂ 2 f ∂ x n 2 ) \begin{pmatrix} \frac{\partial^2f}{\partial x_1^2} & \frac{\partial^2f}{\partial x_1\partial x_2} & \dots & \frac{\partial^2f}{\partial x_1\partial x_n} \\ \frac{\partial^2f}{\partial x_2\partial x_1} & \frac{\partial^2f}{\partial x_2^2} & \dots & \frac{\partial^2f}{\partial x_2\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2f}{\partial x_n\partial x_1} & \frac{\partial^2f}{\partial x_n\partial x_2} & \dots & \frac{\partial^2f}{\partial x_n^2} \\ \end{pmatrix} x122fx2x12fxnx12fx1x22fx222fxnx22fx1xn2fx2xn2fxn22f
为函数的黑塞矩阵,记 ∇ 2 f ( x ) \nabla^2f(x) 2f(x)

因此,只要找到 x ∗ x^* x,满足 ∇ f ( x ∗ ) = 0 \nabla f(x^*)=0 f(x)=0,且 ∇ 2 f ( x ∗ ) \nabla^2f(x^*) 2f(x) 为正定矩阵,则 x ∗ x^* x 为无约束优化问题的局部最优解。

找到 x ∗ x^* x 的具体方法有最速降线法、牛顿法等。

有约束非线性规划求解

有等式约束非线性规划的 Lagrange 乘数法

对于只有等式约束的非线性规划问题:
min ⁡ f ( x ) , \min f(x), minf(x),

s . t . { h j ( x ) = 0 , j = 1 , 2 , … , l , x ∈ R n . s.t.\left\{\begin{aligned} & h_j(x)=0,j=1,2,\dots,l,\\ & x\in R^n. \end{aligned}\right. s.t.{hj(x)=0,j=1,2,,l,xRn.

设函数 f , h j ( j = 1 , 2 , … , l ) f,h_j(j=1,2,\dots,l) f,hj(j=1,2,,l) 在可行点 x ∗ x^* x 的某个邻域 N ( x ∗ , ϵ ) N(x^*,\epsilon) N(x,ϵ)​ 内可微,向量组 ∇ h j ( x ∗ ) \nabla h_j(x^*) hj(x) 线性无关,令
L ( x , λ ) = f ( x ) − λ T H ( x ) , L(x,\lambda)=f(x)-\lambda^TH(x), L(x,λ)=f(x)λTH(x),
其中
λ = [ λ 1 , λ 2 , … , λ l ] T \lambda=[\lambda_1,\lambda_2,\dots,\lambda_l]^T λ=[λ1,λ2,,λl]T

H ( x ) = [ h 1 ( x ) , h 2 ( x ) , … , h l ( x ) ] T H(x)=[h_1(x),h_2(x),\dots,h_l(x)]^T H(x)=[h1(x),h2(x),,hl(x)]T

x ∗ x^* x 是局部最优解,则有
λ ∗ = [ λ 1 ∗ , λ 2 ∗ , … , λ l ∗ ] T \lambda^*=[\lambda_1^*,\lambda_2^*,\dots,\lambda_l^*]^T λ=[λ1,λ2,,λl]T
使得 ∇ L ( x ∗ , λ ∗ ) = 0 \nabla L(x^*,\lambda^*)=0 L(x,λ)=0,即
∇ f ( x ∗ ) − ∑ j = 1 l λ j ∗ ∇ h j ( x ∗ ) = 0 \nabla f(x^*)-\sum_{j=1}^l\lambda_j^*\nabla h_j(x^*)=0 f(x)j=1lλjhj(x)=0
从而将有约束条件转化为无约束条件。

有约束非线性规划的罚函数法

构造带参数的所谓增广目标函数,从而把有约束非线性规划问题转化为一系列无约束非线性规划问题。

增广目标函数通常由两部分组成:

  • 原问题的目标函数;
  • 约束条件构造出的惩罚项。

对于外点法,增广目标函数形式如下:
T ( x , M ) = f ( x ) + M ∑ i = 1 m [ max ⁡ { 0 , g i ( x ) } ] + M ∑ j = 1 l [ h j ( x ) ] 2 T(x,M)=f(x)+M\sum_{i=1}^m[\max\{0,g_i(x)\}]+M\sum_{j=1}^l[h_j(x)]^2 T(x,M)=f(x)+Mi=1m[max{0,gi(x)}]+Mj=1l[hj(x)]2
其中 M 是一个较大的正数。

从而转化为无约束问题:
min ⁡ T ( x , M ) , x ∈ R n \min T(x,M),x\in R^n minT(x,M),xRn
罚函数法的计算精度可能较差。

Python 代码

利用 scipy、cvxopt、cvxpy 包,可以实现非线性规划求解。

scipy 求解

对于问题:
min ⁡ 2 + x 1 1 + x 2 − 3 x 1 + 4 x 3 , \min \frac{2+x_1}{1+x_2}-3x_1+4x_3, min1+x22+x13x1+4x3,

s . t . 0.1 ≤ x i ≤ 0.9 , i = 1 , 2 , 3 s.t.\quad0.1\le x_i\le0.9,i=1,2,3 s.t.0.1xi0.9,i=1,2,3

使用 scipy 求解,代码如下:

# %%

import numpy as np
from scipy.optimize import minimize

# %%

def obj(x):
	x1,x2,x3 = x
	return (2+x1)/(1+x2)-3*x1+4*x3

bound = [(.1, .9) for _ in range(3)]
res = minimize(obj, np.ones(3), bounds=bound)

# %%

print('best obj =', res.fun)
print('success =', res.success)
print('best x =', res.x)

输出如下:

best obj = -0.7736842105263159
success = True
best x = [0.9 0.9 0.1]

cvxpy 求解

对于问题:
min ⁡ z = x 1 2 + x 2 2 + 3 x 3 2 + 4 x 4 2 + 2 x 5 2 − 8 x 1 − 2 x 2 − 3 x 3 − x 4 − 2 x 5 , \min z=x_1^2+x_2^2+3x_3^2+4x_4^2+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5, minz=x12+x22+3x32+4x42+2x528x12x23x3x42x5,

s . t . { 0 ≤ x i ≤ 99 , i = 1 , 2 , … , 5 x i ∈ Z + , i = 1 , 2 , … , 5 x 1 + x 2 + x 3 + x 4 + x 5 ≤ 400 , x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 , 2 x 1 + x 2 + 6 x 3 ≤ 200 , x 3 + x 4 + 5 x 5 ≤ 200. s.t.\left\{\begin{aligned} & 0\le x_i\le99,i=1,2,\dots,5\\ & x_i\in Z^+,i=1,2,\dots,5\\ & x_1+x_2+x_3+x_4+x_5\le400,\\ & x_1+2x_2+2x_3+x_4+6x_5\le800,\\ & 2x_1+x_2+6x_3\le200,\\ & x_3+x_4+5x_5\le200. \end{aligned}\right. s.t.0xi99,i=1,2,,5xiZ+,i=1,2,,5x1+x2+x3+x4+x5400,x1+2x2+2x3+x4+6x5800,2x1+x2+6x3200,x3+x4+5x5200.

代码如下:

# %%

import numpy as np
import cvxpy as cp

# %%

# 目标函数的平方项
c1 = np.array([1, 1, 3, 4, 2])

# 目标函数的一次项
c2 = np.array([-8, -2, -3, -1, -2])

# 约束项
a = np.array([[1, 1, 1, 1, 1],
              [1, 2, 2, 1, 6],
              [2, 1, 6, 0, 0],
              [0, 0, 1, 1, 5]])
b = np.array([400, 800, 200, 200])

# 决策变量
x = cp.Variable(5, integer=True)

# 目标函数
obj = cp.Minimize(c1 @ x**2 + c2 @ x)

# 约束
con = [0 <= x, x <= 99, a@x <= b]

# 问题模型
prob = cp.Problem(obj, con)
prob.solve(solver='CPLEX')

# %%

print('best z =', prob.value)
print('best x =', x.value)

输出如下:

best z = -17.0
best x = [4. 1. 0. 0. 0.]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学建模是一门重要而又有趣的学科,它是将数学的方法与现实问题相结合的过程。在进行数学建模的过程中,笔记的记录是非常重要的,可以帮助我们更好地理解问题、掌握建模方法,并且方便后期的复习和总结。 我想将我的数学建模笔记手写在CSDN上,主要出于以下几个原因。首先,手写笔记能够培养我对数学建模概念的理解和记忆能力。通过亲自动手书写数学模型、公式和解题步骤,我可以更好地掌握知识,避免只是机械地复制粘贴或者直接照抄书中的内容。 其次,通过手写笔记,我可以更好地记录自己在建模过程中的思考和想法。数学建模是一个灵活而创造性的过程,每个人对问题的理解和解决方式不尽相同。在手写笔记中,我可以更加自由地表达自己的思路和想法,将自己独特的见解与他人分享。 此外,手写笔记也可以提高我对数学建模问题的整体把握能力。在手写过程中,我需要整理和提炼一些关键的概念和知识,并将它们以更简洁、更清晰的方式呈现出来。这种整合和概括的过程可以帮助我更好地理解问题的本质和解决思路,并将其与其他相关知识进行联系,形成一个更完整的知识体系。 最后,将数学建模笔记手写在CSDN上,可以与其他同学和科研者进行交流与讨论。CSDN是一个专注于计算机科学与技术的知识分享平台,拥有众多对数学建模感兴趣的读者和作者。通过将自己的笔记分享在CSDN上,可以获得更多人的意见和建议,从而不断完善自己的建模能力。 总而言之,数学建模笔记的手写在CSDN上,不仅可以帮助我提升对数学建模的理解和记忆能力,还可以促进思考、整理和交流能力,对于提升自己的数学建模能力具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值