2016-09-12 1 views
-2

Ecrire un code Matlab pour calculer et déterminer le taux de convergence:Computing et la détermination du taux de convergence

(exp(h)-(1+h+1/2*h^2))/h ‍‍‍‍‍‍ ‍‍‍‍‍‍ with h=1/2, 1/2^2,..., 1/2^10

Mon code était:

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 

La réponse reçue Cela n'a aucun sens. S'il vous plaît aider.

+0

Un bug que je vois dans votre code est que vous utilisez 'h0 = (0,5)^I' qui signifie' h0 = (0,5)^√-1, '' ce qui signifie h0 = 9.7656e- 04'. Je pense que vous vouliez utiliser 'h0 = 0.5'. Et les questions cherchant l'aide de débogage (* "pourquoi ce code ne fonctionne pas?" *) Doivent inclure le comportement désiré. Dites-nous quelle est votre réponse attendue! –

Répondre

0

Le principal problème est dans votre contrôle de tolérance

if abs(h-h0) < TOL 

Si votre expression se rapproche de sa limite assez vite, h peut devenir 0 comme h0 est supérieure à la tolérance. Si c'est le cas, le critère n'est pas rempli et la boucle continue. itération suivante h0 est 0 et h sera évaluée comme NaN (depuis divition avec 0 est mauvais)

Si vous, comme dans ce cas, attendez une convergence vers 0, vous pourriez plutôt vérifier

if h > TOL 

ou vous pouvez également ajouter un contrôle NaN

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

En outre, il existe quelques problèmes avec votre code.

D'abord, vous lancez h0 en utilisant i (le nombre imaginaire), vous avez probablement l'intention d'utiliser i = 1, mais cette ligne est ci-dessous dans votre code.

Vous utilisez une boucle while mais dans votre cas, comme vous avez l'intention d'incrémenter i, une boucle for serait tout aussi bonne. L'utilisation de la variable table, h et h0 est inutile. Faites un seul vecteur de résultat, initialisé avec votre h0 au premier index - voir l'exemple ci-dessous.

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,'*-')