Poolitamise meetod – mis on, algoritm ja näide

Mis on poolitamise meetod?

Poolitusmeetod on üks põhilisi arvulisi lahendusi polünoomvõrrandi juure leidmiseks. See sulgub intervalli, milles asub võrrandi juur, ja jagab need igas iteratsioonis pooleks, kuni see leiab juure. Seega nimetatakse poolitamise meetodit ka sulgumismeetodiks.

Kuna aga töömehhanism on sarnane binaarse otsingu algoritmiga, tuntakse poolitamise meetodit ka kui binaarset otsingumeetodit, poolitamise meetodit või dihhotoomia meetodit. See põhineb peamiselt vaheväärtuste teoreemil.

Võrrandite juurte leidmine

Selles näites käsitleme ainult ühe sõltumatu muutujaga võrrandeid. See võib olla kas lineaarne või mittelineaarne. Sirge graafiku esitamiseks kasutatakse lineaarseid võrrandeid, kõverate esitamiseks aga mittelineaarseid võrrandeid.

Võrrandi juur tähendab võrrandit rahuldava sõltumatu muutuja väärtust. Näiteks: võrrandi juur f(x)= 4-x2 = 0 on 2, sest f(2) = 4-22 = 0.

Vaatleme f(x) reaalse pideva funktsioonina. Vaheväärtuste teoreemi kohaselt on võrrandil f(x)=0 vähemalt üks juur a ja b vahel, kui f(a)f(b) < 0. Funktsioonil f(x) on juur "c," a ja b vahel.

Võrrandite juurte leidmine

Poolitamise meetodi graafiline esitus

Järgmine graafik kujutab poolitamise meetodi töömehhanismi. Graafikult näeme, et võrrandi juur on punaselt märgitud.

Alustuseks:

  • Esmalt tegime kaks esialgset oletust, a1 ja b1, mille jaoks f(a1)f(b1) < 0. Vaheväärtuste teoreemi järgi peaks juur asuma [a1b1].
  • Leiame a keskpunkti1 ja b1, mis on b2. Seega on esialgne intervall nüüd vähendatud [a1b2], sest f(a1)f(b2) < 0.
  • Samal viisil vähendatakse intervalli kuni ligikaudse lahenduse leidmiseni.

Poolitamise meetodi graafiline esitus

Poolitamise meetodi algoritm

Poolitamise meetodi algoritmi rakendamise sammud võrrandi f(x)=0 juure leidmiseks on järgmised

Step 1) Valige esialgsed oletused a, b ja tolerantsimäär e

Step 2) Kui f(a)f(b) >=0, siis juur ei asu selles intervallis. Seega lahendust ei tule.

Step 3) Leidke keskpunkt, c = (a+b)/2

(i) Kui keskpunkti f(c) funktsiooni väärtus on 0, siis c on juur. Minge 5. sammu juurde.
(ii) Kui f(a)f(c) < 0, asub juur a ja c vahel. Seejärel seadke a = a, b = c.
(iii) Muidu seadke a = c, b = b.

Step 4) Kui absoluutne viga on suurem kui tolerantsimäär või (ba) > e, minge 3. sammu juurde.

Step 5) Kuva c ligikaudse juurena.

Vaatame poolitamise meetodi algoritmi näidet.
Peame leidma järgmise pideva funktsiooni juure, kasutades poolitamise meetodi valemit.

f (x) = x3 - x2 + 2

Poolitamise meetodi näide

Step 1) Oletame,

         a = -10,
         b = 10 ja
         e = 1% või 0.01

Step 2) Nüüd kontrollime, kas f(a)f(b) >= 0 või mitte.

         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

Seega asub ülaltoodud funktsiooni juur selles intervallis [-10, 10].

Step 3) Seejärel arvutatakse kõigepealt keskpunkt c.

Poolitamise meetodi näide

Nüüd tuleb kontrollida järgmisi tingimusi:

i) kas f(c) = 0:
         f(c) = f(0) = (0)3 – (0)2 + 2 = 2 ≠ 0

ii) kui f(a)f(c) < 0:
         f(c)f(a) = 2*(-1098) < 0

Tingimus on täidetud. Järgmise iteratsiooni jaoks on väärtused

         a = a = -10
         b = c = 0

Step 4) Kui (ba) = (0-(-10)) = 10>0.05, korratakse protsessi. Järgmised iteratsioonid on näidatud tabelis.

Kordus 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

Step 5) 11. iteratsioonis on 4. sammu tingimus vale. Seega on selle võrrandi juur -1.00586.

Poolitamise meetodi loogiline diagramm

Poolitamise meetodi loogiline diagramm

Pseudokood

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

Poolitamise meetodi näide keeles C/C++

sisend:

#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;
}

Väljund:

The root is :-1.00586

Poolitamise meetodi näide in Python

sisend:

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)

Väljund:

The root is :  -1.0059

Poolitamise meetodi eelised ja piirangud

Siin on poolitamise meetodi plussid ja miinused:

Plusse Miinused
Lihtne ja lihtne juurutamise meetod, mida rakendada. Konvergents on aeglane, kuna see põhineb lihtsalt intervalli poole võrrandamisel.
Kuna see sulgudes on juur, on see alati konvergentne. Kui üks esialgsetest oletustest on juure lähedal, võtab juureni jõudmine rohkem iteratsioone.
Veamäära saab kontrollida, suurendades või vähendades iteratsioonide arvu.

Võta see postitus kokku järgmiselt: