Основная проблема заключается в чеке толерантности
if abs(h-h0) < TOL
Если ваше выражение приближается к своему пределу достаточно быстро, h
может стать 0, как h0
больше, чем допуск. Если это так, критерии не выполняются и цикл продолжается. Следующая итерация h0
является 0 и h
будет оцениваться как NaN
(с divition с 0 плохо)
Если вы, как и в этом случае ожидать сходимость по отношению к 0, вы могли бы вместо того, чтобы проверить
if h > TOL
или вы также можете добавить NaN-check
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,'*-')
Одна ошибка я вижу в вашем коде, что вы используете 'h0 = (0,5)^i', что означает' h0 = (0,5)^√-1, 'что означает' h0 = 9.7656e- 04'. Я думаю, вы хотели использовать 'h0 = 0,5'. И вопросы, требующие помощи по отладке (* «почему этот код не работает?» *) Должен включать в себя желаемое поведение. Расскажите, каков ваш ожидаемый ответ! –