非线性规划
1.非线性规划问题
如果目标函数或者约束条件中包含非线性函数,就称这种问题为非线性规划问题。
2.非线性规划的Matlab标准形式及问题求解
式中:
f(x) 为标量函数;
A,b,Aeq,beq,lb,ub为相应维数的矩阵和向量;
**c(x),ceq(x)**为非线性向量函数。
Matlab中的命令是:
[x,fval]=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
式中:
x的返回值是决策向量x的取值;fval返回的是目标函数的取值,其中fun是用M文件定义的函数f(x);x0是x的初始值;
A,b,Aeq,beq定义了线性约束A*x<=b,Aeq*x=beq;
如果没有线性约束,则A=[ ],b=[ ],Aeq=[ ],beq=[ ];lb和ub是变量x的下界和上界,如果上界和下界没有约束,即x无下界也无上界,则lb=[ ],ub=[ ],也可以写成lb的各变量都为 -inf,ub的各变量都为inf;
nonlcon是用M文件定义的非线性向量函数c(x),ceq(x);
options定义了优化参数,可以使用Matlab默认的参数设置。
fmincon的初始值x0可以任意取,只要保证为实数就行。
具体解释:《MATLAB fmincon 的初值x0的选取问题》
链接: https://blog.csdn.net/lcp201281095/article/details/79801822.
3.非线性规划例题
例1:求下列非线性规划:
解:(1)编写M函数fun1.m定义目标函数:
function f =fun1(x);
f=sum(x.^2)+8
(2)编写M函数fun2.m定义非线性约束条件:
function [g,h]=fun2(x);
g=[-x(1)^2+x(2)-x(3)^2
x(1)+x(2)^2+x(3)^3-20];%非线性不等式约束
h=[-x(1)-x(2)^2+2
x(2)+2*x(3)^2-3];%非线性等式约束
(3)编写主程序文件如下:
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
其中fmincon中的 rand(n,m) 是产生由在(0, 1)之间均匀分布的随机数组成的数组。用法:1.rand(2,3),则会得到一个2行3列的在1以内的随机矩阵。2.rand(3),则会得到一个3行3列的随机方阵。3.rand(size(A)) 返回一个和A矩阵有相同尺寸的随机矩阵。
程序运行结果:
求得当x1=0.5522,x2=1.2033,x3=0.9478时,最小值y=10.6511
例2:求下列非线性规划问题。
解:(1)编写m文件,定义目标函数:
function f=fun44(x)
f=-(sqrt(x(1))+sqrt(x(2))+sqrt(x(3))+sqrt(x(4)));
(2)编写m文件,定义约束条件:
function [g,ceq]=myconl(x)
g(1)=x(1)-400;
g(2)=1.1*x(1)+x(2)-440;
g(3)=1.21*x(1)+1.1*x(2)+x(3)-484;
g(4)=1.331*x(1)+1.21*x(2)+1.1*x(3)+x(4)-532.4;
ceq=0;
(3)编写主程序,即可编写m文件也可以在命令窗口直接输入命令:
x0=[1,1,1,1];
lb=[0,0,0,0];
ub=[];A=[];b=[];Aeq=[];beq=[];
[x,fval]=fmincon('fun44',x0,A,b,Aeq,beq,lb,ub,'myconl');
x,fval=-fval
程序运行结果:
求得的最优解为x1=86.1883,x2=104.2878,x3=126.1883,x4=152.6879,对应的最优值为z=43.0860