2016-06-22 3 views
0

Я пытаюсь реализовать итеративный метод, чтобы найти корень в matlab. Это мой код, preatty простогоMatLab: итерационный метод для поиска корней

function [ res ] = iterative_method(f, a, b, x0, atol) 

    prev = f(x0); 
    xn = f(prev) 
    while (abs(xn - prev) < atol) 
     prev = xn 
     xn = f(prev) 

    end 
    res = xn 
end 

Тогда, я хочу, чтобы найти корень в функции

f(x) = x^3 - 30*x^2 + 2552 

Так я называю моей функцией

iterative_method(@(x) x^3 -30*x^2 + 2552,0,10,1,10^-4); 

Но выход не имеет смысла :

res = 

    1.5869e+10 
+0

Что ты имеешь в виду не имеет смысла? –

+1

Ваш код никогда не входит в цикл ** while ** из-за неправильного состояния. Он думает, что это должно быть так: 'while (abs (xn - prev)> atol)' и почему вы даете значения 'a' и' b', когда вы не используете эти значения в любом месте? Но все равно ваша проблема не сходится, и я думаю, что это ошибка в итеративном методе. –

+0

Хорошо, я попытался изменить его, но я получил NaN в качестве res –

ответ

1

Не работает причина используемого алгоритма: 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 ...

+0

Дорогой Тоге, я хочу использовать итеративный для дидактических целей. –

+0

Дорогой Франческо, я не понимаю ваш комментарий, ваш первоначальный алгоритм (x_ {n + 1} = f (x_n)) не является алгоритмом для нахождения корней функции, он не будет сходиться к решению, поэтому вы иметь проблему. – Toghe

+1

Я отредактировал свой ответ в случае, если вы имели в виду, что «итеративный» был методом фиксированной точки, надеюсь, что это поможет – Toghe

Смежные вопросы