Метод на разполовяване (Числен анализ)

Колко рекурсии се правят, преди да се намери всеки отделен корен? Освен това кои са корените?


Ето моят код:

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], е трудно да се предскаже като цяло към кой конкретен корен ще се сближи. (Забележка: тъй като разполовяването е напълно детерминистичен алгоритъм, той винаги ще се сближава с абсолютно същия корен, ако му дадете същия начален интервал.) Итерациите просто прецизират вашето приближение на намерения корен, те не намират множество корени.

За да отговоря директно на въпроса ви, разполовяването няма да открие и трите корена на вашата функция вътре в [0,3]. Той ще намери само един корен и той се идентифицира от последната итерация на вашия код за разполовяване. Всички стойности, изведени от итерациите на разполовяването, просто показват напредъка, постигнат от алгоритъма към единия корен, който в крайна сметка е намерил (и тези стойности трябва да са последователност, сближаваща се с крайната стойност).

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

Алгоритъмът на метода на разполовяване е такъв, че може да намери само един корен между определен интервал. Във вашия проблем и трите корена не могат да бъдат намерени, но ако дефинирате различни интервали, за да откриете отделните корени, може да успеете. Можете да преминете през тази примерна програма за метод на разполовяване в Matlab с пълна теоретична подготовка и пример.

person Pramesh Pudasaini    schedule 24.02.2015