matlab-最速下降法,牛顿法,修正牛顿法,共轭梯度法,DFP法,坐标轮换发,单纯形法

最速下降法迭代步骤:

最速下降法matlab实现:

x0 = [2;2];
e=0.01;
A=[2,0;0,50];
f0=f(x0);
g0=g(x0);
temp=g0(1)*g0(1)+g0(2)*g0(2);
while temp>e*e
    x = x0-(g0.'*g0)/(g0.'*A*g0)*g0;
    g0 = g(x);
    temp=g0(1)*g0(1)+g0(2)*g0(2);
    if(temp<=e*e)
        break
    end
    x0 = x;
end
x
f(x)

function s = f(x)
s=x(1)*x(1)+25*x(2)*x(2);
end

function s = g(x)
s=[2*x(1);50*x(2)];
end

实验结论:

Newton法迭代步骤:

Newton法matlab实现:

x0 = [0;0];
e=0.01;
G=[2,-1;-1,2];
G1=inv(G);
f0=f(x0);
g0=g(x0);
temp=g0(1)*g0(1)+g0(2)*g0(2);
while temp>e*e
    x = x0-G1*g0;
    g0 = g(x);
    temp=g0(1)*g0(1)+g0(2)*g0(2);
    if(temp<=e*e)
        break
    end
    x0 = x;
end
x
f(x)

function s = f(x)
s=60-10*x(1)-4*x(2)+x(1)*x(1)+x(2)*x(2)-x(1)*x(2);
end

function s = g(x)
s=[-10+2*x(1)-x(2);-4+2*x(2)-x(1)];
end

实验结论:

修正Newton法迭代步骤:

修正Newton法matlab实现:

x0 = [0;0];
e=0.01;
G=[8,0;0,4];
G1=inv(G);
f0=f(x0);
g0=g(x0);
temp=g0(1)*g0(1)+g0(2)*g0(2);
while temp>e*e
    p0 = -G1*g0;
    t0 = (-8*x0(1)*p0(1)-8*p0(1)-4*x0(2)*p0(2)+4-(p0(1)+p0(2)))/(8*p0(1)*p0(1)+4*p0(2)*p0(2));
    x = x0+t0*p0;
    g0 = g(x);
    temp=g0(1)*g0(1)+g0(2)*g0(2);
    if(temp<=e*e)
        break
    end
    x0 = x;
end
x
f(x)

function s = f(x)
s=4*(x(1)+1)*(x(1)+1)+2*(x(2)-1)*(x(2)-1)+x(1)+x(2)+10;
end

function s = g(x)
s=[8*x(1)+9;4*x(2)-3];
end

实验结论:

 

共轭梯度法迭代步骤:

共轭梯度法matlab实现:

x0 = [1;1];
e=0.01;
f0=f(x0);
g0=g(x0);
temp=g0(1)*g0(1)+g0(2)*g0(2);
while temp>e*e
    p0 = -g0;
    t0 = (-4*x0(1)*p0(1)-2*x0(2)*p0(2)+x0(1)*p0(2)+x0(2)*p0(1))/(4*p0(1)*p0(1)+2*p0(2)*p0(2)-2*p0(1)*p0(2));
    x = x0+t0*p0;
    gg = g(x);
    temp1=gg(1)*gg(1)+gg(2)*gg(2);
    lamda = gg/g0;
    p=-gg+lamda*p0;
    t = (-4*x(1)*p(1)-2*x(2)*p(2)+x(1)*p(2)+x(2)*p(1))/(4*p(1)*p(1)+2*p(2)*p(2)-2*p(1)*p(2));
    x0 = x+t*p;
    g0=g(x0);
    temp=g0(1)*g0(1)+g0(2)*g0(2);
    if(temp<=e*e)
        break
    end
    t0 = t;
    p0 = p;
end
x0
f(x0)

function s = f(x)
s=2*x(1)*x(1)+x(2)*x(2)-x(1)*x(2);
end

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

实验结论:

选取初始点(0,0)

选取初始点(0,1)

选取初始点(1,1)

DFP法迭代步骤:

DFP法matlab实现:

x0 = [8;9];
e=0.01;
f0=f(x0);
g0=g(x0);
t=g(x0);
temp=t(1)*t(1)+t(2)*t(2);
H0=[1,0;0,1];
while temp>e*e
    p0=-g0;
    tk=(-8*x0(1)*p0(1)+40*p0(1)-2*x0(2)*p0(2)+12*p0(2))/(8*p0(1)*p0(1)+2*p0(2)*p0(2));
    x=x0+tk*p0;
    ff=f(x);
    gg=g(x);
    t=g(x);
    temp1=t(1)*t(1)+t(2)*t(2);
    if(temp1<=e*e)
        break
    end
    s=x-x0;
    y=gg-g0;
    H0=H0+(s*s.')/(s.'*y)-(H0*y*y.'*H0)/(y.'*H0*y);
    p0=-H0*gg;
    x0=x;
    tk=(-8*x0(1)*p0(1)+40*p0(1)-2*x0(2)*p0(2)+12*p0(2))/(8*p0(1)*p0(1)+2*p0(2)*p0(2));
    x=x0+tk*p0;
    ff=f(x);
    gg=g(x);
    t=g(x);
    temp1=t(1)*t(1)+t(2)*t(2);
    if(temp1<=e*e)
        break
    end
    s=x-x0;
    y=gg-g0;
    H0=H0+(s*s.')/(s.'*y)-(H0*y*y.'*H0)/(y.'*H0*y);
    p0=-H0*gg;
    x0=x;
    f0=ff;
    g0=gg;
end
x
f(x)

function s = f(x)
s=4*(x(1)-5)*(x(1)-5)+(x(2)-6)*(x(2)-6);
end

function s = g(x)
s=[8*x(1)-40;2*x(2)-12];
end

实验结论:

坐标轮换法迭代步骤:

坐标轮换法matlab实现:

x0 = [0;0];
e=0.1;
e1=[1;0];
e2=[0;1];
while 1
    p=e1;
    t0 = (-2*x0(1)*p(1)-2*x0(2)*p(2)+x0(1)*p(2)+x0(2)*p(1)+10*p(1)+4*p(2))/(2*p(1)*p(1)+2*p(2)*p(2)-2*p(1)*p(2));
    x = x0+t0*p;
    p=e2;
    t0 = (-2*x(1)*p(1)-2*x(2)*p(2)+x(1)*p(2)+x(2)*p(1)+10*p(1)+4*p(2))/(2*p(1)*p(1)+2*p(2)*p(2)-2*p(1)*p(2));
    x = x+t0*p;
    if(x(1)-x0(1))*(x(1)-x0(1))+((x(2)-x0(2))*(x(2)-x0(2))<=e*e)
        break
    end
    x0 = x;
end
x
f(x)

function s = f(x)
s=x(1)*x(1)+x(2)*x(2)-x(1)*x(2)-10*x(1)-4*x(2)+60;
end

实验结论:

单纯形法迭代步骤:

单纯形法matlab实现:

x=zeros(2,3);
x(:,1) = [0;0];
x(:,2) = [0.965; 0.259];
x(:,3) = [0.259; 0.965];
e=0.1;
a = 1.1;
b = 0.5;
while 1
    [~,l]=min([f(x(:,1)),f(x(:,2)),f(x(:,3))]);
    [~,h]=min([f(x(:,1)),f(x(:,2)),f(x(:,3))]);
    xl=x(:,l);
    xh=x(:,h);
    for i =1:3
        if (i ~= l) && (i ~= h)
            g = i;
            break;
        end
    end
    xg = x(:,g);
    x1 = 0.5 *(xg+xl-2*xh);
    x2 = 2*x1 - xh;
    if f(x2)< f(xl)
        x3 = x1 + a*(x2-x1);
        if(f(x3)<f(x2))
            x(:,h)=x3;
        else
            x(:,h)=x2;
        end
    elseif (f(xl)<=f(x2) && f(x2)<f(xg))
        x(:,h)=x2;
    elseif (f(xl)<=f(x2) && f(x2)<f(xh))
        x4 = x1+b(x2-x1);
        x(:,h)=x4;
    elseif f(x2)>=f(xh)
        x5 = x1+b*(xh-x1);
        if f(x5)>=f(xh)
            for i = 1:3
                if i ~= l
                    x(:,i) = 0.5*(x(:,i)+xl);
                end
            end
        else
            x(:,h)=x5;
        end
    end
    if (f(x(:,1))-f(xl))*(f(x(:,1))-f(xl))+(f(x(:,2))-f(xl))*(f(x(:,2))-f(xl))+(f(x(:,3))-f(xl))*(f(x(:,3))-f(xl))<=e
        x=xl;
        break
    end
end
x
f(x)

function s = f(x)
s=x(1)*x(1)+2*x(2)*x(2)-4*x(1)-8*x(2)+5;
end

实验结论:

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
我的思路是这样的: 最速下降法能找出全局最优点,但在接近最优点的区域内就会陷入“齿型”迭代中,使其每进行一步迭代都要花掉非常久的时间,这样长久的等待是无忍受的,不信你就在我那个程序的第一步迭代中把精度取得很小如:0.000000001等,其实我等过一个钟都没有什么结果出来。 再者我们考究一下 牛顿迭代求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也有缺点,就是要求的初始值非常严格,如果取不好,逼近的最优解将不收敛,甚至不是最优解。 就算收敛也不能保证那个结就是全局最优解,所以我们的出点应该是:为牛顿法找到一个好的初始点,而且这个初始点应该是在全局最优点附近,这个初始点就能保证牛顿法高精度收敛到最优点,而且速度还很快。 思路概括如下: 1。用最速下降法在大范围找到一个好的初始点给牛顿法:(最速下降法在精度不是很高的情况下逼近速度也是蛮快的) 2。在最优点附近改用牛顿法,用最速下降法找到的点为牛顿法的初始点,提高逼近速度与精度。 3。这样两种方相结合,既能提高逼近的精度,还能提高逼近的速度,而且还能保证是全局最优点。这就充分吸收各自的优点,扬长避短。得到理想的结果了。
牛顿-共轭梯度法(Newton-Conjugate-Gradient,NCG)是一种求解无约束优化问题的算法。它结合了牛顿法共轭梯度法的优点,能够快速地收敛到较优解。下面是使用MATLAB实现NCG算法的示例代码: ```matlab function [x, fval, k] = ncg(fun, x0, eps, max_iter) % fun: 目标函数 % x0: 初始点 % eps: 精度 % max_iter: 最大迭代次数 % 初始化 k = 0; x = x0; fval = feval(fun, x); g = grad(fun, x); d = -g; H = hessian(fun, x); % 迭代 while norm(g) > eps && k < max_iter % 计算步长 alpha = -(g'*d)/(d'*H*d); % 更新参数 x = x + alpha*d; fval_old = fval; fval = feval(fun, x); g_old = g; g = grad(fun, x); beta = (g'*H*d)/(d'*H*d); d = -g + beta*d; % 更新Hessian矩阵 s = x - x0; y = g - g_old; H = H + (y'*s + s'*H*s)*(s*s')/(s'*y)^2 - (H*y)*(H*y)'/(y'*H*y); % 更新迭代次数 k = k + 1; end end function g = grad(fun, x) % 计算梯度 g = gradient(fun, x); end function H = hessian(fun, x) % 计算Hessian矩阵 n = length(x); H = zeros(n); for i = 1:n for j = i:n H(i,j) = feval(@hessian_ij, fun, x, i, j); H(j,i) = H(i,j); end end end function h_ij = hessian_ij(fun, x, i, j) % 计算Hessian矩阵的ij元素 ei = zeros(length(x), 1); ej = zeros(length(x), 1); ei(i) = 1; ej(j) = 1; h_ij = feval(@(t) gradient(fun, x+t*ei)'*ej, 0); end ``` 其中,`fun`是目标函数的句柄,`x0`是初始点,`eps`是精度,`max_iter`是最大迭代次数。在每次迭代中,首先计算当前点的梯度和Hessian矩阵,然后使用共轭梯度法求解牛顿步长,更新参数,再根据DFP公式更新Hessian矩阵。最后根据精度和最大迭代次数的要求判断是否终止迭代。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值