Matlab做非线性规划
- 格式:ppt
- 大小:4.29 MB
- 文档页数:43
matlab解决⾮线性规划问题(凸优化问题)当⽬标函数含有⾮线性函数或者含有⾮线性约束的时候该规划问题变为⾮线性规划问题,⾮线性规划问题的最优解不⼀定在定义域的边界,可能在定义域内部,这点与线性规划不同;例如:编写⽬标函数,定义放在⼀个m⽂件中;编写⾮线性约束条件函数矩阵,放在另⼀个m⽂件中;function f = optf(x);f = sum(x.^2)+8;function [g, h] = limf(x);g = [-x(1)^2+x(2)-x(3)^2x(1)+x(2)^2+x(3)^3-20]; %⾮线性不等式约束h = [-x(1)-x(2)^2+2x(2)+2*x(3)^2-3]; %⾮线性等式约束options = optimset('largescale','off');[x y] = fmincon('optf',rand(3,1),[],[],[],[],zeros(3,1),[],...'limf',options)输出为:最速下降法(求最⼩值):代码如下:function [f df] = detaf(x);f = x(1)^2+25*x(2)^2;df = [2*x(1)50*x(2)];clc,clear;x = [2;2];[f0 g] = detaf(x);while norm(g)>1e-6 %收敛条件为⼀阶导数趋近于0p = -g/norm(g);t = 1.0; %设置初始步长为1个单位f = detaf(x+t*p);while f>f0t = t/2;f = detaf(x+t*p);end %这⼀步很重要,为了保证最后收敛,保持f序列为⼀个单调递减的序列,否则很有可能在极值点两端来回震荡,最后⽆法收敛到最优值。
x = x+t*p;[f0,g] = detaf(x);endx,f0所得到的最优值为近似解。
多元⾮线性规划Matlab,⾮线性规划MATLAB代码下⾯是三个⾮线性规划领域的算法。
课堂上给予了详细的讲解,在实践环节让学⽣编程实现,从⽽可以实验复杂⼀些的例⼦,加深对算法的理解。
下⾯共有四个程序grad,simplelinesearch,bfgs和phr,全部使⽤MATLAB语⾔编写。
这些代码远未完善,可修改余地很⼤,仅供教学之⽤。
function gradf=grad(hfun,x)%GRAD 数值法求函数在给定点处的导数值(⼀元函数)或梯度(多元函数)% gradf = grad(hfun,x0) hfun是函数句柄或内联函数,x0是⼀定点或⼀批点(按列);返回% 值gradf是函数在该点处的导数或梯度。
% 要求函数能对成批的点求函数值。
⽐如:feval(hfun,X)返回⼀个与X同列的⾏向量,对应于以% X每⼀列作为函数⾃变量⽽求得的函数值。
%% Reference: 《最优化计算原理与算法程序设计》, 粟塔⼭等编著, 国防科技⼤学出版社% (湖南), 2001.%% $Author: WBC $ $Date: 2003/10/25 $n = length(x);h=1e-3; % 数值法求梯度的步长w1=zeros(n,1);%h/2w2=w1; %-h/2w3=w1; %hw4=w1; %-hfor i=1:nx(i)=x(i)+h/2;w1(i)=hfun(x);x(i)=x(i)-h;w2(i)=hfun(x);x(i)=x(i)-h/2;w4(i)=hfun(x);x(i)=x(i)+2*h;w3(i)=hfun(x);x(i)=x(i)-h;endgradf=(8*(w1-w2)-(w3-w4))/(6*h);function [fv,x,lambda,exitflag]=simplelinesearch(hf,rho,l,u,lambda0,fv0,x0,g,d)%LINESEARCH 简单线搜索%输⼊参数:% hf -- 函数句柄,⽬标函数% rho -- 实标量,简单线搜索的参数,介于0到0.5之间的数% l -- 实标量,简单线搜索的参数,介于0到1之间的数% u -- 实标量,简单线搜索的参数,介于0到1之间的数,满⾜u>l% alpha0 -- 实标量,步长的初始值% fv0 -- 实标量,⼀维搜索的初始⽬标函数值,即 hf(x0+alpha_0*d)% x0 -- 实列向量,当前点% g -- 实列向量,函数hf在当前点处的梯度% d -- 实列向量,函数hf在当前点处的搜索⽅向%输出参数:% fv -- 实标量,⼀维搜索完成后的⽬标函数值,即 hf(x0+alpha*d)% x -- 实列向量,下⼀个点% lambda -- 实标量,可接受步长% exitflag -- 整型标量,等于0表⽰线搜索成功,等于-1表⽰线搜索失败(内部迭代次数⼤于iterMax) %参考⽂献:倪勤,最优化⽅法与程序设计,科学出版社% Date: 2009/12/20lambda = lambda0;x = x0;i = 0;imax = 30; % 最⼤迭代次数,⽤户可以修改% 主循环gd = dot(g, d);while i <= imaxfv = hf(x + lambda*d);i = i + 1;if fv < fv0 + lambda * rho * gd;x = x + lambda*d;exitflag = 0;return;endlambda_bar = -gd*lambda^2*0.5/(fv-fv0-lambda*gd);lambda = min(lambda_bar, u*lambda);endexitflag=0;if i >= imax && fv >= fv0fv = fv0;x = x0;lambda = 0;exitflag = -1;endfunction [fv, x, exitflag] = bfgs(hf, x0, epsi)%BFGS ⽆约束问题的BFGS算法%输⼊参数:% hf -- 函数句柄,⽬标函数% x0 -- 实列向量,初始点% epsi -- 实标量,终⽌误差%输出参数:% fv -- 实标量,⼀维搜索完成后的⽬标函数值,即 hf(x0+alpha*d)% x -- 实列向量,下⼀个点% exitflag -- 整型标量,等于0表⽰成功,等于-1表⽰失败(迭代次数⼤于iter_max) %参考⽂献:倪勤,最优化⽅法与程序设计,科学出版社% Date: 2009/12/20%%初始化%k = 0;rho = 0.01;l = 0.15;u = 0.85;x =x0;fv = hf(x);n = length(x);H = eye(n);iter_max = 100;%检查终⽌条件%g = grad(hf, x);while norm(g) > epsi && k<= iter_maxd = -H*g;lambda0 = 1.0;%%做线搜索,如果成功,则返回更新当前点%[fv, x, lambda, exitflag] = simplelinesearch(hf, rho, l, u, lambda0, fv, x, g, d); if exitflag == -1 %重开始H = eye(n);else%%更新H%g_old = g;g = grad(hf, x);p = lambda*d;q = g- g_old;Hq = H*q;pq = p'*q;qHq = q'*Hq;v = sqrt(qHq) * (p/pq-Hq/qHq);H = H + p*p'/pq - Hq*Hq'/qHq + v*v';endk = k+1;endexitflag = 0;if k > iter_maxexitflag = -1;endfunction [fv, x, exitflag] = phr(hf, cf, x0)%输⼊参数:% hf -- 函数句柄,⽬标函数% cf -- 函数句柄,约束条件,包含等式约束和不等式约束% x0 -- 实列向量,初始点%输出参数:% fv -- 实标量,⼀维搜索完成后的⽬标函数值,即 hf(x0+alpha*d)% x -- 实列向量,下⼀个点% exitflag -- 整型标量,等于0表⽰成功,等于-1表⽰失败(迭代次数⼤于iter_max) %参考⽂献:倪勤,最优化⽅法与程序设计,科学出版社% Date: 2009/12/20%%初始化%epsi = 1.0e-4;k = 0;sigma = 0.8;c = 1.5;theta = 0.8;x = x0;[ce, ci] = cf(x);l = length(ce);li = length(ci);lambda = ones(l+li, 1) * 0.1;iter_max = 100;phi = 0;if lphi = phi + ce'*ce;endif liphi = phi + sum(min(ci,lambda(l+1:end)/sigma).^2);endwhile phi > epsi && k <= iter_max%%hmf = @(x) mfun(x, hf, cf,lambda, sigma);[fv, x] = bfgs(hmf, x, epsi);[ce, ci] = cf(x);phi_old = phi;phi = 0;if lphi = phi + ce'*ce;endif liphi = phi + sum(min(ci,lambda(l+1:end)/sigma).^2); endif phi > epsi%%更新罚因⼦%if k >= 2 && phi/phi_old > thetasigma = c * sigma;end%%更新乘⼦%if llambda(1:l) = lambda(1:l) - sigma*ce;endif lilambda(l+1:end) = max(0, lambda(l+1:end) - sigma*ci); endendk = k+1;endexitflag = 0;fv = hf(x);exitflag = -1;end%%乘⼦罚函数%function fv = mfun(x, hf, cf, lambda, sigma)[ce, ci] = cf(x);l = length(ce);li = length(ci);fv = 0;fv = fv + hf(x);if lfv = fv - lambda(1:l)'*ce + 0.5*sigma*ce'*ce;endif lifv = fv + 0.5/sigma*sum(max(0,lambda(l+1:end) - sigma*ci).^2 - lambda(l+1:end).^2); end这⾥是演⽰代码:%% bfgs演⽰%教材P328.1-3hf1 = @(x) 100 * (x(2) - x(1).^2).^2 + (1 - x(1)).^2; %banana函数hf2 = @(x) (6 + x(1) + x(2)).^2 + (2 - 3*x(1) - 3*x(2) - x(1)*x(2)).^2;hf3 = @(x) x(1).^2 - 2*x(1)*x(2) + 4*x(2).^2 + x(1) - 3*x(2);[fv,x,exitflag]=bfgs(hf1,[0;0],0.001);fvxexitflag[fv,x,exitflag]=bfgs(hf2,[4;6],0.001);fvxexitflag[fv,x,exitflag]=bfgs(hf3,[1;1],0.001);fvexitflag%% phr算法%教材P414.5hf1 = @(x) x(1).^2 + x(2).^2;cf1 = @(x) deal([], x(1) - 1);hf2 = @(x) x(1) + (x(2) + 1).^2/3;cf2 = @(x) deal([],[x(1); x(2) - 1]);%教材P392.2hf3 = @(x) x(1).^2 + x(1).*x(2) + 2*x(2).^2 - 6*x(1) - 2*x(2) - 12*x(3);cf3 = @(x) deal(x(1)+x(2)+x(3)-2,...[x(1) - 2*x(2) + 3; x(1); x(2); x(3)]);%其它例⼦hf4 = @(x) 6*x(2)*x(5) + 7*x(1)*x(3) + 3*x(2)^2;cf4 = @(x) deal([3*x(2)^2*x(5) + 3*x(1)^2*x(3) - 20.875;x(1) - 0.3*x(2)],...[-x(1) + 0.2*x(2)*x(5) + 71-0.9*x(3) + x(4)^2 + 67x(3)x(5) - 1-x(3) + 20x(4) - 0.1*x(5)-x(4) + 0.5*x(5)x(3) - 0.9*x(5)]);hf5 = @(x) exp(x(1)) * (4*x(1)^2 + 2*x(2)^2 + 4*x(1)*x(2) + 2*x(2) + 1);cf5 = @(x) deal([], [x(1) + x(2) - x(1)*x(2) - 1.5; x(1)*x(2) + 10]);[fv, x, exitflag] = phr(hf1, cf1, [3;2]); fv x exitflag [fv, x, exitflag] = phr(hf2, cf2, [3;2]); fv x exitflag [fv, x, exitflag] =phr(hf3, cf3, [1;1;0]); fv x exitflag [fv, x, exitflag] = phr(hf4, cf4, [1; 4; 5; 2; 5]); fv x exitflag [fv, x, exitflag] = phr(hf5, cf5, [-1; 1]); fv x exitflag。
一.非线性规划课题实例1 表面积为36平方米的最大长方体体积。
建立数学模型:设x、y、z分别为长方体的三个棱长,f为长方体体积。
max f = x y (36-2 x y)/2 (x+y)实例2 投资决策问题某公司准备用5000万元用于A、B两个项目的投资,设x1、x2分别表示配给项目A、B的投资。
预计项目A、B的年收益分别为20%和16%。
同时,投资后总的风险损失将随着总投资和单位投资的增加而增加,已知总的风险损失为2x12+x22+(x1+x2)2.问应如何分配资金,才能使期望的收益最大,同时使风险损失为最小。
建立数学模型:max f=20x1+16x2-λ[2x12+x22+(x1+x2)2]s.t x1+x2≤5000x 1≥0,x2≥0目标函数中的λ≥0是权重系数。
由以上实例去掉实际背景,其目标函数与约束条件至少有一处是非线性的,称其为非线性问题。
非线性规划问题可分为无约束问题和有约束问题。
实例1为无约束问题,实例2为有约束问题。
二.无约束非线性规划问题:求解无约束最优化问题的方法主要有两类:直接搜索法(Search method)和梯度法(Gradient method),单变量用fminbnd,fminsearch,fminunc;多变量用fminsearch,fminnuc 1.fminunc函数调用格式:x=fminunc(fun,x0)x=fminunc(fun,x0,options)x=fminunc(fun,x0,options,P1,P2)[x,fval]=fminunc(…)[x,fval, exitflag]=fminunc(…)[x,fval, exitflag,output]=fminunc(…)[x,fval, exitflag,output,grad]=fminunc(…)[x,fval, exitflag,output,grad,hessian]=fminunc(…)说明:fun为需最小化的目标函数,x0为给定的搜索的初始点。
在matlab 中非线性规划的数学模型可写成一下形式:minf(X)s.t. Ax ≪B Aeq .x =Beq C (x )≪0Ceq x =0其中,f(x)是标量函数;A,B,Aeq,Beq 是相应维数的矩阵和向量;C(x),Ceq(x)是非线性向量函数。
Matlab 中的命令是X=FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)它的返回值是向量x 。
其中,FUN 是用M 文件定义的函数f(x)。
X0是X 的初始值。
A ,B ,Aeq ,Beq 定义了线性约束AX ≪B ,Aeq*X=Beq ,如果没有线性约束,则A=[],B=[],Aeq=[],Beq=[]。
LB 和UB 是变量x 的下界和上界,如果上界和下界没有约束,则LB=[],UB=[];如果X 无下界,则LB=-inf;如果X 无上界,则UB=inf 。
NONLCON 是用M 文件定义的非线性向量函数C(x),Ceq(x)。
OPTIONS 定义了优化函数,可以使用MATLAB 默认的参数设置。
例求解下列非线性规划问题:max z= X 1+ X 2+ X 3+ X 4 s.t.x 1≪4001.1x 1+x 2≪4401.21x 1+1.1x 2+x 3≪4841.331x 1+1.21x 2+1.1x 3+x 4≪532.4X i≫0,i =1,2,3,4(1)编写M 文件,定义目标函数:function f=fun44(x)f=-(sqrt(x(1))+sqrt(x(2))+sqrt(x(3))+sqrt(x(4)) );(2)编写M 文件,定义约束条件function[g,ceq]=mycon1(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)编写主程序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,'mycon1')输出结果x =86.1883104.2879 126.1883 152.6879fval =-43.0860。
非线性规划及matlab 应用目录1.概念 ............................................................................................................................................... 1 2.二次规划........................................................................................................................................ 1 3.一般非线性规划 ............................................................................................................................ 2 4. 案例:供应与选址 . (4)1.概念定义:如果目标函数或约束条件中至少有一个是非线性函数时的最优化问题就叫做非线性规划问题.其它情况: 求目标函数的最大值或约束条件为小于等于零的情况,都可通过取其相反数化为上述一般形式.2.二次规划用MATLAB 软件求解,其输入格式如下: 1. x=quadprog(H,C,A,b); 2. x=quadprog(H,C,A,b,Aeq,beq); 3. x=quadprog(H,C,A,b,Aeq,beq,VLB,VUB); 4. x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0); 5. x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0,options); 6. [x,fval]=quadprog(...); 7. [x,fval,exitflag]=quaprog(...); 实例1:2212121122121212min (,)2622..2220,0=--+-++≤-+≤≥≥f x x x x x x x x s tx x x x x x写成标准形式标准型为: Min Z= 21X T HX+c T Xs.t. AX<=b beq X Aeq =⋅ VLB ≤X ≤VUB111222 1 -12min (,) 1 26Tx x z x x x x ⎛⎫⎛⎫⎛⎫⎛⎫-=+ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪--⎝⎭⎝⎭⎝⎭⎝⎭1212 1 121 2200x x x x ⎛⎫⎛⎫⎛⎫≤ ⎪ ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭⎛⎫⎛⎫≤ ⎪ ⎪ ⎪⎝⎭⎝⎭Matlab 命令H=[1 -1; -1 2]; c=[-2 ;-6]; A=[1 1; -1 2]; b=[2;2]; Aeq=[]; beq=[]; VLB=[0;0]; VUB=[];[x,z]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB)运算结果为:x =0.6667 1.3333 z = -8.22223.一般非线性规划标准型为:min ()..()0()0≤≤=≤≤F X s t AX bG X Ceq X VLB X VUB其中X 为n 维变元向量,G(X)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划、二次规划中相同.非线性规划求解的函数是fmincon,命令的基本格式如下: ● x=fmincon(‘fun’,X0,A,b)● x=fmincon(‘fun’,X0,A,b,Aeq,beq)● x=fmincon(‘fun’,X0,A,b, Aeq,beq,VLB,VUB)● x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’)● x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’,options) ● [x,fval]= fmincon(...)● [x,fval,exitflag]= fmincon(...)● [x,fval,exitflag,output]= fmincon(...) 1.fun 为目标函数2.x0为初始值3.A 是不等式约束AX<=b 的系数矩阵4.b 是不等式约束AX<=b 的常数项4.Aeq 是等式约束AeqX=beq 的系数矩阵,5.beq 是等式约束AeqX=beq 的常数项,6.lb 是X 的下限,7.ub 是X 的上限,8.nonlcon 为非线性不等式约束 9.option 为设置fmincon 的参数 注意:fmincon 函数提供了大型优化算法和中型优化算法。
用MATLAB优化工具包解非线性规划2.8 用MATLAB优化工具包解非线性规划用MATLAB优化工具包求解非线性规划时必须先化为如下形式:(NLP)求解程序名为fmincon,其最简单的调用格式为:x = fmincon('fun',x0,A1,b1) (用于不含有等式约束和上下解约束的问题)其最复杂的调用格式为:[x,fval,exitflag,output,lambda,grad,hessian] =fmincon('fun',x0,A1,b1,A2,b2,v1,v2,'nlcon',options,P1,P2, ...)2.8.1 程序fmincon输出变量其中输出变量的含义为:1)x :最优解2)fval :最优解处的函数值3)exitflag :程序结束时的状态指示:>0:收敛0:函数调用次数或迭代次数达到最大值(该值在options中指定)<0:不收敛4) Output: 包含以下数据的一个结构变量funcCount 函数调用次数iterations 实际迭代次数cgiterations 实际PCG迭代次数(大规模计算用)algorithm 实际使用的算法stepsize 最后迭代步长(中等规模计算用)firstorderopt 一阶最优条件满足的情况(目标函数梯度的范数)5) lambda: 包含以下数据(LAGRANGE乘子)的一个结构变量,总维数等于约束条件的个数,其非零分量对应于起作用的约束条件:ineqlin 不等式约束的LAGRANGE乘子eqlin 等式约束的LAGRANGE乘子upper 上界约束的LAGRANGE乘子lower 下界约束的LAGRANGE乘子6) grad: 目标函数梯度7) hessian: 目标函数的hessian矩阵2.8.2 程序fmincon输入参数其中输入变量的含义为:x0为初始解(缺省时程序自动取x0=0)A1,b1,A2,b2,v1,v2:含义见模型(NLP)Fun.m给出目标函数,当GradObj='on'时必须给出其梯度,当Hessian='on'时还必须给出其Jacobi矩阵,一般形式为function [f,g,H] = fun(x)f = ... % objective function valueif nargout > 1g = ... % gradient of the functionif nargout > 2H = ... % Hessian of the functionendnlcon.m给出非线性约束,GradConstr='on'时还给出梯度,一般形式为function [c1,c2,GC1,GC2] = nlcon(x)c1 = ... % nonlinear inequalities at xc2 = ... % nonlinear equalities at xif nargout > 2GC1 = ... % gradients of c1GC2 = ... % gradients of c2endoptions:包含算法控制参数的结构设定(或显示)控制参数的命令为Optimset,有以下一些用法:Optimset //显示控制参数optimset optfun //显示程序'optfun'的控制参数opt=optimset //控制参数设为[](即缺省值opt=optimset(optfun)// 设定为程序'optfun'的控制参数缺省值Opt=optimset('par1',val1,'par2',val2,...)Opt=optimset(oldopts,'par1',val1,...)opt=optimset(oldopts,newopts)可以设定的参数比较多,对fmincon,常用的有以下一些参数:Diagnostics 是否显示诊断信息('on' 或'off')Display 显示信息的级别('off' ,'iter' ,'final','notify')LargeScale 是否采用大规模算法('on' 或'off')MaxIter 最大迭代次数TolCon 约束的误差限TolFun 函数计算的误差限TolX 决策变量的误差限GradObj 目标函数是否采用分析梯度('on' ,'off')Jacobian 目标函数是否采用分析Jacob矩阵('on' ,'off')MaxFunEvals 目标函数最大调用次数GradConstr 非线性约束函数是否采用分析梯度('on' ,'off')2.8.3 注意事项fmincon中输出变量、输入参数不一定写全,可以缺省。
MATLAB⾮线性规划问题⼀.⾮线性规划课题实例1 表⾯积为36平⽅⽶的最⼤长⽅体体积。
建⽴数学模型:设x、y、z分别为长⽅体的三个棱长,f为长⽅体体积。
max f = x y (36-2 x y)/2 (x+y)实例2 投资决策问题某公司准备⽤5000万元⽤于A、B两个项⽬的投资,设x1、x2分别表⽰配给项⽬A、B的投资。
预计项⽬A、B的年收益分别为20%和16%。
同时,投资后总的风险损失将随着总投资和单位投资的增加⽽增加,已知总的风险损失为2x12+x22+(x1+x2)2.问应如何分配资⾦,才能使期望的收益最⼤,同时使风险损失为最⼩。
建⽴数学模型:max f=20x1+16x2-λ[2x12+x22+(x1+x2)2]s.t x1+x2≤5000x 1≥0,x2≥0⽬标函数中的λ≥0是权重系数。
由以上实例去掉实际背景,其⽬标函数与约束条件⾄少有⼀处是⾮线性的,称其为⾮线性问题。
⾮线性规划问题可分为⽆约束问题和有约束问题。
实例1为⽆约束问题,实例2为有约束问题。
⼆.⽆约束⾮线性规划问题:求解⽆约束最优化问题的⽅法主要有两类:直接搜索法(Search method)和梯度法(Gradient method),单变量⽤fminbnd,fminsearch,fminunc;多变量⽤fminsearch,fminnuc 1.fminunc函数调⽤格式:x=fminunc(fun,x0)x=fminunc(fun,x0,options)x=fminunc(fun,x0,options,P1,P2)[x,fval]=fminunc(…)[x,fval, exitflag]=fminunc(…)[x,fval, exitflag,output]=fminunc(…)[x,fval, exitflag,output,grad]=fminunc(…)[x,fval, exitflag,output,grad,hessian]=fminunc(…)说明:fun为需最⼩化的⽬标函数,x0为给定的搜索的初始点。
MATLAB⾮线性规划MATLAB求解⾮线性规划可以使⽤ fmincon 函数,其数学模型可以写成如下形式:x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中,fun是⽬标函数,x0是初始值,A,b 规定线性不等式约束条件,Aeq,beq 规定线性等式约束条件,lb 规定可⾏解的数值下限,ub规定可⾏解的数值上限。
nonlcon是包含⾮线性约束条件(C(x),Ceq(x))的函数。
使⽤options所指定的优化选项执⾏最⼩化。
例如,使⽤MATLAB计算如下⾮线性规划。
x0 = [0.5,0];A = [1,-2];b = 1;Aeq = [2,1];beq = 1;x = fmincon(fun,x0,A,b,Aeq,beq)带有边界约束的,例如:fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));lb = [0,0];ub = [1,2];% 没有线性约束,因此将这些参数设置为 []。
A = [];b = [];Aeq = [];beq = [];% 尝试使⽤⼀个位于区域中部的初始点。
x0 = (lb + ub)/2;x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)带有⾮线性约束的,例如:%% 主函数options=optimset('largescale','off');x = fmincon(@fun,rand(3,1),[],[],[],[],zeros(3,1),[], @nonlcon, options)%% ⽬标函数function f=fun(x)f=sum(x.^2)+8;end%% ⾮线性约束条件function [c,ceq]=nonlcon(x)c=[-x(1)^2+x(2)-x(3)^2x(1)+x(2)^2+x(3)^3-20]; %⾮线性不等式约束ceq=[-x(1)-x(2)^2+2x(2)+2*x(3)^2-3]; %⾮线性等式约束end特别注意:⽬标函数为最⼩化函数,fun是⼀个函数,fun接受向量或数组 x,并返回实数标量 f,即在 x 处计算的⽬标函数值。
用Matlab 求解非线性规划1.无约束优化问题)(min x f n Rx ∈,其中向量x 的n 个分量i x 都是决策变量,称)(x f 目标函数。
用Matlab 求解:先建立函数文件mbhs.m ,内容是)(x f 的表达式;再回到Matlab 命令区输入决策变量初值数据x0,再命令[x,fmin]=fminunc(@mbhs,x0) 如:)32(m in 22212x x R x +∈的最优解是.)0,0(T x = 用Matlab 计算,函数文件为 function f=mbhs(x)f=2*x(1)^2+3*x(2)^2;再输入初值 x0=[1;1]; 并执行上述命令,结果输出为 x =? fmin =? 略。
2.约束优化问题.),,...,2,1(,0)(),,...,2,1(,0)(..)(min U x L m i x h p i x g t s x f i i Rx n ≤≤===≤∈其中:向量x 的n 个分量i x 都是决策变量,称)(x f 目标函数、)(x g i 等式约束函数、)(x h i 不等式约束函数、L 下界、U 上界。
用Matlab 求解:先把模型写成适用于Matlab 的标准形式.,0)(,0)(,,..)(min U x L x h x g beq x Aeq b Ax t s x f n Rx ≤≤=≤=≤∈ 约束条件中:把线性的式子提炼出来得前两个式子;后三个式子都是列向量。
(如:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡===⨯⨯)()()([],[],,,11262x g x g x g beq Aeq b A p )再建立两个函数文件:目标函数mbhs.m ;约束函数yshs.m再回到Matlab 命令区,输入各项数据及决策变量初值数据x0,执行命令[x,fmin]=fmincon(@mbhs,x0,A,b,Aeq,beq,L,U,@yshs)例:单位球1222≤++z y x 内,曲面xy y x z 1.05.022--+=的上方,平面008.0=-++z y x 之上(不是上面),满足上述三个条件的区域记为D ,求函数)1cos()sin(2-+-+-z e z y x e xy xyz 在D 上的最大值、最大值点。