MATLAB - секущий метод производит NaN - PullRequest
1 голос
/ 20 марта 2019

Я пишу секущий метод в MATLAB, который я хочу повторить ровно n раз.

function y = secantmeth(f,xn_2,xn_1,n)

xn = (xn_2*f(xn_1) - xn_1*f(xn_2))/(f(xn_1) - f(xn_2));
k = 0;
while (k < n)
    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
y = xn;
end

Я считаю, что метод работает для небольших значений n, но даже для чего-то вроде n = 9производит NaN.Я предполагаю, что величина f (xn_1) - f (xn_2) примерно равна нулю, что вызывает эту ошибку.Как я могу предотвратить это?

Примеры:

Вход 1

eqn = @ (x) (x ^ 2 + x -9)

secantmeth (eqn, 2,3,5)

Вход 2

eqn = @ (x)(x ^ 2 + x - 9)

secantmeth (eqn, 2, 3, 9)

Выход 1

2.7321

Выход 2

NaN

1 Ответ

1 голос
/ 20 марта 2019

Значение 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
...

И снова, я бы предложил прочитать этот вопрос , чтобы понять некоторые подводные камни сравнения с плавающей точкой (т. Е. == и ~= обычно не лучшие операторы для использования с плавающей точкой номера точек).

...