非线性规划
在 matlab 非线性规划数学模型可以写成一下形式:
\[ minf(x)\s.t.\begin{cases} Ax \le B \Aeq.x = Beq\C(x) \le 0\Ceq(x) = 0 \end{cases} \]
f(x)为目标函数, A,B,Aeq,Beq 为线性约束对应的矩阵和向量, C(x),Ceq(x)为非线性约束.
Matlab 求解命令为:
X = fmincon(fun, x0, A, B, Aeq, Beq, LB, UB, NONLCON, OPTIONS)
??fun 为目标函数, x0 为初值, A,B,Aeq,Beq 为线性约束对应的矩阵和向量, LB,UB 分别为 x 的下限和上限, NONLCON 为非线性约束(需要写自定义函数),OPTIONS 为优化参数.
[例] 求下列非线性规划问题
\[ minf(x) = x^2_1+x^2_2+8\s.t.\begin{cases} x_1^2-x_2 \ge 0\-x_1-x_2^2+2=0\x_1,x_2 \ge 0 \end{cases} \]
编写函数文件: fun1.m,fun2.m
- function f = fun1(x)
- f = x(1)^2 + x(2)^2 + 8;
- end
- function [g,h] = fun2(x)
- g = -x(1)^2 + x(2);
%g 代表不等式约束, 即代表约束条件 - x(1)^2 + x(2) <= 0.matlab 默认 g<=0, 所以题目中的条件被改成了相反数.
% 如果有多个不等式约束, 写成 g(1) = 关于 x 的函数; g(2) = 关于 x 的函数;......
h = -x(1) - x(2)^2 + 2;
%h 代表等式约束, 即代表约束条件 -x(1) - x(2)^2 + 2 = 0.
% 如果有多个等式约束, 写成 h(1) = 关于 x 的函数; h(2) = 关于 x 的函数;......
end
注: 在写 fun2 时, 可以把线性和非线性约束的等式和不等式约束都按照这种格式写到这个函数里面, 这样的话 fun2 就包含了所有约束条件, 在后面运行 fmincon()时不需要再写 A,B,Aeq,Beq,
直接用 [] 略过.
- options = optimset;
- [x, y] = fmincon('fun1', rand(2,1), [], [], [], [], zeros(2,1), [], 'fun2', options)
%'fun1'代表目标函数, rand(2,1)随机给了 x 初值, zeros(2,1)代表下限为 0, 即 x1,x2>=0, 'fun2'即刚才写的约束条件.
x 为最优解, y 为最优值.
转化为无约束极值问题
利用问题中的约束函数做出适当的罚函数, 将非线性规划问题转化为无约束非线性规划问题.
\[ minf(x)\s.t.\begin{cases} g_i(x) \le 0 & i=1,2,...,r\h_i(x) \ge 0 & i=1,2,...,s\k_i(x) = 0 & i=1,2,...,t \end{cases} \]
取一个充分大的 M, 构造函数
\[ P(x,M)=f(x)+M\sum_{i=1}^{r}max(g_i(x),0)-M\sum_{i=1}^{s}min(h_i(x),0)+M\sum_{i=1}^{t}|k_i(x)|\ 其中 g 代表 \ le 的不等式约束, h 代表 \ ge 的不等式约束, k 代表等式约束.\ 则非线性规划问题转化为无约束最小化 P(x,M). \]
[例] 将上面的例题转化为无约束极值问题:
编写 test.m
- funtion g = test(x)
- M = 50000;
- f = x(1)^2 + x(2)^2 +8;
- g = f - M*min(x(1),0) - M*min(x(2),0) - M*min(x(1)^2-x(2),0) + M*abs(-x(1)-x(2)^2+2);
命令窗口
[x,y] = fminunc('test', rand(2,1))
参考书籍: Matlab 在数学建模中的应用 (第二版) 卓金武
来源: http://www.bubuko.com/infodetail-3332165.html