2016-09-12 99 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,'*-')