非线性规划

非线性规划还没有适用于各种问题的一般算法,各个方法都有自己特定的适用范围。

对一个实际问题把它归结为非线性规划问题时,一般要注意以下几点:

  • 确认供选方案:收集与问题有关的资料,全面熟悉问题后,确认供选方案,并用一组变量表示它们
  • 提出追求目标:极小化或者极大化目标,用数学关系式表示
  • 给出价值标准:要确立所考虑的目标“好”或“坏”的价值标准
  • 寻求限制条件:用等式或者不等式表示

非线性规划的MATLAB解法:

min f(x)             

\left\{\begin{matrix}Ax\leqslant B \\ Aeq\cdot x=Beq \\ C(x)\leqslant 0 \\ Ceq(x) = 0 \end{matrix}\right.

MATLAB中的命令是:

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

A,B,Aeq,Beq定义了线性约束,

NONLCON是用M文件定义的非线性向量函数C(X),Ceq(X)。

求解非线性规划的基本迭代格式

对于非线性规划模型(NP),可以采用迭代方法求解它的最优解。

x^{k} \in R^{n}是某迭代方法的第k轮迭代点,x^{k+1} \in R^{n}是第k+1轮迭代点,记:

x^{k+1}=x^{k}+t_{k}p^{k}(求解非线性规划模型的基本迭代格式)

这里t^{k} \in R^{1}p^{k} \in R^{n}\begin{Vmatrix} p^{k} \end{Vmatrix}=1,并且p^{k}的方向是从点x^{k}向着点x^{k+1}的方向。

 无约束极值问题的解法:

无约束极值问题可表述为:min f(x), x \in E^{(n)},求解该问题的迭代法分为两点:

1、解析法:用到函数的一阶导数或者二阶导数

1.1、梯度法(最速下降法)

p^{k}=-\triangledown f(x^{k})

每轮从点x^{k}出发沿最速下降的方向-\triangledown f(x^{k})作一维搜索,来建立求解无约束极值问题的方法。

具体步骤:

1)、选取初始数据。选取初始点x0,给定终止误差,令k=0

2)、求梯度方向\triangledown f(x^{k}),若\begin{Vmatrix} \triangledown f(x^{k}) \end{Vmatrix}< \varepsilon,停止迭代,输出x^{k},否则进入第三部

3)、构造负梯度方向。p^{k}=-\triangledown f(x^{k})

4)、进行一维搜索。求t_{k},使得f(x^{k}+t_{k}p^{k}) = min(f(x^{k}+t_{k}p^{k})) (t\geqslant 0)

x^{k+1}=x^{k}+t_{k}p^{k},k=k+1,到第二步

function [ f,df ] = detaf(x)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
f = x(1)^2+25*x(2)^2;
df = [2*x(1)
    50*x(2)];
end

clear all;clc;
x=[2;2];
[f0,g] = detaf(x);
while norm(g)>0.000001
    p = -g/norm(g);
    t=1.0;f = detaf(x+t*p);
    while f>f0
        t=t/2;
        f=detaf(x+t*p);
    end
    x=x+t*p;
    [f0,g] = detaf(x);
end

1.2、Newton法

 p^{k}=-[\triangledown ^{2}f(x^{k})]^{-1} \triangledown f(x^{k}),并去步长t_{k}=1

通常,把方向p^{k}叫做从点x^{k}出发的Newton方向

具体步骤:

1)、选取初始数据。选取初始点x0,给定终止误差\varepsilon> 0,令k=0

2)、求梯度方向\triangledown f(x^{k}),若\begin{Vmatrix} \triangledown f(x^{k}) \end{Vmatrix}< \varepsilon,停止迭代,输出x^{k},否则进入第三部

3)、构造Newton方向,取p^{k}=-[\triangledown ^{2}f(x^{k})]^{-1} \triangledown f(x^{k}),计算[\triangledown ^{2}f(x^{k})]^{-1}

4)、进行一维搜索。求t_{k},使得f(x^{k}+t_{k}p^{k}) = min(f(x^{k}+t_{k}p^{k})) (t\geqslant 0)

x^{k+1}=x^{k}+t_{k}p^{k},k=k+1,到第二步

function [ f,df ,d2f] = nwfun(x)
%UNTITLED3 此处显示有关此函数的摘要
%   此处显示详细说明
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;2*x(1)^2*x(2) + 100*x(2)^3];
d2f = [12*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];
end

clear all;clc;
x = [2;2];
[f0,g1,g2] = nwfun(x);
while norm(g1)>0.00001
    p = -inv (g2)*g1;
    x = x+p;
    [f0,g1,g2] = nwfun(x);
end

%-----------------------------优化
%为了提高精度,可以采用变步长计算
clear all;clc;
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

2、直接法:仅用到函数值

MATLAB求无约束极值问题

[X,FVAL]=FMINUNC(FUN,X0,OPTIONS,P1,P2......)

返回的X是所求的极小值点,FVAL是函数的极小值。

FUN是一个M文件。

当FUN只有一个返回值时,它的返回值是函数f(x);

当FUN只有两个返回值时,它的第二个返回值是函数f(x)的梯度向量;

当FUN只有三个返回值时,它的第三个返回值是f(x)的二阶导数阵;

X0是向量x的初始值,OPTIONS是优化参数,可以使用缺省参数,P1,P2是传递给FUN的一些参数。

function [f,df,d2f] = fun3( x )
%UNTITLED8 此处显示有关此函数的摘要
%   此处显示详细说明
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];
end

[x,y] = fminunc('fun3',rand(1,2))

求多元函数的极值也可以使用MATLAB的fminsearch

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

function f = fun(x)
%UNTITLED11 此处显示有关此函数的摘要
%   此处显示详细说明
f = sin(x)+3
end

clear all;
clc;
x0 = 2;
[x,y] = fminsearch(@fun,x0);

 约束极值问题

带有约束条件的极值问题称为约束极值问题,也叫做规划问题。可以将约束问题化为无约束问题;将非线性规划问题,化为线性规划问题;将复杂问题变为较简单问题的其他方法。

1.1 二次规划:目标函数为自变量x的二次函数,约束条件全是线性的。

MATLAB中求解二次规划的命令:

min \frac{1}{2}x^{T}Hx+f^{T}x

s.t.\left\{\begin{matrix}Ax\leqslant b \\ Aeq\cdot x=beq \end{matrix}\right.

H是实对称矩阵,f,b是列向量,A是相应维数的矩阵。

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

\left\{\begin{matrix}min f(x)=2x_{1}^{2}-4x_{1}x_{2}+4x_{2}^{2}-6x_{1}-3x_{2} \\ x_{1}+x_{2}\leqslant 3 \\ 4x_{1}+x_{2}\leqslant 9 \\ x_{1},x_{2}\geqslant 0 \end{matrix}\right.

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))
x =

    1.9500
    1.0500


value =

  -11.0250

 1.2 罚函数法(序列无约束最小化技术/SUMT):将非线性规划问题的求解,转化为求解一系列无约束极值问题

主要有两种形式:外罚函数法,内罚函数法。下面介绍外罚函数法:

考虑问题:

min f(x)

s.t.\left\{\begin{matrix}g_{i}(x)\leqslant 0,i=1,...,r \\ h_{j}(x)\geqslant 0,j=1,...,s \\ k_{m}(x)= 0,m=1,...,t \end{matrix}\right.

取一个充分大的数M>0,构造函数

P(x,M)=f(x)+M\sum_{i=1}^{r}max(g_{i}(x),0)-M\sum_{i=1}^{s}min(h_{i}(x),0)+M\sum_{i=1}^{t}\begin{vmatrix} k_{i}(x) \end{vmatrix}

或者

P(x,M)=f(x)+Msum\bigl(\begin{smallmatrix} max\begin{pmatrix} G(x)\\0 \end{pmatrix} \end{smallmatrix}\bigr)-Msum\begin{pmatrix} min\begin{pmatrix} H(x)\\0 \end{pmatrix} \end{pmatrix}+M\begin{Vmatrix} K(x) \end{Vmatrix}

这里G(x)=[g_{1}(x),g_{2}(x),...,g_{r}(x)], H(x)=[h_{1}(x),...,h_{s}(x)], K(x)=[{k_{1}(x),...,k_{t}(x)}] 

以增广目标函数P(x,M)为目标函数的无约束极值问题

最后在MATLAB命令框窗口输入:

[x,y]=fminunc('函数名',rand(2,1))(2为未知数的个数)

MATLAB求解约束极值问题

1、fminbnd函数

非线性函数f(x)在区间上的极小值

[X,FVAL]=FMINBND(FUN,x1,x2,OPTIONS)    (区间为[x1,x2])

2、fseminf函数

min \begin{Bmatrix} F(x)|C(x)\leqslant 0,Ceq=0,PHI(x,w)\leq 0 \end{Bmatrix}

s.t.\left\{\begin{matrix} Ax\leqslant B\\Aeq\cdot x=Beq \end{matrix}\right.

X=FSEMINF(FUN,X0,NTHETA,SEMINFCON,A,B,Aeq,Beq)

FUN是用于定义目标函数F(x)

X0为初始值

NTHETA半无穷约束PHI(x,w)的个数

函数SEMINFCON用于定义非线性约束不等式C(x),非线性等式约束Ceq(x)和半无穷约束PHI(x,w)的每一个分量函数

3、fminimax函数

求解

\min_{x}\begin{Bmatrix}\max_{F_{i}}F(x) \end{Bmatrix}

s.t.\left\{\begin{matrix} Ax\leqslant b\\Aeq\cdot x=Beq \\ C(x)\leqslant 0 \\ Ceq(x)=0 \\ LB\leq x\leq UB \end{matrix}\right.

其中F(x)=\begin{Bmatrix} F_{1}(x),...,F_{m}(x) \end{Bmatrix}

MATLAB命令为

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

function f=fun(x)
%UNTITLED14 此处显示有关此函数的摘要
%   此处显示详细说明
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]
end


[x,y]=fminimax(@fun,rand(2,1))
x

x =

    4.0000
    4.0000

y

y =

    0.0000
  -64.0000
   -2.0000
   -8.0000
   -0.0000

猜你喜欢

转载自blog.csdn.net/CSDN___CSDN/article/details/81218014