• Register

Bisekcija - razumevanje teorije / kode

+9 votes
146 views

Ali je mogoče v predavanjih 09 pri numerični kodi bisekcijske metode iskanja ničel napaka, pri trditivi da je x2 = x3 sicer pa x1= x3 , ker v predavanjih piše :

  • če imata $f(x_1)$ in $f(x_3)$ različne predznake, potem vemo, da je novi interval ničle $[x_1, x_3]$, sicer pa: $[x_3, x_2]$,
v kodi pa piše če imata funkcija x3 in x1 različne predzanke je x2 = x3 sicer pa x1 = x3
if np.sign(fun(x3))!=np.sign(fun(x1)):
            x2 = x3
        else:
            x1 = x3
ker tudi pri domači nalogi nisem prišel do pravega rezultat z vašo kodo, ampak sem moral popraviti if zanko na ta način :
if np.sign(fun(x3))!=np.sign(fun(x1)):
        x3 = x1
else:
        x3 = x2
asked Apr 17, 2017 by Gasper_B (490 points)
edited Apr 18, 2017 by janko.slavic

1 Answer

+5 votes
 
Best answer

Pozdravljeni!

Mislim, da bo spisana koda s predavanj kar držala. Da si bomo lažje pogledali zakaj, poglejmo sliko:

Kjer so s 3 rdečimi pikami označene naše x1, x2, x3 točke. 'Guess1' pripada točki x1, pri čemer 'Guess2' pripada točki x2. Točka x3 se po spisani kodi nahaja na aritmetični sredini. Torej točki x1 in x2 sta tako imenovani meji intervala (ki ga vedno razdelimo na 2 dela), v katerem se nahaja ničla.

Torej če preletimo kodo, napisano na predavanjih, ob tem pa imejmo v mislih, da se ničla nahaja v 2. intervalu (med x3 in x2 po sliki).

if np.sign(fun(x3))!=np.sign(fun(x1)):
            x2 = x3
        else:
            x1 = x3

Torej koda pravi, da če je predznak v točki x3 različen kot v točki x1, potem se v prvem delu intervalu nahaja ničla, zatorej za zgornjo mejo novega intervala (ki ga bomo v naslednjem koraku zopet razdelili na 2 dela) izberemo vrednost x3. Od tod torej:

            x2 = x3

V nasprotnem primeru pa se premaknemo v drugi del intervala, ker se v prvem ne nahaja ničla. Od tod torej sledi del kode, kjer za spodnji del novega intervala izberemo vrednost x3:

            x1 = x3

 

Torej v našem primeru trditev

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

NE velja, ker je predznak v drugem polju. Torej premaknemo spodnjo mejo (x1) na sredino intervala, da v naslednjem koraku izračunamo nov x3 ter zopet izvedemo celotno rutino.

Upam, da sem vam lahko pomagal. Lahko pa pošljete celotno vašo kodo in jo skupaj preverimo :)

 

Tu pa dodam še sliko, kjer so na pseudo način popisani vsi možni scenariji:

Ki je izsek online kode za Fortran.

Lep pozdrav,
Aljaž

answered Apr 17, 2017 by aljazjelen (11,170 points)
selected Apr 18, 2017 by janko.slavic
...