欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

非线性规划

程序员文章站 2022-06-13 16:35:08
...

一、非线性规划的 Matlab 解法

X=FMINCON(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS)

Matlab 中非线性规划的数学模型写成以下形式:

                    非线性规划

                    非线性规划

其中 f(x) 是标量函数,A,B,Beq Aeq 是相应维数的矩阵和向量,C(x),Ceq(x) 是非

线性向量函数。它的返回值是向量 x ,其中 FUN 是用 M 文件定义的函数 f(x),x0是 x 的

初始值;A,B,Aeq,Beq 定义了线性约束   A*X非线性规划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 缺省的参数设置。

 非线性规划

        非线性规划

%fun1.m 定义目标函数
function f=fun1(x);
f=sum(x.^2)+8;

%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]; %非线性等式约束

%主程序文件 example2.m 如下:
options=optimset('largescale','off');
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[], ...
'fun2', options)

二、无约束极值问题的解法

1、最快下降法

  • 选取初始数据。选取初始点 非线性规划,给定终止误差非线性规划,令k:=0.
  • 求梯度向量。计算非线性规划,若 非线性规划 停止迭代,输出非线性规划,否则进行第三步.
  • 构造负梯度方向。取

                     非线性规划

  • 进行一维搜索。求 非线性规划 ,使得

                    非线性规划

         令 非线性规划,转第二步

 eg.用最速下降法求解无约束非线性规划问题

     非线性规划  ,其中  非线性规划  ,要求选取初始点  非线性规划

%detaf.m定义函数f(x)及其梯度列向量
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)>0.000001  %=norm(g,2)求g的2范数,类似求当前点距离最低点的长度
    p=-g/norm(g);
    t=1.0;
    f=detaf(x+t*p);
    while f>f0 %调整跨度t的大小
        t=t/2;
        f=detaf(x+t*p);
    end
    x=x+t*p; %跨步,更新x,f0
    [f0,g]=detaf(x);
end
x,f0

2、Newton法

  • 选取初始数据。选取初始点 非线性规划,给定终止误差非线性规划,令k:=0.
  • 求梯度向量。计算非线性规划,若 非线性规划 停止迭代,输出非线性规划,否则进行第三步.
  • 构造Newton方向。计算 非线性规划 ,取

           非线性规划

  • 求下一迭代点。令非线性规划  ,转第二步

  2-eg.     非线性规划    ,选取非线性规划

   解:    非线性规划

              非线性规划

%nwfun.m 求f(x)的一阶和二阶偏导
function [f,df,d2f]=nwfun(x);
f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2;
df=[4*x(1)^3+2*x(1)*x(2)^2;100*x(2)^3+2*x(1)^2*x(2)];
d2f=[2*x(1)^2+2*x(2)^2,4*x(1)*x(2)
4*x(1)*x(2),300*x(2)^2+2*x(1)^2];

%newton.m 牛顿迭代法,优点是收敛速度快;缺点是有时不好用而需采取改进措施
clc,clear
x=[2;2];
[f0,g1,g2]=nwfun(x);
while norm(g1)>0.00001
p=-inv(g2)*g1;p=p/norm(p);
t=1.0;f=nwfun(x+t*p);
while f>f0
t=t/2;f=nwfun(x+t*p);
end
x=x+t*p;
[f0,g1,g2]=nwfun(x);
end
x,f0

三、Matlab 求无约束极值问题

  • [X,FVAL]=FMINUNC(FUN,X0,OPTIONS,P1,P2, ...)
  • [X,FVAL,EXITFLAG,OUTPUT]=FMINSEARCH(FUN,X0,OPTIONS,P1,P2,...)

  其中的返回值 X 是所求得的极小点,FVAL 是函数的极小值

四、约束极值问题

 带有约束条件的极值问题称为约束极值问题,也叫规划问题。

 1、若某非线性规划的目标函数为自变量 x 的二次函数,约束条件又全是线性的,就称
   这种规划为二次规划。

   Matlab 中二次规划的数学模型可表述如下:

              非线性规划

               非线性规划

   这里 H 是实对称矩阵, b f , 是列向量, A 是相应维数的矩阵。Matlab 中求解二次规划的命令是:

        [X,FVAL]= QUADPROG(H,f,A,b,Aeq,beq,LB,UB,X0,OPTIONS)

        非线性规划

%二次规划
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))

2、fminimax 函数

   X=FMINIMAX(FUN,X0,A,B,Aeq,Beq,LB,UB,NONLCON)

   求解    非线性规划 

    非线性规划