-2

编写一个 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

我收到的答案没有任何意义。请帮忙。

4

1 回答 1

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)

除此之外,您的代码还有一些问题。

首先,您使用(虚数)启动 h0 i,您可能打算使用 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,'*-')
于 2016-09-12T06:33:07.640 回答