一、线性规划
Matlab对于线性规划方程作出了如下规范:
目标函数:
约束条件:
求解函数为:
[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:
求解下列线性规划问题:
解:
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对于整数线性规划方程作出了如下规范:
目标函数:
约束条件:
求解函数为:
[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:
求解如下的混合整数规划问题:
解:
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对于非线性规划方程作出了如下规范:
目标函数:
约束条件:
求解函数为:
[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:
求下列非线性规划:
解:
(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、无约束极值的数值解
目标函数:
求解函数为:
[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). 求单变量非线性函数在区间上的极小值
目标函数:
求解函数为:
[x, fval] = fminbnd(fun, x1, x2)
函数解释[5]:(1). 返回值 x 是极小点x,fval 是函数的极小值。
(2). 参数 fun 是用M文件定义的函数或匿名函数,x1 和 x2 分别为区间的上下限。
(2). 求非线性约束下的极值
目标函数:
约束条件:
求解函数为:
[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是半无穷约束
的个数;seminfcon 是用于定义非线性不等式约束 c(x) 、非线性等式约束 ceq(x) 和半无穷
的函数。
注意[6]:(1). 若缺少某约束,令其值为空矩阵即可。例如:若缺少线性等式约束,令Aeq=[],beq=[]即可。
(2). 函数seminfcon 有两个输入参量 x 和 s,s 是推荐的取样步长,也可不使用。
(3). 初始值 x0 的取值很重要,如果取得不合适,可能就得不到可行解。
例4:求函数
取最小值时的
值,约束为:
解:
(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)