Значение xn
будет NaN
, когда xn_2
и xn_1
точно равны, что приводит к условию 0/0
. Вам необходимо дополнительно проверить состояние цикла while, чтобы увидеть, равны ли xn_1
и x_n
(или, что еще лучше, в пределах некоторого небольшого допуска друг к другу ), что предполагает, что цикл нашел решение и не может итерировать дальше:
...
while (k < n) && (xn_1 ~= xn)
k = k + 1;
xn_2 = xn_1;
xn_1 = xn;
xn = (xn_2*f(xn_1) - xn_1*f(xn_2))/(f(xn_1) - f(xn_2));
end
...
Как упоминает Андер в комментарии , вы можете продолжить использовать другой метод после цикла while, если хотите попытаться получить более точное приближение:
...
if (xn_1 == xn) % Previous loop couldn't iterate any further
% Try some new method
end
...
И снова, я бы предложил прочитать этот вопрос , чтобы понять некоторые подводные камни сравнения с плавающей точкой (т. Е. ==
и ~=
обычно не лучшие операторы для использования с плавающей точкой номера точек).