牛顿法的实验收敛阶 - MATLAB

问题描述 投票:0回答:1

我在使用一段 MATLAB 代码时遇到问题,该代码应该计算修正牛顿法和截断牛顿法的实验收敛阶数。

x_min 是给定的实际最小值,ek、ekm、ekp 是误差,pseq 是收敛阶数序列。问题是,当在 Rosenbrock 函数上测试 MN 或 TN 时,它返回订单 p 非常非常大或非常非常小。

这是代码:

typex_min=[1;1];
if k<=100
    pseq=zeros(k,1);
    for i=2:length(xseq)-1

        ekm=norm(xseq(:,i-1)-x_min);
        ek=norm(xseq(:,i)-x_min);
        ekp=norm(xseq(:,i+1)-x_min);
        pseq(i-1)= log( ekp/ek) ./ log( ek/ekm ) ;
    end
    p=mean(pseq)
else
    xseq_new=xseq(:,length(xseq)-100:length(xseq));
    pseq=zeros(100,1);
    for i=2:length(xseq_new)-1
        ekm=norm(xseq_new(:,i-1)-x_min);
        ek=norm(xseq_new(:,i)-x_min);
        ekp=norm(xseq_new(:,i+1)-x_min);
        pseq(i-1)= log( ekp/ek) ./ log( ek/ekm );
    end
    p=mean(pseq)
end here
matlab rate newtons-method convergence
1个回答
0
投票

据我所知,您遇到的实验顺序太大或太小的问题可能是由于几个因素造成的,例如导致数值不稳定或索引不正确的小错误。

我推荐的是:

  • 仔细检查循环中的索引是否正确。
    ekm
    ek
    ekp
    的索引应与其他迭代保持一致。
  • 确保误差不接近机器压力,因为当误差极小时,对数运算可能会放大差异,导致较大或较小的值。
  • 如果误差太小,请考虑设置低于收敛阶的阈值;以便不计算它。您还可以添加一个小 epsilon 来防止小数除法。

我修改了你的一些代码以使其正常工作。

% Assuming x_min, k, and xseq are already defined

if k <= 100
    pseq = zeros(k, 1);
    for i = 2:length(xseq)-1
        ekm = norm(xseq(:, i-1) - x_min);
        ek = norm(xseq(:, i) - x_min);
        ekp = norm(xseq(:, i+1) - x_min);
        
        % Check for small values to avoid numerical instability
        if ekm > 1e-12 && ek > 1e-12 && ekp > 1e-12
            pseq(i-1) = log(ekp / ek) / log(ek / ekm);
        else
            pseq(i-1) = NaN; % Ignore this calculation
        end
    end
    % Calculate the mean ignoring NaN values
    p = mean(pseq(~isnan(pseq)));
else
    xseq_new = xseq(:, end-99:end); % Correct the slicing
    pseq = zeros(100, 1);
    for i = 2:length(xseq_new)-1
        ekm = norm(xseq_new(:, i-1) - x_min);
        ek = norm(xseq_new(:, i) - x_min);
        ekp = norm(xseq_new(:, i+1) - x_min);
        
        % Check for small values to avoid numerical instability
        if ekm > 1e-12 && ek > 1e-12 && ekp > 1e-12
            pseq(i-1) = log(ekp / ek) / log(ek / ekm);
        else
            pseq(i-1) = NaN; % Ignore this calculation
        end
    end
    % Calculate the mean ignoring NaN values
    p = mean(pseq(~isnan(pseq)));
end

% Output the experimental order of convergence
disp(['Experimental order of convergence: ', num2str(p)]);

我刚刚确保 MATLAB 检查以确保

ekm
ek
ekp
在阈值内。在计算收敛的平均阶数以改善结果时,我还确保忽略
NaN
值。

© www.soinside.com 2019 - 2024. All rights reserved.