Matlab非线性规划

Posted kingham

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab非线性规划相关的知识,希望对你有一定的参考价值。

非线性规划

在matlab非线性规划数学模型可以写成一下形式:
[ minf(x)s.t.egin{cases} Ax le B Aeq·x = BeqC(x) le 0Ceq(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+8s.t.egin{cases} x_1^2-x_2 ge 0-x_1-x_2^2+2=0x_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.egin{cases} g_i(x) le 0 & i=1,2,...,rh_i(x) ge 0 & i=1,2,...,sk_i(x) = 0 & i=1,2,...,t end{cases} ]
取一个充分大的M,构造函数
[ P(x,M)=f(x)+Msum_{i=1}^{r}max(g_i(x),0)-Msum_{i=1}^{s}min(h_i(x),0)+Msum_{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在数学建模中的应用(第二版)卓金武

以上是关于Matlab非线性规划的主要内容,如果未能解决你的问题,请参考以下文章

求用动态规划的方法求解简单的整数规划问题的matlab程序或者C++程序代码,高手们帮帮忙

用matlab求解一些简单问题!

优化求解基于matlab单纯形表算法求解线性规划(LP)问题含Matlab源码 1540期

用matlab编程解决整数规划

matlab解决线性规划问题

matlab解决线性规划问题