• Register

bisekcijska metoda

+5 votes
153 views
Pozdravljeni,

mene pa zanima, ali je mogoče, da mi bisekcijska metoda najde dvojno ničlo. Glede na to, da se ne spremeni predznak funkcije. Kajti pri navadni kvadratni enačbi mi jo najde.

f(x) = x^2

in mi najde ničlo pri 0.

 

Lep pozdrav
asked Apr 22, 2017 by Peter (1,440 points)

1 Answer

+4 votes
 
Best answer

Funkcija bisekcijske metode bi vas morala v takem primeru že na začetku opzoriti, da na robovih izbranega intervala funkcija nima različnega predznaka, in da iskanje ni mogoče (poglejte kaj se zgodi, če za iskanje ničle uporabite scipy.optimize.bisect). 

Če ta "varovalka" ni sprogramirana, se bo iskanje ničle nadaljevalo. Ker vaša funkcija nikjer ne spremeni predznaka, bo vedno obveljal pogoj, da je prdznak v novi točki, na sredi intervala iz prejšnje iteracije, enak predznaku v mejni točki, v kateri to preverjate (v primeru implementacije iz predloge k predavanjem bi torej za nov interval vedno bila izbrana desna polovica starega intervala). 

Ko dosežete željeno "natančnost" (ko je nov interval dovolj ozek) se iskanje zaključi, funkcija kot rezultat vrne zadnji izračunan približek. Če ste na ta način dobili pravo ničlo funkcije je bilo to zato, ker ste po naključju izbrali ravno prava začetna približka. Če ste bisekcijo sprogramirali tako, kot je zapisano v kodi s predavanj (a brez preverjanja različnosti predznakov na začetku), potem ste za zgornjo mejo intervala morali slučajjno izbrati ravno x2=0.

 

P.S.: Ugotavljam, da koda s predavanj v takem primeru "najde ničlo" tudi, če meji izberete simetrično glede na resnično dvojni ničlo (torej če bi izbrali x1=-1, x2=1). 

Do tega pride zato, ker klic funkcije np.sign(0) vrne vrednost 0. Pri prvi primerjavi predznakov v levi meji intervala in prvem približku (ki je zaradi simetrično izbranih mej ravno ničla funkcije) je torej izpolnjen pogoj 

np.sign(fun(x3))!=np.sign(fun(x1))

Kot nov interval iskanja ničel je zato v prvem koraku izbrana leva polovica začetnega intervala, v vseh naslednjih itercijah pa je, kot sem zapisal zgoraj, vedno izbrana desna polovica. Desna meja leve polovice začetnega intervala je pri prvih približkih, izbranih simetrično na mesto ničle, ravno sredina intervla - v vašem primeru ničla pri x=0. 

V vseh ostalih primerih izbire mej prave dvojne ničle z bisekcijo ne boste našli, ustrezno sporgramirana funkcija vam bo to tudi takoj povedala. Če uporabljate profesorjevo kodo s predavanj uporabite tisto malo nižje, kjer je dodana tudi kontrola napak.

answered Apr 22, 2017 by dgorjup (61,050 points)
selected Apr 24, 2017 by janko.slavic
Pozdravljeni,
Ali v projektu lahko kopiram profesorjevo kodo iz predavanj.
Ali moram nato navesti vir ?
Lahko uporabite kodo s predavanj, če je iz uporabe in komentarjev vidno, da metode razumete in jih znate uporabljati. To lahko omenite na začetku seminarja, ni pa treba posebej navajati vira.
...