数学建模| 非线性规划(Matlab)

非线性规划(Matlab)

非线性规划

非线性规划:约束条件和目标函数存在非线性函数。简单点说,约束条件和目标函数中至少一个决策变量不是一次方,例如三角函数、对数、多次方等。

线性规划和非线性在解决上的不同:线性规划可以有通用方法,但是非线性规划的求解是没有特定算的,只能用近似的算法,每种算法都有自己适用的范围。这些算法有很多,Matlab内部已经实现好了,有现成的函数,如果想了解内部具体的实现可以另寻查找,本文就只介绍如何调用Matlab中的函数达成求非线性规划。

Matlab函数

Matlab函数:

matlab 复制代码
[x,value]=fmincon(func,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

参数解释:

  • func 表示目标函数。
  • A 表示不等式约束条件系数矩阵,b 表示不等式约束条件常数矩阵。
  • Aeq 表示等式约束条件系数矩阵,beq 表示等式约束条件常数矩阵。
  • lb 表示决策变量的下限数组,ub表示决策变量的上限数组。
  • x 表示目标函数 func 取得最小值时的决策变量取值数组。
  • value 表示目标函数 func 取得的最小值。
  • x0表示初始值。
  • nonlcon 非线性约束,包括不等式和等式。
  • options是优化参数。

Matlab中线性规划的标准形式:C(x)和Ceq(x)是非线性约束的不等式和等式。

min ⁡ f ( x ) \min f(x) minf(x)
s . t . { A x ⩽ b A e q ⋅ x = b e q l b ⩽ x ⩽ u b C ( x ) ⩽ 0 C e q ( x ) = 0 s.t. \begin{cases} Ax\leqslant b\\ Aeq\cdot x= beq\\ lb\leqslant x\leqslant ub\\ C(x)\leqslant0\\ Ceq(x)=0\\ \end{cases} s.t.⎩ ⎨ ⎧Ax⩽bAeq⋅x=beqlb⩽x⩽ubC(x)⩽0Ceq(x)=0

使用注意:

  • 对于不存在的约束用空矩阵[]。
  • 使用前需要把目标函数和约束对象化成Matlab标准形式。
  • func和nonlcon需要用M文件定义,因为非线性涉及多少次幂,线性规划中只需要给系数矩阵即可。
  • x0初始值按决策变量维度取实数即可,对求解速度会有影响,例如一下子就选中最小值的点为初始值。
  • options可以不填。
  • A、b、Aeq、beq依旧是修饰线性约束的。

Matlab使用例子

步骤:按照数模题目进行建模,得到目标函数和约束条件,然后把目标函数和约束条件化为标准形式,再化成matlab里面矩阵形式,最后填入代码中。

目标函数+约束条件:
m a x z = − x 1 2 − x 2 2 − x 3 2 + 6 max\quad z=-{x_1}^2-{x_2}^2-{x_3}^2+6 maxz=−x12−x22−x32+6
s . t . { x 1 2 − x 2 = 0 x 1 − x 2 2 + x 3 3 ≥ 2 x 1 + x 2 2 − 2 x 3 ≤ 5 x 1 , x 2 , x 3 ≥ 0 s.t. \begin{cases} {x_1}^2-x_2=0\\ x_1-{x_2}^2+{x_3}^3\geq2\\ x_1+{x_2}^2-2x_3\leq5\\ x_1,x_2,x_3\geq0\\ \end{cases} s.t.⎩ ⎨ ⎧x12−x2=0x1−x22+x33≥2x1+x22−2x3≤5x1,x2,x3≥0

Matlab标准格式化:
m i n f ( x ) = x 1 2 + x 2 2 + x 3 2 − 6 min\quad f(x)={x_1}^2+{x_2}^2+{x_3}^2-6 minf(x)=x12+x22+x32−6
s . t . { x 1 2 − x 2 + 0 ∗ x 3 = 0 − x 1 + x 2 2 − x 3 3 + 2 ≤ 0 x 1 + x 2 2 − 2 x 3 − 5 ≤ 0 x 1 , x 2 , x 3 ≥ 0 s.t. \begin{cases} {x_1}^2-x_2+0*x_3=0\\ -x_1+{x_2}^2-{x_3}^3+2\leq0\\ x_1+{x_2}^2-2x_3-5\leq0\\ x_1,x_2,x_3\geq0\\ \end{cases} s.t.⎩ ⎨ ⎧x12−x2+0∗x3=0−x1+x22−x33+2≤0x1+x22−2x3−5≤0x1,x2,x3≥0

func.m

matlab 复制代码
function f=func(x)
func=sum(x.^2)-6;

nonlcon.m

matlab 复制代码
function [C,Ceq]=nonlcon(x)
C=[-x(1)+x(2)^2-x(3)^2+2;
x(1)+x(2)^2-2*x(3)-5]
Ceq=[x(1)^2-x(2)]

主文件代码

matlab 复制代码
[x,value]=fmincon('func',[2,1,0],[],[],[],[],[0,0,0],[],'nonlcon');
相关推荐
职略1 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22741 小时前
LeetCode 196, 73, 105
java·算法·leetcode
阿里巴巴P8资深技术专家2 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
zengson_g3 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
爱上电路设计3 小时前
有趣的算法
开发语言·c++·算法
CTGU_daffodil5 小时前
matlab 绘制高等数学中的二维函数示例
开发语言·matlab
Kerry_66 小时前
2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码分析
算法·数学建模·matlab·数据分析
风啊雨6 小时前
刷题Day44|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
算法
yachihaoteng6 小时前
Studying-代码随想录训练营day27| 贪心算法理论基础、455.分发饼干、376.摆动序列、53.最大子序和
c++·算法·leetcode·贪心算法
逸群不凡6 小时前
C++|哈希应用->布隆过滤器
开发语言·数据结构·c++·算法·哈希算法