目标函数极值求解的几种方法

来源:互联网 发布:国美淘宝 编辑:程序博客网 时间:2024/05/15 01:38

  目标函数极值求解的几种方法

题目:min(x1-2)2+2(x2-1)2,取初始点x1=(1,3)T,分别用最速下降法,拟牛顿法和共轭梯度法编程实现。 

程序:

%精确一维搜索法的子函数,0.618(黄金分割)法,gold.m

%输入的变量x为初始迭代点是二维的向量,d为初始迭代方向是二维的向量

%输出变量是在[0,10]区间上使函数取得极小值点的步长因子

function alfa=gold(x,d)

a=0;b=10;tao=0.618;

lanmda=a+(1-tao)*(b-a);

mu=a+tao*(b-a);alfa=lanmda;%初始化

f=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;%目标函数

m=f;alfa=mu;n=f;

while 1

    if m>n

        if abs(lanmda-b)<1e-4

            alfa=mu;   return

        else

            a=lanmda;  lanmda=mu;  m=n;

            mu=a+tao*(b-a);   alfa=mu;

            n=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;

        end

    else

        if abs(mu-a)<1e-4

            alfa=lanmda;    return

        else

            b=mu;  mu=lanmda; n=m;

            lanmda=a+(1-tao)*(b-a);   alfa=lanmda;

            m=((x(1)+alfa*d(1))-2)^2+2*(x(2)+alfa*d(2)-1)^2;

        end

    end

end

%梯度子函数,tidu.m,输入的变量为二维的向量,返回梯度在x处的数值向量

function g=tidu(x)

 %待求解的函数

 f=(x(1)-2)^2+2*(x(2)-1)^2;

 %求函数的梯度表达式

 g=[2*(x(1)-2) 4*(x(2)-1)];

 x1=x(1); x2=x(2);

%最速下降法极小化函数的通用子函数zuisu.m

%输入变量为初始的迭代点,输出变量为极小值点

function x0=zuisu(x)

%判断梯度范数是否满足计算精度1e-4的要求.,标志变量设为1,输出结果;

%,标志变量设为0

if sum(abs(tidu(x)).^2)<1e-4

    flag=1; x0=x;

else

    flag=0;

end

%循环求解函数的极小点

while flag==0

    d=-tidu(x);    a=gold(x,d);    x=x+a*d

 %判断梯度范数是否满足计算精度的要求.,标志变量设为1,输出结果;

 %,标志变量设为0,继续迭代

    if sum(abs(tidu(x)).^2)<1e-4

        flag=1;  x0=x;

    else

        flag=0;

    end

End

 

%拟牛顿法极小化函数的通用子函数,gonge.m

%输入变量为初始的迭代点,输出变量为极小值点

function x0=ninewton(x)

%判断梯度范数是否满足计算精度的要求.,标志变量设为1,输出结果;

%,标志变量设为0,继续迭代

if sum(abs(tidu(x)).^2)<1e-4

    flag=1    x0=x;

else

    flag=0;

end

%初始的H矩阵为单位矩阵

h0=eye(2);

%循环求解函数的极小点

while flag==0

    %计算新的迭代方向

    d=-h0*tidu(x)';    a=gold(x,d);

    x1=(x'+a*h0*d)';    s=x1-x;

    y=tidu(x1)-tidu(x);    v=s*y';

    %校正H矩阵

    h0=(eye(2)-s'*y./v)*h0*(eye(2)-y'*s./v)+s'*s./v;

    %判断下一次和上一次迭代点之差是否满足计算精度的要求.,标志变量设为1,输出结果;,标志变量设为0,继续迭代

    if sum(abs(x-x1).^2)<1e-4

       flag=1;  x0=x;

    else

       flag=0;

    end

    x=x1

end

 

%共轭剃度法极小化函数的通用子函数,gonge.m

%输入变量为初始的迭代点,输出变量为极小值点

function x0=gonge(x)

%判断梯度范数是否满足计算精度的要求.,标志变量设为1,输出结果;

%,标志变量设为0,继续迭代

if sum(abs(tidu(x)).^2)<1e-4

    flag=1;    x0=x;

else

    flag=0;

end

%第一次的迭代方法为负梯度方向

d1=-tidu(x);a=gold(x,d1);x1=x+a*d1;

%循环求解函数的极小点

while flag==0

    g1=tidu(x);    g2=tidu(x1);

    %利用FR公式求解系数bata

    bata=(g2*g2')/(g1*g1');

    d2=-g2+bata*d1;

    a=gold(x1,d2);

    x=x1;

    x1=x+a*d2

    %判断下一次和上一次迭代点之差是否满足计算精度的要求.,标志变量设为1,输出结果;,标志变量设为0,继续迭代

    if sum(abs(x1-x).^2)<1e-4

       flag=1;       x0=x1;

    else

       flag=0;

    end

end 

原创粉丝点击