matlab实现牛顿迭代法求解二元函数最优点并绘制动态图像

这篇博客介绍了如何使用符号计算和迭代方法求解二维目标函数的最小值。首先,定义了目标函数、雅可比矩阵和海塞矩阵,然后通过梯度下降法进行迭代求解,并绘制了3D函数图像及迭代路径。最终,当误差低于预设阈值时,找到满足精度要求的解。
摘要由CSDN通过智能技术生成

1. 定义目标函数,及其雅可比矩阵和海塞矩阵:

function [f_val, f_grad_val, f_hess_val] = V_func(x_val, y_val)
    syms x y;
    
    f = (x-2)^4+((x-2)^2)*(y^2)+(y+1)^2;
    
    f_grad = jacobian(f, [x; y]);
    f_hess = jacobian(f_grad, [x, y]);
    
    f_val = subs(f, {x, y}, {x_val, y_val});
    f_grad_val = subs(f_grad, {x, y}, {x_val, y_val});
    f_hess_val = subs(f_hess, {x, y}, {x_val, y_val});
end

2. 迭代求解并绘制图像

clear
clc

init_point = [12, 15]';
iter_max = 30;
[f_init, f_grad_init, f_hess_init] = V_func(init_point(1), init_point(2));

% 由于是每次迭代需要更新两个变量,因此需要2*x大小的数组存储
x_steps_val = zeros(2, iter_max);
f_steps_val = zeros(1, iter_max);
x_steps_val(:, 1) = init_point;
f_steps_val(:, 1) = f_init;

err_val = inf;
err_max = 1e-6;
iter = 1;
residual = zeros(1, iter_max);

while err_val > err_max 
    if iter == iter_max
        disp('已经达到最大迭代次数');
        break;
    end
    x = x_steps_val(:, iter);
    [f_val_prev, f_grad_val, f_hess_val] = V_func(x(1), x(2));
    x_steps_val(:, iter + 1) = x_steps_val(:, iter) - inv(f_hess_val)*(f_grad_val');
    x_2 = x_steps_val(:, iter + 1);
    [f_val_cur, f_grad_val, f_hess_val] = V_func(x_2(1), x_2(2));
    residual(:, iter) = norm(f_val_prev - f_val_cur);
    err_val = residual(:, iter);

    if err_val < err_max
        disp('找到满足精度要求的解');
        disp(x_2);
        disp(['迭代次数为',num2str(iter)]);
        break;
    end
    iter = iter + 1;
end

% 定义三维图像显示范围
x = -15:0.5:15;
y = -15:0.5:15;

% 绘制三维函数图像
[xx, yy] = meshgrid(x, y);
[f, f_grad, f_hess] = V_func(xx, yy);
figure;
mesh(xx, yy, double(f));
alpha(0.3)
hold on;

% 绘制迭代点图像
for i = 1 : iter
    span = 1 : 1 : i-1;
    scatter3(x_steps_val(1,i), x_steps_val(2,i), f_steps_val(i), 'MarkerEdgeColor','k','MarkerFaceColor',[0 .75 .75])
    plot3(x_steps_val(1,span), x_steps_val(2,span), f_steps_val(span), 'r-', 'LineWidth', 3)
    pause(1);
    M(i) = getframe;
end

 

我的思路是这样的: 最速下降法能找出全局最优点,但在接近最优点的区域内就会陷入“齿型”迭代中,使其每进行一步迭代都要花掉非常久的时间,这样长久的等待是无法忍受的,不信你就在我那个程序的第一步迭代中把精度取得很小如:0.000000001等,其实我等过一个钟都没有什么结果出来。 再者我们考究一下 牛顿迭代法求最优问题,牛顿法相对最速下降法的速度就快得多了,而且还有一个好处就是能高度逼近最优值,而不会出现死等待的现象。 如后面的精度,你可以取如:0.0000000000001等。 但是牛顿法也有缺点,就是要求的初始值非常严格,如果取不好,逼近的最优解将不收敛,甚至不是最优解。 就算收敛也不能保证那个结就是全局最优解,所以我们的出发点应该是:为牛顿法找到一个好的初始点,而且这个初始点应该是在全局最优点附近,这个初始点就能保证牛顿法高精度收敛到最优点,而且速度还很快。 思路概括如下: 1。用最速下降法在大范围找到一个好的初始点给牛顿法:(最速下降法在精度不是很高的情况下逼近速度也是蛮快的) 2。在最优点附近改用牛顿法,用最速下降法找到的点为牛顿法的初始点,提高逼近速度与精度。 3。这样两种方法相结合,既能提高逼近的精度,还能提高逼近的速度,而且还能保证是全局最优点。这就充分吸收各自的优点,扬长避短。得到理想的结果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值