A felező módszer (vagy az intervallumfelezés módszere) folytonos, a valós számokat a valós számokra képező függvények gyökeinek meghatározására használatos numerikus módszer. A módszer felhasználhatóságának feltétele, hogy a kérdéses függvény felvegyen mind negatív, mind pozitív értéket.

Az általánosság megsértése nélkül feltételezhetjük hogy az előzőekben, a gyökök szétválasztása során sikerült olyan intervallumokra felosztanunk a számtengelyt, amelyek mindegyikében egyszer és csakis egyszer metszi az f(x) függvény az x tengelyt. Vegyünk egy ilyen intervallumot, és jelöljük annak két végpontját a0 illetve b0-val. A felező módszer abban áll, hogy kiindulva ebből a két értékből újabb (a1, b1), (a2, b2), ..., (an, bn), ... számpárokat kapunk úgy, hogy a gyök mindvégig a két érték által meghatározott intervallumon belül marad: azaz an < ξ < bn - ezáltal tetszőleges pontossággal "sarokba szorítván" a gyököt. Minden egyes lépésben felezzük az intervallum nagyságát: azaz bn - an = (bn-1 - an-1)/2. Szigorúan bizonyítható, hogy a közrezárási feltételt tiszteletben tartva és az intervallumot tetszőlegesen lecsökkentve, annak végpontjai tetszőlegesen közel kerülnek a ξ gyökhöz. Gyakorlatilag az eljárás a következő:
Legyen cn = (an + bn)/2 az intervallum közepe.
1. ha f(an)f (cn) < 0 akkor bn+1 = cn, azaz a jobb oldali végpontot az intervallum közepére mozgatjuk, mert ezzel nem csúszik ki kezünk közül a gyök;
2. ha f(an)f (cn) > 0 akkor an+1 = cn, azaz ha a jobb oldali végpont középre való mozgatásával a közrezárási feltétel nem teljesül, a bal oldali végponttal végezzük el a műveletet;
3. ha f(an)f (cn) = 0 leállunk, mert cn = ξ, azaz belebotlottunk a gyökbe. A harmadik lépésben figyelembe vett eshetőség valószínűsége gyakorlati alkalmazások esetén kicsi, de ettől függetlenül helyet kell kapnia az algoritmusban. Az n-edik lépésben a legjobb becslés cn. A hiba felső korlátja így
εn = (bn - an)/2

Gyökkeresés felező módszerrel

A fenti leírásnak pszeudokódban való megfelelője:
1: function Felező( in: f, a, b, E out: x ) *** f a tanulmányozott függvény, a, b az intervallum határai, E a megoldás megengedett hibája, x becsült megoldás
2: pre b > a, sign(f(a)) ≠ sign(f(b))
3: u → f(a)
4: ε → (b - a)/2
5: while ε > E do
6: c → a + ε
7: w → f(c)
8: if u · w < 0 then
9: b → c
10: else if w = 0 then
11: return c
12: else
13: a → c
14: u → w
15: end if
16: ε → ε/2
17: end while
18: return a + ε
19: end function

Példa szerkesztés

Legyen f(x) = x-ex, a = 0, b = 1.0 és a megengedett legnagyobb hiba 0.001. Használva a c = (a + b)/2 jelölést

a b c b - a|/2 f(a) f(b) f(c)
1 0.000000 1.000000 0.500000 0.500000 -1.000000 0.632121 -0.106531
2 0.500000 1.000000 0.750000 0.250000 -0.106531 0.632121 0.277633
3 0.500000 0.750000 0.625000 0.125000 -0.106531 0.277633 0.089739
4 0.500000 0.625000 0.562500 0.062500 -0.106531 0.089739 -0.007283
5 0.562500 0.625000 0.593750 0.031250 -0.007283 0.089739 0.041498
6 0.562500 0.593750 0.578125 0.015625 -0.007283 0.041498 0.017176
7 0.562500 0.578125 0.570312 0.007812 -0.007283 0.017176 0.004964
8 0.562500 0.570312 0.566406 0.003906 -0.007283 0.004964 -0.001155
9 0.566406 0.570312 0.568359 0.001953 -0.001155 0.004964 0.001905
10 0.566406 0.568359 0:567383 0:000977 -0.001155 0.001905 0.000375


A pontos érték öt helyes számjeggyel megadva 0.56714.
Az alábbi robusztusabb változatban a kilépési feltételt kiegészítjük, hogy kis |f(x)| értékekre, illetve nagy iterációszám esetén is térjen vissza az algoritmus:
1: function Robusztus-Felező( in: f, a, b, E,D,M out: x ) ***f a tanulmányozott függvény, a, b az intervallum határai, E a megoldás megengedett hibája, D az f(x) behelyettesítési értékben megengedett hiba, M az iterációk maximális száma, x a becsült megoldás
2: pre b > a, sign(f(a)) ≠ sign(f(b))
3: u → f(a)
4: ε → (b - a)/2 or
5: i → 0
6: w → f(a + ε)
7: while ε > E or |w| > D or i < M do
8: c → a + ε
9: w → f(c)
10: if u · w < 0 then
11: b → c
12: else if w = 0 then
13: return c
14: else
15: a → c
16: u → w
17: end if
18: ε → ε/2
19: i → i + 1
20: end while
21: return a + ε
22: end function

Hiba szerkesztés

Vizsgáljuk most meg a konvergencia sebességét. A hiba minden lépésben feleződik, azaz a rekurrencia-képlet
εn+1 = εn/2 ;
ami lineáris konvergenciát jelent.

Előnyei és hátrányai szerkesztés

A gyakorlatban szem előtt kell tartanunk a lebegőpontos számok tulajdonságai miatt bekövetkező esetleges hibákat.

1. Az f(a)*f(b) könnyen túlcsordulhat, és 0-t adhat, ha a és b nagyon kicsi számok. Ezt úgy kerülhetjük el, ha őket külön-külön vizsgáljuk, és nem a szorzatukat.
2. Ha epszilon túl kicsi, az (a - b) abszolút értéke lehet, hogy sosem lesz olyan kicsi mint 2*epszilon, így a és b szomszédos, nem egyenlő lebegőpontos számok értékeit veszik fel. Ezt elkerülhetjük úgy, hogy nem engedjük epszilont túl picinek lenni, vagy az algoritmusba épített ellenőrző lépésekkel.

A felező módszer nagy hátránya a Newton-módszerrel (érintő módszer) szemben, hogy több lépés után éri el a megkövetelt pontosságot, így hosszú művelet végzésekor lényegesen lassúbb. Előnyös viszont, mert nem szükséges az adott függvény deriváltjainak az ismerete, vagy egyáltalán a deriváltak létezése.

Források szerkesztés

Lázár Zsolt, Lázár József, Járai-Szabó Ferenc: Numerikus módszerek