Puolittamismenetelmä – mikä on, algoritmi ja esimerkki
Mikä on puolitusmenetelmä?
Bisection Method on yksi numeerisista perusratkaisuista polynomiyhtälön juuren löytämiseksi. Se sulkee välin, jossa yhtälön juuri sijaitsee, ja jakaa ne puoliksi kussakin iteraatiossa, kunnes se löytää juuren. Siten puolittamismenetelmää kutsutaan myös haarukointimenetelmäksi.
Koska toimintamekanismi on kuitenkin samanlainen kuin binäärihakualgoritmi, puolittamismenetelmä tunnetaan myös binäärihakumenetelmänä, puolitusmenetelmänä tai dikotomiamenetelmänä. Se perustuu ensisijaisesti väliarvolauseeseen.
Yhtälöiden juurten löytäminen
Tässä esimerkissä tarkastelemme vain yhtälöitä, joissa on yksi riippumaton muuttuja. Se voi olla joko lineaarinen tai epälineaarinen. Lineaarisia yhtälöitä käytetään esittämään suoran viivan kuvaajaa, kun taas epälineaarisia yhtälöitä käytetään kuvaamaan käyriä.
Yhtälön juuri tarkoittaa riippumattoman muuttujan arvoa, joka täyttää yhtälön. Esimerkiksi: yhtälön juuri f(x)= 4-x2 = 0 on 2, koska f(2) = 4-22 = 0.
Tarkastellaan f(x):tä todellisena jatkuvana funktiona. Väliarvolauseen mukaan yhtälöllä f(x)=0 on vähintään yksi juuri a:n ja b:n välillä, jos f(a)f(b) < 0. Funktiolla f(x) on juuri, "c", a:n ja b:n välillä.
Bisection-menetelmän graafinen esitys
Seuraava kaavio esittää puolittamismenetelmän toimintamekanismia. Kaaviosta näemme, että yhtälön juuri on merkitty punaisella.
Aivan aluksi:
- Teimme ensin kaksi alustavaa arvausta, a1 ja b1, jolle f(a1)f(b1) < 0. Väliarvolauseen mukaan juuren tulee olla [a1, b1].
- Voimme löytää a:n keskipisteen1 ja b1, joka on b2. Näin ollen aloitusväli on nyt pienennetty [a1, b2] koska f(a1)f(b2) <0.
- Samalla tavalla väliä pienennetään, kunnes likimääräinen ratkaisu löytyy.
Bisection Method Algorithm
Vaiheet puolittamismenetelmäalgoritmin soveltamiseksi yhtälön f(x)=0 juuren löytämiseksi ovat seuraavat
Vaihe 1) Valitse alustavat arvaukset a, b ja toleranssisuhde e
Vaihe 2) Jos f(a)f(b) >=0, niin juuri ei ole tässä välissä. Siten ratkaisua ei tule.
Vaihe 3) Etsi keskipiste, c = (a+b)/2
(i) Jos keskipisteen f(c) funktion arvo on 0, niin c on juuri. Siirry vaiheeseen 5.
(ii) Jos f(a)f(c) < 0, juuri on a:n ja c:n välillä. Aseta sitten a = a, b = c.
(iii) Muuten aseta a = c, b = b.
Vaihe 4) Jos absoluuttinen virhe on suurempi kuin toleranssiaste tai (ba) > e, siirry vaiheeseen 3.
Vaihe 5) Näytä c likimääräisenä juurena.
Katsotaanpa esimerkki puolittamismenetelmän algoritmista.
Meidän on löydettävä seuraavan jatkuvan funktion juuri käyttämällä puolittamismenetelmän kaavaa.
f (x) = x3 - x2 + 2
Esimerkki puolittamisesta
Vaihe 1) Oletetaan,
a = -10,
b = 10 ja
e = 1 % tai 0.01
Vaihe 2) Nyt tarkistetaan onko f(a)f(b) >= 0 vai ei.
f(a) = f(-10) = (-10)3 – (-10)2 + 2 = -1098
f(b) = f(10) = (10)3 – (10)2 + 2 = 902
f(a)f(b) = f(-10)f(10) = (-1098)(902) < 0
Yllä olevan funktion juuri on siis tässä välissä [-10, 10].
Vaihe 3) Sitten keskipiste c lasketaan ensin.
Seuraavat ehdot on nyt tarkistettava:
(i) onko f(c) = 0:
f(c) = f(0) = (0)3 – (0)2 + 2 = 2 ≠ 0
(ii) jos f(a)f(c) < 0:
f(c)f(a) = 2*(-1098) < 0
Ehto täyttyy. Seuraavaa iteraatiota varten arvot ovat
a = a = -10
b = c = 0
Vaihe 4) Koska (ba) = (0-(-10)) = 10>0.05, prosessi toistetaan. Seuraavat iteraatiot näkyvät taulukossa.
iteraatio | a | b | c | ba | f(c) |
---|---|---|---|---|---|
1 | -10 | 0 | 0 | 10 | 2 |
2 | -5 | 0 | -5 | 5 | -148 |
3 | -2.5 | 0 | -2.5 | 2.5 | -19.875 |
4 | -1.25 | 0 | -1.25 | 1.25 | -1.52562 |
5 | -1.25 | -0.625 | -0.625 | 0.625 | 1.36523 |
6 | -1.25 | -0.9375 | -0.9375 | 0.3125 | 0.297119 |
7 | -1.09375 | -0.9375 | -1.09375 | 0.15625 | -0.50473 |
8 | -1.01562 | -0.9375 | -1.01562 | 0.078125 | -0.0791054 |
9 | -1.01562 | -0.976562 | -0.976562 | 0.0390625 | 0.115003 |
10 | -1.01562 | -0.996094 | -0.996094 | 0.0195312 | 0.0194703 |
11 | -1.00586 | -0.996094 | -1.00586 | 0.00976562 | -0.0294344 |
Vaihe 5) 11. iteraatiossa vaiheen 4 ehto on epätosi. Siten tämän yhtälön juuri on -1.00586.
Puolittamismenetelmän looginen kaavio
Pseudokoodi
Start Set a, b, e if f(a)*f(b) >=0 Output("Root does not exist in this interval") Stop while (b-a)>e do c ← (a + b)/2 if f(c) = 0 break end if if f(c)*f(a) < 0 then b ← c else a ← c end while Output(c) Stop
Esimerkki puolittamisesta C/C++
input:
#include<bits/stdc++.h> using namespace std; #define Error 0.01 double value(double x) { return x*x*x - x*x + 2; } void bisection_method(double a, double b) { if (value(a) * value(b) >= 0) { cout << "The root does not lie in this interval\n"; return; } double c = a; while ((b-a) >= Error) { c = (a+b)/2; if (value(c) == 0.0) break; else if (value(c)*value(a) < 0) b = c; else a = c; } cout << "The root is :" << c; } int main() { double a =-10 , b = 10; bisection_method(a, b); return 0; }
lähtö:
The root is :-1.00586
Esimerkki puolittamisesta menetelmässä Python
input:
def value(x): return x*x*x - x*x + 2 def bisection_method(a,b): if (value(a) * value(b) >= 0): return c = a while ((b-a) >= 0.01): c = (a+b)/2 if (value(c) == 0.0): break if (value(c)*value(a) < 0): b = c else: a = c print("The root is : ","%.4f"%c) a =-10 b = 10 bisection_method(a, b)
lähtö:
The root is : -1.0059
Bisection-menetelmän edut ja rajoitukset
Tässä ovat puolitusmenetelmän edut ja haitat:
Plussat | MIINUKSET |
---|---|
Helppo ja yksinkertainen juurenhakumenetelmä toteuttaa. | Lähentyminen on hidasta, koska se perustuu yksinkertaisesti intervallin puolittamiseen. |
Koska se sulkee juuren, se on aina konvergentti. | Jos jokin alkuarvauksista on lähellä juuria, juuren saavuttaminen vaatii enemmän iteraatioita. |
Virhesuhdetta voidaan hallita lisäämällä tai vähentämällä iteraatioiden määrää. |