Metoda bisecției sau metoda împărțirii unui segment la jumătate este cea mai simplă metodă numerică de rezolvare a ecuațiilor neliniare de forma f ( x )=0. Se presupune doar continuitatea funcției f ( x ). Căutarea se bazează pe teorema valorii intermediare .
Algoritmul se bazează pe următorul corolar din teorema Bolzano-Cauchy :
Fie o funcție continuă , atunci, dacă , atunci . |
Astfel, dacă căutăm zero, atunci la capetele segmentului, funcția trebuie să fie de semne opuse. Împărțiți segmentul în jumătate și luați-l pe cel al jumătăților, la capetele cărora funcția încă mai ia valorile semnelor opuse. Dacă valoarea funcției la punctul de mijloc s-a dovedit a fi zero dorit, atunci procesul se termină.
Precizia calculului este stabilită într-unul din două moduri:
Procedura trebuie continuată până când se obține precizia specificată.
Pentru a căuta o valoare arbitrară, este suficient să scazi valoarea dorită din valoarea funcției și să cauți zero al funcției rezultate.
Problema este de a găsi rădăcinile ecuației neliniare
Pentru a începe iterațiile, este necesar să cunoașteți intervalul de valori , la capetele cărora funcția ia valori de semne opuse.
Opusul semnelor valorilor funcției de la capetele segmentului poate fi determinat în mai multe moduri. Una dintre multe dintre aceste moduri este de a înmulți valorile funcției la capetele segmentului și de a determina semnul produsului comparând rezultatul înmulțirii cu zero:
în calculul real, acest mod de a verifica semnele opuse pe funcțiile abrupte duce la depășire prematură .
Pentru a elimina depășirea și a reduce costurile de timp, adică pentru a crește performanța, pe unele sisteme software și computerizate, opusul semnelor valorilor funcției de la capetele segmentului trebuie determinat prin formula:
întrucât o operație de comparare a două semne a două numere necesită mai puțin timp decât două operații: înmulțirea a două numere (în special virgulă mobilă și lungimea dublă) și compararea rezultatului cu zero. Cu această comparație, valorile funcției în puncte și nu pot fi calculate, este suficient să calculați doar semnele funcției în aceste puncte, ceea ce necesită mai puțin timp de calculator.
Din continuitatea funcției și a condiției (2.2) rezultă că există cel puțin o rădăcină a ecuației pe interval (în cazul unei funcții nemonotone , funcția are mai multe rădăcini, iar metoda conduce la găsirea uneia dintre ei).
Găsiți valoarea în mijlocul segmentului:
în calculele efective, pentru a reduce numărul de operații, la început, în afara buclei, se calculează lungimea segmentului după formula:
iar în buclă, lungimea următoarelor noi segmente este calculată conform formulei: iar noul punct de mijloc conform formulei:
Calculați valoarea funcției din mijlocul segmentului :
Acum să găsim un nou segment pe care funcția își schimbă semnul:
Pentru numărul de iterații , împărțirea în jumătate se efectuează o dată, astfel încât lungimea segmentului final este de ori mai mică decât lungimea segmentului original.
Există o metodă similară, dar cu un criteriu de oprire a calculelor de-a lungul axei [1] , în această metodă, calculele continuă până când, după următoarea bisectie, noul segment este mai mare decât precizia specificată de-a lungul axei : . În această metodă, segmentul de pe axă poate atinge o valoare dată , iar valorile funcțiilor (în special cele abrupte) de pe axă pot fi foarte departe de zero, în timp ce cu funcții plate, această metodă duce la un număr mare de calcule inutile.
În funcțiile discrete , și sunt numerele de elemente de matrice care nu pot fi fracționale, iar, în cazul celui de-al doilea criteriu de oprire, diferența nu poate fi mai mică de .
;Lăsa
Apoi algoritmul metodei bisecției poate fi scris în pseudocod după cum urmează:
Căutarea valorii cele mai apropiate de rădăcină într-o funcție discretă monotonă dată într-un tabel și scrisă într-un tablou constă în împărțirea matricei în jumătate (în două părți), alegând din două părți noi partea în care valorile lui elementele matricei își schimbă semnul comparând semnele elementului din mijloc al matricei cu semnul valorii de limită și repetând algoritmul pentru jumătatea în care valorile elementelor matricei își schimbă semnul.
Fie variabilele leftBorder și rightBorder să conțină, respectiv, left- leftGran și right- rightGran a graniței matricei, în care se află aproximarea la rădăcină. Studiul începe cu împărțirea matricei în jumătate (în două părți) prin găsirea numărului elementului din mijloc al matricei mid .
Dacă semnele valorilor matricei [leftBorder] și array [middle] sunt opuse, atunci aproximarea la rădăcină este căutată în jumătatea stângă a matricei, adică valoarea rightBorder devine mijlocul și doar stânga jumătate din matrice este examinată la următoarea iterație. Dacă semnele matricei[leftBorder] și ale matricei[middle] sunt aceleași, atunci se efectuează tranziția la căutarea unei aproximări la rădăcina din jumătatea dreaptă a matricei, adică mijlocul devine valoarea variabilei leftBorder și numai jumătatea dreaptă a matricei este examinată la următoarea iterație. Astfel, în urma fiecărei verificări, zona de căutare este înjumătățită.
De exemplu, dacă lungimea matricei este de 1023, atunci după prima comparație, zona este restrânsă la 511 elemente, iar după a doua - la 255. Astfel. pentru a căuta o aproximare a rădăcinii într-o matrice de 1023 de elemente, 10 treceri (iterații) sunt suficiente.
leftBorder = levGran rightBorder = rightGran în timp ce ( rightBorder - leftBorder > 1 ) { lungimea segmentului \ u003d rightgrand - liongrand jumătate din linie = int ( lungimea liniei / 2 ) middle = leftBorder + jumătate din linie dacă ( semn ( matrice [ margine stângă ]) ≠ semn ( matrice [ mijloc ])) marginea dreapta = mijlocul altfel marginea stângă = mijloc } printf mijloc