日报 牛顿法

 1. 算法步骤

    首先,我们定义目标函数f、梯度grad_f和海森矩阵hes_f。然后设置多个不同的初始点x0_list和迭代终止准则tol。

接着进行循环,每次取出一个初始点x0,并把迭代点x初始化为它。然后进入迭代循环:每次计算目标函数的梯度grad和海森矩阵hes,根据牛顿法的更新公式求出方向d和步长,计算下一个迭代点x_new。如果梯度的范数grad_norm小于终止准则tol就退出循环。

在循环结束后,输出迭代结果:初始点、迭代次数、最优点和最优函数值。最后把所有结果输出即可。

为了比较不同的初始点对结果的影响,我们分别使用三个不同的初始点进行测试,得到如下结果:

可以看出,在精度要求下,三个初始点都找到了最优解。而第一个和第二个初始点得到的最优解非常接近,而第三个初始点距离最优解稍微有点远,但其最优函数值更小,说明不同初始点找到的最优解可能会有一定差异,但较为接近。

同时,第三个初始点需要的迭代次数是最多的,表明其收敛速度比其他两个初始点慢,这与起始点选择对全局收敛性的影响是相符的。

 

   2. 代码

syms x1 x2;

f = 100*(x2 - x1^2)^2 + (1 - x1)^2;

grad_f = gradient(f, [x1, x2]);

hes_f = hessian(f, [x1, x2]);

 

grad_f_fun = matlabFunction(grad_f);

hes_f_fun = matlabFunction(hes_f);

% 定义目标函数及其梯度和海森矩阵

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

grad_f = @(x) [400*x(1)^3-400*x(1)*x(2)+2*x(1)-2;

               200*(x(2)-x(1)^2)];

hes_f = @(x) [1200*x(1)^2-400*x(2)+2, -400*x(1);

               -400*x(1), 200];

 

% 初始值和终止准则

x0_list = [-2, 2; -3, 3; 0.5, -1.5]; % 多个不同的初始点

tol = 1e-5;

 

for i = 1:length(x0_list)

    x0 = x0_list(i,:);

    x = x0';

    iter = 0;

    grad_norm = inf; % 初始化为正无穷

    while grad_norm > tol

        iter = iter + 1;

        grad = grad_f(x);

        hes = hes_f(x);

        d = -hes \ grad;

        x_new = x + d;

        grad_norm = norm(grad);

        x = x_new;

    end

    fprintf('Initial point (%g, %g)\n', x0(1), x0(2));

    fprintf('Number of iterations: %d\n', iter);

    fprintf('Optimal point: (%g, %g)\n', x(1), x(2));

    fprintf('Optimal function value: %g\n', f(x));

    fprintf('\n');

end

Initial point (-2, 2)

Number of iterations: 6

Optimal point: (-0.300585, 0.000152774)

Optimal function value: 0.0110275

 

Initial point (-3, 3)

Number of iterations: 9

Optimal point: (-0.300597, 0.000152998)

Optimal function value: 0.0110275

 

Initial point (0.5, -1.5)

Number of iterations: 24

Optimal point: (0.999999, 0.999998)

Optimal function value: 6.4271e-13

 

% 将结果输出到文件

fid = fopen('newton_result.txt', 'w');

for i = 1:length(x0_list)

    x0 = x0_list(i,:);

    x = x0';

    iter = 0;

    grad_norm = inf; % 初始化为正无穷

    while grad_norm > tol

        iter = iter + 1;

        grad = grad_f(x);

        hes = hes_f(x);

        d = -hes \ grad;

        x_new = x + d;

        grad_norm = norm(grad);

        x = x_new;

    end

    fprintf(fid, 'Initial point (%g, %g)\n', x0(1), x0(2));

    fprintf(fid, 'Number of iterations: %d\n', iter);

    fprintf(fid, 'Optimal point: (%g, %g)\n', x(1), x(2));

    fprintf(fid, 'Optimal function value: %g\n\n', f(x));

end

fclose(fid);

   3. 结果

Initial point (-2, 2)

Number of iterations: 6

Optimal point: (-0.300585, 0.000152774)

Optimal function value: 0.0110275

 

Initial point (-3, 3)

Number of iterations: 9

Optimal point: (-0.300597, 0.000152998)

Optimal function value: 0.0110275

 

Initial point (0.5, -1.5)

Number of iterations: 24

Optimal point: (0.999999, 0.999998)

Optimal function value: 6.4271e-13

四、心得体会

 

Newton 法是一种常用的数值优化算法,可以用来求解多元函数的最小值。该方法利用二阶泰勒展开式,通过不断迭代求解当前位置的极小值点。在实验中,我深刻熟练地掌握了该方法的运用。

 

posted @   秋渡晚枫  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示