Метод деления пополам (Численный анализ)

Сколько рекурсий делается, прежде чем будет найден каждый корень? Кроме того, какие из них являются корнями?


Вот мой код:

e=0.000001; 
f1=@(x) 14.*x.*exp(x-2)-12.*exp(x-2)-7.*x.^3+20.*x.^2-26.*x+12;

a=0; 
c=3; 
while abs(c-a)>e 
    b=(c+a)/2; 
    if f1(a)*f1(b)<0 
        c=b; 
    else
        a=b;
    end    
    disp(b);  
end

person Community    schedule 08.11.2012    source источник
comment
Так почему бы не добавить распечатки к своим рекурсиям и не убедиться в этом самим?   -  person Eitan T    schedule 08.11.2012
comment
Я не знаком с внутренностями вашей функции, поэтому не могу вдаваться в подробности, но почему бы просто не вывести значения внутренних переменных и не определить, какие значения соответствуют какому корню? Кроме того, вы можете опубликовать алгоритм, и я посмотрю на него сам.   -  person Eitan T    schedule 08.11.2012
comment
Ваш алгоритм находит только один корень z = 0,857, тогда как ваша функция имеет еще один корень 2. Также, пожалуйста, воздержитесь от публикации ссылок на свой код, вместо этого вставьте его в вопрос.   -  person Eitan T    schedule 08.11.2012
comment
Просто указываю на очевидное: вы знаете fzero? Также обратите внимание на эту функцию обмена файлами -- Вы многому научитесь.   -  person Rody Oldenhuis    schedule 08.11.2012


Ответы (2)


Разделение пополам работает, беря конечные точки некоторого начального интервала [a,b] и находя, какая половина интервала должна содержать корень (он оценивает среднюю точку и определяет, какая половина имеет изменение знака). Затем процесс пополам повторяется на идентифицированной половине.

Разделение пополам сходится только к одному возможному корню, и если ваша функция имеет несколько корней внутри [a,b], вообще сложно предсказать, к какому конкретному корню она будет сходиться. (Примечание: поскольку деление пополам является полностью детерминированным алгоритмом, он всегда будет сходиться к одному и тому же корню, если вы зададите ему один и тот же начальный интервал.) Итерации просто уточняют вашу аппроксимацию найденного корня, они не находят несколько корней.

Чтобы прямо ответить на ваш вопрос, bisection не обнаружит все три корня вашей функции внутри [0,3]. Он найдет только один корень, и это определяется последней итерацией вашего кода деления пополам. Все значения, выдаваемые итерациями деления пополам, просто показывают продвижение алгоритма к одному корню, который он в итоге нашел (и эти значения должны представлять собой последовательность, сходящуюся к конечному значению).

person Sam    schedule 08.11.2012
comment
Быстрый ответ на поиск 3 корней — посмотреть на свой график и выбрать три разных интервала, каждый из которых содержит только один из корней. Таким образом, вы гарантируете, что найденное корневое деление пополам является правильным. Опять же, с этими другими алгоритмами поиска корней они найдут один корень. При их сравнении они могут даже не все сходиться к одному и тому же корню, и сходимость сильно зависит от начального условия (или интервала, в случае методов бисекции/секущей). Например, если вам случится инициализировать один из методов в самом корне, его производительность будет идеальной! - person Sam; 09.11.2012

Алгоритм метода деления пополам таков, что он может найти только один корень между определенным интервалом. В вашей задаче невозможно найти все три корня, но если вы зададите разные интервалы для нахождения отдельных корней, вы можете добиться успеха. Вы можете пройти этот образец программы для метода деления пополам в Matlab с полной теоретической базой и пример.

person Pramesh Pudasaini    schedule 24.02.2015