- 非线性规划
- 定义
- 1. 数学原型
- 2. MATLAB内置函数原型
- 3. 例题
相较于线性规划, 增加了非线性部分不等式或等式约束的模型(见下面数学原型, 不多解释)
1. 数学原型a r g m i n f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q c ( x ) ≤ 0 c e q ( x ) = 0 } 非 线 性 部 分 l b ≤ x ≤ u b argmin ; f(x) qquad s.t. left{ begin{aligned} Acdot x le b qquadqquad;;; \ Aeq cdot x = beq qquadqquad\ left . begin{aligned} c(x) le 0 \ ceq(x) = 0 \ end{aligned} right }非线性部分 \ lb le x le ub qquadqquad;\ end{aligned} right . argminf(x)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beqc(x)≤0ceq(x)=0}非线性部分lb≤x≤ub
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
参数含义
命名请参考数学原型中的字母
-
fun: 优化目标f(x)
-
x0是x的初始值(非线性规划算法必须要一个初始值, 一般就设置成随机值, 具体原因在此不解释)
-
nonlcon: c(x), 和ceq(x)
-
option: 优化参数
-
其他的参数跟线性规划一模一样, 数学原型中也看得出来是啥意思, 具体见线性规划的文章
线性规划链接: 数学建模常用算法汇总及python,MATLAB实现(一)—— 线性规划
3. 例题
题目
a
r
g
m
i
n
f
(
x
)
=
x
1
2
+
x
2
2
+
x
3
2
+
8
s
.
t
.
{
x
1
2
−
x
2
+
x
3
2
≥
0
x
1
+
x
2
2
+
x
3
2
≤
20
−
x
1
−
x
2
2
+
2
=
0
x
2
+
2
x
3
2
=
3
x
1
,
x
2
,
x
3
≥
0
argmin ; f(x) = x_1^2 + x_2^2 + x^2_3 +8\ s.t. ; left { begin{aligned} x_1^2 - x_2 + x_3^2ge 0 \ x_1 + x_2^2 + x_3^2 le 20 \ -x_1 - x_2^2 + 2 = 0 \ x_2 +2x_3^2 = 3\ x_1, x_2, x_3 ge 0 \ end{aligned} right .
argminf(x)=x12+x22+x32+8s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x12−x2+x32≥0x1+x22+x32≤20−x1−x22+2=0x2+2x32=3x1,x2,x3≥0
代码
注意matlab不支持自定义函数定义在主脚本中
必须创建一个.m文件File->New->Function 在.m文件中定义函数
- 函数fun的定义(定义在另一个.m文件中)
function res = fun(x)
res = sum(x.^2) + 8;
end
- 函数nonlcon的定义
function [g, h] = nonlcon(x)
g = [-x(1)^2 + x(2) - x(3)^2, x(1) + x(2)^2 + x(3)^2 - 20];
h = [-x(1) - x(2)^2 + 2, x(2) + 2 * x(3)^2 - 3];
end
- 主脚本
clc
clear
[x, fval] = fmincon('fun', rand(3, 1), [], [], [], [], zeros(3, 1), [], 'nonlcon', [])
% 自定义函数作为参数传递要加上'', 不能直接写上函数名
附上答案
x =
0.5522
1.2033
0.9478
fval =
10.6511



