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