2016-09-12 148 views
-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 

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

+0

一个错误我在代码看到的是,使用了'H0 =(0.5)^ i'这意味着'H0 =(0.5)^√-1;'这意味着'H0 = 9.7656e- 04'。我想你想用'h0 = 0.5'。寻求调试帮助的问题(*“为什么这个代码不工作?”)必须包含所需的行为。告诉我们你的预期答案是什么! –

回答

0

的主要问题是在你的宽容检查

if abs(h-h0) < TOL 

如果你的表达不够快接近其极限,h可以成为0为h0是大于公差。如果是这样,则不符合标准并继续循环。下一个迭代h0是0和h将被评估为NaN(因为divition 0是坏)

如果你像在这种情况下,预计朝0收敛,你可以改为检查

if h > TOL 

或你也可以添加NaN检查

if abs(h-h0) < TOL || isnan(h) 

除此之外,你的代码有几个问题。

首先,发起使用i(虚数)H0,你可能intented使用I = 1,但低于该行是在你的代码。

您使用while循环,但在您的情况下,因为您打算增加i,for循环会一样好。

使用变量table,hh0是不必要的。创建一个结果向量,在第一个索引处使用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,'*-')