一、线性规划
Matlab对于线性规划方程作出了如下规范:
目标函数:
m
i
n
x
f
T
x
{{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}\nolimits^{{T}}}}x}
xminfTx
约束条件:
s
.
t
.
{
A
⋅
x
⩽
b
,
A
e
q
⋅
x
=
b
e
q
,
l
b
⩽
x
⩽
u
b
{s.t.\left\{\begin{matrix}A\cdot x\leqslant b,\\Aeq\cdot x = beq,\\lb\leqslant x\leqslant ub\end{matrix}\right.}
s.t.⎩⎨⎧A⋅x⩽b,Aeq⋅x=beq,lb⩽x⩽ub
求解函数为:
[x, fval] = linprog(f, A, b, Aeq, beq, lb, ub)
函数解释[1]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
(2). 参数 f,x,b,beq,lb,ub为列向量;A,Aeq为矩阵。
注意[1]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
例1:
求解下列线性规划问题:
m
a
x
z
=
2
x
1
+
3
x
2
−
5
x
3
,
{max\ z = 2x_{1} + 3x_{2} - 5x_{3},}
max z=2x1+3x2−5x3,
s
.
t
.
{
x
1
+
x
2
+
x
3
=
7
,
2
x
1
−
5
x
2
+
x
3
≥
10
,
x
1
+
3
x
2
+
x
3
≤
12
,
x
1
,
x
2
,
x
3
≥
0.
{s.t. \left\{\begin{matrix}x_{1} + x_{2} + x_{3} = 7,\\2x_{1} - 5x_{2} + x_{3} \geq 10,\\x_{1} + 3x_{2} + x_{3} \leq 12,\\x_{1},x_{2},x_{3}\geq 0.\end{matrix}\right.}
s.t.⎩⎪⎪⎨⎪⎪⎧x1+x2+x3=7,2x1−5x2+x3≥10,x1+3x2+x3≤12,x1,x2,x3≥0.
解:
f = [-2; -3; 5];
A = [-2 5 -1; 1 3 1];
b = [-10; 12];
Aeq = [1 1 1];
beq = 7;
lb = [0; 0; 0];
ub = [inf; inf; inf];
[x, fval] = linprog(f, A, b,Aeq, beq, lb, ub);
fval = -fval;
display(x);
display(fval);
二、整数规划
Matlab对于整数线性规划方程作出了如下规范:
目标函数:
m
i
n
x
f
T
x
{{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}\nolimits^{{T}}}}x}
xminfTx
约束条件:
s
.
t
.
{
x
(
i
n
t
c
o
n
)
为
整
数
A
⋅
x
⩽
b
,
A
e
q
⋅
x
=
b
e
q
,
l
b
⩽
x
⩽
u
b
{s.t.\left\{\begin{matrix}x(intcon)为整数\\A\cdot x\leqslant b,\\Aeq\cdot x = beq,\\lb\leqslant x\leqslant ub\end{matrix}\right.}
s.t.⎩⎪⎪⎨⎪⎪⎧x(intcon)为整数A⋅x⩽b,Aeq⋅x=beq,lb⩽x⩽ub
求解函数为:
[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq, lb, ub)
函数解释[2]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
(2). 参数 f,x,b,beq,lb,ub为列向量;A,Aeq为矩阵。
(3). intcon 为整数变量的地址,从1开始。
注意[2]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
例2:
求解如下的混合整数规划问题:
m
i
n
z
=
−
3
x
1
−
2
x
2
−
x
3
,
{min\ z = - 3x_{1} - 2x_{2} - x_{3},}
min z=−3x1−2x2−x3,
s
.
t
.
{
x
1
+
x
2
+
x
3
≤
7
,
4
x
1
+
2
x
2
+
x
3
=
12
,
x
1
,
x
2
≥
0
,
x
3
=
0
o
r
1.
{s.t. \left\{\begin{matrix} x_{1} + x_{2} + x_{3} \leq 7,\\ 4x_{1} + 2x_{2} + x_{3} = 12,\\ x_{1},x_{2}\geq 0,\\ x_{3}= 0\ or\ 1. \end{matrix}\right.}
s.t.⎩⎪⎪⎨⎪⎪⎧x1+x2+x3≤7,4x1+2x2+x3=12,x1,x2≥0,x3=0 or 1.
解:
f = [-3; -2; -1];
A = [1 1 1];
b = 7;
Aeq = [4 2 1];
beq = 12;
lb = [0; 0; 0];
ub = [inf; inf; 1];
intcon = 3;
[x, fval] = intlinprog(f, intcon, A, b, Aeq, beq,lb, ub);
display(x);
display(fval);
三、非线性规划
Matlab对于非线性规划方程作出了如下规范:
目标函数:
m
i
n
f
(
x
)
,
{min\ f(x),}
min 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
{s.t. \ \left\{\begin{matrix} A\cdot x\leq b,\\ Aeq\cdot x=beq,\\ c(x)\leq 0,\\ ceq(x)=0,\\ lb\leq x\leq ub \end{matrix}\right.}
s.t. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧A⋅x≤b,Aeq⋅x=beq,c(x)≤0,ceq(x)=0,lb≤x≤ub
求解函数为:
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)
函数解释[3]:(1). 返回值x为决策向量的取值,fval为目标函数的最优值(最小值)。
(2). 参数 A, b, Aeq, beq定义了线性约束,x0为决策向量 x 的初始值。
(3). 参数 fun 是用M文件定义的函数或匿名函数。
(4). 参数 nonlcon 是用M文件定义的非线性向量函数 c(x),ceq(x) 。
注意[3]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
(2). 定义M文件时,参数为决策向量。
例3:
求下列非线性规划:
m
i
n
f
(
x
)
=
x
1
2
+
x
2
2
+
x
3
2
+
8
,
{min\ f(x) = x_{1}^{2} + x_{2}^{2} + x_{3}^{2} + 8,}
min f(x)=x12+x22+x32+8,
s
.
t
.
{
x
1
2
−
x
2
+
x
3
2
≥
0
,
x
1
+
x
2
2
+
x
3
3
≤
20
,
−
x
1
−
x
2
2
+
2
=
0
,
x
2
+
2
x
3
2
=
3
,
x
1
,
x
2
,
x
3
≥
0.
{s.t.\ \left\{\begin{matrix} 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{matrix}\right.}
s.t. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x12−x2+x32≥0,x1+x22+x33≤20,−x1−x22+2=0,x2+2x32=3,x1,x2,x3≥0.
解:
(1)编写 M 函数 fun1.m 定义目标函数:
function f = fun1(x)
f = x(1)^2 + x(2)^2 + x(3)^2 + 8;
end
(2)编写 M 函数 fun2.m定义非线性约束条件:
function [c, ceq] = fun2(x)
c = [-x(1)^2 + x(2) - x(3)^2
x(1) + x(2)^2 + x(3)^3 - 20];
ceq = [-x(1) - x(2)^2 + 2
x(2) + 2*x(3)^2 - 3];
end
(3)编写主程序文件:
fun = 'fun1';
x0 = [0; 0; 0];
A = [];
b = [];
Aeq = [];
beq = [];
lb = [0; 0; 0];
ub = [inf; inf; inf];
nonlcon = 'fun2';
[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);
display(x);
display(fval);
章外杂谈
1、无约束极值的数值解
目标函数:
m
i
n
x
f
(
x
)
,
{{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}}}(x),}
xminf(x),
求解函数为:
[x, fval] = fminunc(fun, x0)
[x, fval] = fminsearch(fun, x0)
函数解释[4]:(1). 返回值 x 是所求得的极小值点,fval 是函数的极小值。
(2). 参数 x0 是 x 的初始值,fun 是用M文件定义的函数或匿名函数。
注意[4]:fminsearch 只能求给定的初始值附近的一个极小值点。
2、对函数的零点和方程组的解
%%
A = [1 -1 2 -3]; % 多项式是用向量定义的,系数从高次幂到低次幂排列,如果缺少某一项,则系数为0
x0 = roos(A)
%%
f = @(x) x^3-x^2+2*x-3;
x0 = solve(f) % 求函数零点的符号解
x0 = vpa(x0, 5) % 化成小数格式的数据
%%
y = @(x) x^3 - x^2 + 2 * x - 3;
x = fsolve(y, rand) % 只能求给定初始值附近的一个零点
%%
3、约束极值的数值解
(1). 求单变量非线性函数在区间上的极小值
目标函数: m i n x f ( x ) , x ∈ [ x 1 , x 2 ] {{\mathop{{{min}}}\limits_{{x}}{f\mathop{{}}}}(x)\ ,x \in [x_{1}, x_{2}]} xminf(x) ,x∈[x1,x2]
求解函数为:
[x, fval] = fminbnd(fun, x1, x2)
函数解释[5]:(1). 返回值 x 是极小点x,fval 是函数的极小值。
(2). 参数 fun 是用M文件定义的函数或匿名函数,x1 和 x2 分别为区间的上下限。
(2). 求非线性约束下的极值
目标函数:
m
i
n
f
(
x
)
,
{{\mathop{{{min}}}{f\mathop{{}}}}(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
,
K
i
(
x
,
w
i
)
≤
0
,
1
≤
i
≤
n
.
{s.t.\ \left\{\begin{matrix} A\cdot x\leq b\\ Aeq\cdot x=beq,\\ lb\leq x\leq ub,\\ c(x)\leq 0,\\ ceq(x)=0,\\ K_{i}(x,w_{i})\leq 0,1\leq i\leq n. \end{matrix}\right.}
s.t. ⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧A⋅x≤bAeq⋅x=beq,lb≤x≤ub,c(x)≤0,ceq(x)=0,Ki(x,wi)≤0,1≤i≤n.
求解函数为:
[x, fval] = fseminf (fun, x0, ntheta, seminfcon, A, b, Aeq, beq, lb, ub)
函数解释[6]:(1). 返回值 x 是极小点x,fval 是函数的极小值。
(2). 参数 fun 用于定义目标函数 f(x) ;x0 为 x 的初始值;ntheta是半无穷约束
K
i
(
x
,
w
i
)
{K_{i}(x,w_{i})}
Ki(x,wi)的个数;seminfcon 是用于定义非线性不等式约束 c(x) 、非线性等式约束 ceq(x) 和半无穷
K
i
(
x
,
w
i
)
{K_{i}(x, w_{i})}
Ki(x,wi)的函数。
注意[6]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
(2). 函数seminfcon 有两个输入参量 x 和 s,s 是推荐的取样步长,也可不使用。
(3). 初始值 x0 的取值很重要,如果取得不合适,可能就得不到可行解。
例4:求函数
f
(
x
)
=
(
x
1
−
0.5
)
2
+
(
x
2
−
0.5
)
2
+
(
x
3
−
0.5
)
2
{f(x)=(x_{1}-0.5)^{2}+(x_{2}-0.5)^{2}+(x_{3}-0.5)^{2}}
f(x)=(x1−0.5)2+(x2−0.5)2+(x3−0.5)2取最小值时的
x
{x}
x 值,约束为:
K
1
(
x
,
w
1
)
=
s
i
n
(
w
1
x
1
)
c
o
s
(
w
1
x
2
)
−
1
1000
(
w
1
−
50
)
2
−
s
i
n
(
w
1
x
3
)
−
x
3
≤
1
,
{K_{1}(x,w_{1})\ =\ sin(w_{1}x_{1})cos(w_{1}x_{2})\ -\frac{1}{1000}(w_{1}-50)^{2}-sin(w_{1}x_{3})-x_{3}\leq 1,\\ }
K1(x,w1) = sin(w1x1)cos(w1x2) −10001(w1−50)2−sin(w1x3)−x3≤1,
K 2 ( x , w 2 ) = s i n ( w 2 x 2 ) c o s ( w 2 x 1 ) − 1 1000 ( w 2 − 50 ) 2 − s i n ( w 2 x 3 ) − x 3 ≤ 1 , { K_{2}(x,w_{2})\ =\ sin(w_{2}x_{2})cos(w_{2}x_{1})\ -\frac{1}{1000}(w_{2}-50)^{2}-sin(w_{2}x_{3})-x_{3}\leq 1, } K2(x,w2) = sin(w2x2)cos(w2x1) −10001(w2−50)2−sin(w2x3)−x3≤1,
1
≤
w
1
≤
100
,
1
≤
w
2
≤
100.
{1\leq w_{1}\leq 100,1\leq w_{2}\leq 100.}
1≤w1≤100,1≤w2≤100.
解:
(1). 编写 M 函数 fun1.m 定义目标函数:
function fun = fun4(x,s)
fun = (x(1) - 0.5)^2 + (x(2) - 0.5)^2 + (x(3) - 0.5)^2;
end
(2). 编写 M 函数 fun2 .m 定义约束条件:
function [c, ceq, k1, k2, s] = fun5(x, s)
c = [];ceq = [];
if isnan(s(1,1))
s = [0.2 0;0.2 0];
end
% 取样值
w1 = 1:s(1,1):100;
w2 = 1:s(2,1):100;
% 半无穷约束
k1 = sin(w1*x(1)).*cos(w1*x(2))-(w1-50).^2/1000-sin(w1*x(3))-x(3)-1;
k2 = sin(w2*x(2)).*cos(w2*x(1))-(w2-50).^2/1000-sin(w2*x(3))-x(3)-1;
% 画出半无穷约束的图形
plot(w1, k1, '-', w2, k2, '+');
end
(3). 编写主程序文件:
A = [];b = [];Aeq = [];beq = [];lb = [-inf;-inf;-inf];ub = [inf;inf;inf];
fun = 'fun4';
semifcon = 'fun5';
ntheta = 2;
x0 = [0.5; 0.2; 0.3]; % 如果初始值取的不合适,可能就得不到可行解
[x, fval] = fseminf(fun, x0, ntheta, semifcon, A, b, Aeq, beq, lb, ub)