Не работает причина используемого алгоритма: x_ {n + 1} = f (x_n)
, который не является алгоритмом для поиска корня функции.
EDIT: Как написано, ваша функция iterative_method ищет неподвижные точки функции f, а не ее корни (т. Е. Ищет точки x такие, что x = f (x) и не такие, что f (x) = 0). Итак, если вы хотите x, чтобы f (x) = 0, вам нужно найти функцию g такую, что f (x) = 0 записывает g (x) = x и применяет ваше исследование с фиксированной точкой по этой функции g, а не е. В вашем конкретном случае, например,
х^3-30x^2 + 2552 = 0
может быть написана
х = SQRT ((х^3 + 2552)/30), если вы смотрите для положительного корня функции f или x = -sqrt ((x^3 + 2552)/30) для отрицательного.
Таким образом, вы можете применить свой алгоритм к функции g: @ (x) sqrt ((x^3 + 2552)/30) (с изменением критерия остановки, предложенным @Sardar_Usama), вы поймете положительный корень of f. Обратите внимание, однако, что метод с фиксированной точкой часто неэффективен, поскольку для обеспечения конвергенции необходимы условия для выбранной функции g. В Интернете вы найдете литературу об этом предмете.
У вас есть много различных алгоритмов, доступных в литературных данных (простейшее ссылка: вики https://en.wikipedia.org/wiki/Root-finding_algorithm)
Для вашей функции я хотел бы предложить метод Ньютона, который является очень эффективным (квадратичной сходимости), если начать вблизи существующего корня. Для этого вам потребуется производную функции и слегка модифицировать iterative_method функцию (также принимая во внимание @Sardar_Usama комментарий, и избавиться от и б, которые бесполезны в вашей функции):
function [ res ] = iterative_method(f,df, x0, atol)
prev = f(x0);
xn = f(prev)
while (abs(xn - prev) > atol)
prev = xn
xn = prev-f(prev)/df(prev)
end
res = xn
end
Тогда просто позвоните
iterative_method(@(x) x^3 -30*x^2 + 2552,@(x) 3*x^2-60*x,-10,10^-4);
Это найти ближайший корень до -10, т.е. -8,1761 ...
Что ты имеешь в виду не имеет смысла? –
Ваш код никогда не входит в цикл ** while ** из-за неправильного состояния. Он думает, что это должно быть так: 'while (abs (xn - prev)> atol)' и почему вы даете значения 'a' и' b', когда вы не используете эти значения в любом месте? Но все равно ваша проблема не сходится, и я думаю, что это ошибка в итеративном методе. –
Хорошо, я попытался изменить его, но я получил NaN в качестве res –