我在使用一段 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
据我所知,您遇到的实验顺序太大或太小的问题可能是由于几个因素造成的,例如导致数值不稳定或索引不正确的小错误。
我推荐的是:
ekm
、ek
和 ekp
的索引应与其他迭代保持一致。我修改了你的一些代码以使其正常工作。
% 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
值。