编写MATLAB代码来计算和确定收敛率:
(exp(h)-(1+h+1/2*h^2))/h with h=1/2, 1/2^2,..., 1/2^10
我的代码是:
h0=(0.5)^i;
TOL=10^(-8);
N=10;
i=1;
flag=0;
table=zeros(30,1);
table(1)=h0
while i < N
h=(exp(h0)-(1+h0+0.5*h0^2))/h0;
table (i+1)=h;
if abs(h-h0)< TOL
flag=1;
break;
end
i=i+1;
h0=h;
end
if flag==1
h
else
error('failed');
end
我收到的答案没有任何意义。请帮忙。
答案 0 :(得分:0)
主要问题在于您的公差检查
if abs(h-h0) < TOL
如果您的表达式足够快地接近其限制,h
可能会变为0,因为h0
大于容差。如果是,则不满足标准并继续循环。下一次迭代h0
为0,h
将被评估为NaN
(因为带0的分区是坏的)
如果您(如果在这种情况下)期望收敛为0,则可以检查
if h > TOL
或者您也可以添加NaN检查
if abs(h-h0) < TOL || isnan(h)
除此之外,您的代码存在一些问题。
首先你使用i
(虚数)启动h0,你可能打算使用i = 1,但是你的代码中有这一行。
你使用while
循环,但在你的情况下,当你想增加i时,for
循环就会一样好。
不必使用变量table
,h
和h0
。制作单个结果向量,在第一个索引处用h0初始化 - 参见下面的示例。
TOL = 1e-8; % Tolerance
N = 10; % Max number of iterations
% Value vector
h = zeros(N+1,1);
% Init value
h(1) = (0.5)^1;
for k = 1:N
h(k+1) = (exp(h(k)) - (1 + h(k) + 0.5*h(k)^2))/h(k);
if isnan(h(k+1)) || abs(diff(h(k + [0 1]))) < TOL
N = k;
break
end
end
% Crop vector
h = h(1:N);
% Display result
fprintf('Converged after %d iterations\n', N)
% Plot (with logarithmic y-xis)
semilogy(1:N, h,'*-')