第三章:非线性规划

3.1 非线性规划模型

定义:目标函数或约束条件中包含非线性函数
一般形式:
在这里插入图片描述
与线性规划区别:线性规划的最优解只能在可行域的边界达到,而非线性规划的最优解可能在可行域上的任意一点。
matlab标准型:

c(x),ceq(x)为非线性向量函数
例程:

%目标函数
function f=fun1(x);
f=sum(x.^2)+8;
%定义非线性约束条件
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]; %非线性等式约束
%主程序,利用函数fmincon
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')

3.2 无约束问题

符号解

clc, clear
syms x y
f=x^3-y^3+3*x^2+3*y^2-9*x;%目标函数
df=jacobian(f);  %求一阶偏导数
d2f=jacobian(df); %求Hessian阵(二阶导数阵)
[xx,yy]=solve(df)  %求驻点
xx=double(xx);yy=double(yy); 
%转化成双精度浮点型数据,下面判断特征值的正负,必须是数值型的数据
for i=1:length(xx)
    a=subs(d2f,{x,y},{xx(i),yy(i)});  
    b=eig(a);  %求矩阵的特征值
    f=subs(f,{x,y},{xx(i),yy(i)}); f=double(f); 
    if all(b>0)
        fprintf('(%f,%f)是极小值点,对应的极小值为%f\n',xx(i),yy(i),f);
    elseif all(b<0)
        fprintf('(%f,%f)是极大值点,对应的极大值为%f\n',xx(i),yy(i),f);
    elseif any(b>0) & any(b<0)
        fprintf('(%f,%f)不是极值点\n',xx(i),yy(i));
    else
        fprintf(无法判断(%f,%f)是否是极值点\n',xx(i),yy(i));  
    end
end

数值解

clc, clear
f=@(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);  
%定义匿名函数
g=@(x) -f(x);
[xy1,z1]=fminunc(f, rand(2,1))  %求极小值点
[xy2,z2]=fminsearch(g,rand(2,1)); %求极大值点,只能求出初值附近的一个极小值点
xy2, z2=-z2

  f 利用Hessian求解,加入优化参数

%目标函数的Hessian阵
function [f,df,d2f]=fun4(x);
f=100*(x(2)-x(1)^2)^2+(1-x(1))^2;
df=[-400*x(1)*(x(2)-x(1)^2)-2*(1-x(1));200*(x(2)-x(1)^2)];
d2f=[-400*x(2)+1200*x(1)^2+2,-400*x(1)
    -400*x(1),200];
options = optimset('GradObj','on','Hessian','on');
[x,y]=fminunc('fun4',rand(1,2),options)

函数零点和方程组的解

clc, clear
xishu=[1 -1 2 -3];
%多项式是用向量定义的,系数从高次幂到低次幂排列
x0=roots(xishu)

  符号求解

syms x
x0=solve(x^3-x^2+2*x-3) %求函数零点的符号解
x0=vpa(x0,5)  %化成小数格式的数据

  数值求解

y=@(x) x^3-x^2+2*x-3;
x=fsolve(y,rand)  %只能求给定初始值附近的一个零点

3.3 约束极值问题

约束极值问题(规划问题):带有约束条件的极值问题

  1. 二次规划
    定义:非线性规划的目标函数为自变量x的二次函数,约束条件全是线性
    matlab标准型:
    在这里插入图片描述
    例程:
    在这里插入图片描述
h=[4,-4;-4,8];%实对称矩阵
f=[-6;-3];
a=[1,1;4,1];
b=[3;9];
[x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
  1. 罚函数法
    序列无约束最小化技术:将非线性规划问题转化为无约束极值问题
    在这里插入图片描述
    对如上问题,取一个充分大的数M>0,构造函数
    在这里插入图片描述
    例程:
    在这里插入图片描述
function g=test3(x);
M=50000;
f=x(1)^2+x(2)^2+8;
g=f-M*min(min(x),0)-M*min(x(1)^2-x(2),0)+M*(-x(1)-x(2)^2+2)^2;
[x,y]=fminsearch('test3',rand(2,1))
  1. 各种函数
    [x, fval] = fminbnd(fun, x1, x2, options)
    在这里插入图片描述
function f=fun6(x);
f=(x-3)^2-1;
[x,y]=fminbnd('fun6',0,5)

[x, fval] = fseminf(fun, x0, ntheta, seminfcon, A, b, Aeq, beq, lb, ub)
在这里插入图片描述
在这里插入图片描述

%目标函数
function f=fun7(x,s);
f=sum((x-0.5).^2);
%约束条件
function [c,ceq,k1,k2,s]=fun8(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))-1/1000*(w1-50).^2-sin(w1*x(3))-x(3)-1;
k2=sin(w2*x(2)).*cos(w2*x(1))-1/1000*(w2-50).^2-sin(w2*x(3))-x(3)-1;
%画出半无穷约束的图形
plot(w1,k1,'-',w2,k2,'+');
%调用函数fseminf
x0 = [0.5; 0.2; 0.3]; %如果初始值取的不合适,可能就得不到可行解
[x,y]=fseminf(@fun7,x0,2,@fun8)

[x, fval] = fminimax(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon, options)
在这里插入图片描述求上式取极小-极大值时的x值

%定义向量函数
function f=fun9(x);
f=[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304
    -x(1)^2-3*x(2)^2
    x(1)+3*x(2)-18
    -x(1)-x(2)
    x(1)+x(2)-8];
%调用函数求解
[x,y]=fminimax(@fun9,rand(2,1))
  1. 梯度求解
    在这里插入图片描述
%定义目标函数及梯度函数
function [f,df]=fun10(x);
f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);
df=[exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+8*x(1)+6*x(2)+1);exp(x(1))*(4*x(2)+4*x(1)+2)];
%定义约束条件及其梯度函数
function [c,ceq,dc,dceq]=fun11(x);
c=[x(1)*x(2)-x(1)-x(2)+1.5;-x(1)*x(2)-10];
dc=[x(2)-1,-x(2);x(1)-1,-x(1)];
ceq=[];dceq=[];
%调用函数求解
options=optimset('GradObj','on','GradConstr','on');
[x,y]=fmincon(@fun10,rand(2,1),[],[],[],[],[],[],@fun11,options)
  1. 在命令行窗口中输入optimtool,利用优化工具箱求解

3.4 飞行管理问题

求解方法及过程此处不再赘述,书中已经讲得很清楚。本文对模型一中得到的数学规划模型记性程序实现:
在这里插入图片描述

clc,clear
x0=[150 85 150 145 130 0];
y0=[140 85 155 50 150 0];
q=[243 236 220.5 159 230 52];
xy0=[x0; y0];
d0=dist(xy0);   %求矩阵各个列向量之间的距离
d0(find(d0==0))=inf;
a0=asind(8./d0)  %以度为单位的反函数
xy1=x0+i*y0
xy2=exp(i*q*pi/180)
for m=1:6
     for n=1:6
         if n~=m
         b0(m,n)=angle((xy2(n)-xy2(m))/(xy1(m)-xy1(n))); 
         end
     end
end
b0=b0*180/pi;
dlmwrite('txt1.txt',a0,'delimiter', '\t','newline','PC');
dlmwrite('txt1.txt','~','-append');       %往纯文本文件中写数据的分隔符
dlmwrite('txt1.txt',b0,'delimiter', '\t','newline','PC','-append','roffset', 1)
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值