Puolitusmenetelmän algoritmi esimerkkeineen

Älykäs yhteenveto

Puolitusmenetelmä on luotettava numeerinen tekniikka, joka löytää jatkuvan funktion juuren puolittamalla toistuvasti välin, jossa funktio vaihtaa etumerkkiä. Se on yksinkertainen, taatusti suppeneva ja laajalti käytetty tekniikassa, tieteellisessä laskennassa ja numeerisen analyysin alkeiskursseilla.

  • Perusidea: Puolita toistuvasti sulkumerkkiä [a, b], jossa f(a):lla ja f(b:llä on vastakkaiset etumerkit, kunnes väli kutistuu toleranssin alapuolelle.
  • 📐 Teoreettinen perusta: Rakennettu suoraan väliarvolauseelle, joka takaa juuren olemassaolon, kun funktio vaihtaa merkkiä jatkuvalla välillä.
  • 🔁 Konvergenssikäyttäytyminen: Lineaarinen konvergenssi, jossa virhe puolittuu iteraatiota kohden, mikä antaa ennustettavia, mutta suhteellisen hitaita tarkkuuden parannuksia.
  • Vahvuudet: Konventaa aina kelvollisten sulkujen kohdalla, vaatii vain funktion arvoja ja on helppo toteuttaa millä tahansa ohjelmointikielellä.
  • 🧪 Käytännön käyttö: Hyödyllinen epälineaaristen yhtälöiden ratkaisemiseen fysiikassa, rahoituksessa, koneoppimisen hyperparametrihaussa ja tekoälypohjaisissa numeerisissa ratkaisijoissa.

Mikä on puolitusmenetelmä?

Puolitusmenetelmä on yksi perustavanlaatuisimmista numeerisista tekniikoista polynomi- tai transsendentaaliyhtälön juuren löytämiseksi. Se toimii sulkemalla välin, joka sisältää juuren, ja jakamalla sitten kyseisen välin puoliksi jokaisella iteraatiolla, kunnes juuri sijaitsee hyväksyttävän toleranssin sisällä. Tämän sulkemiskäyttäytymisen vuoksi puolitusmenetelmää kutsutaan myös sulkemismenetelmäksi.

Koska sen toimintamekanismi muistuttaa binäärihakua, puolitusmenetelmä tunnetaan myös binäärihakumenetelmänä, puolitusmenetelmänä tai dikotomiamenetelmänä. Se perustuu vahvaan teoreettiseen perustaan: väliarvolauseeseen, joka takaa, että jatkuvan, merkkiä muuttavan funktion on ylitettävä nolla jossain kyseisen aikavälin sisällä.

Kun perusmääritelmä on olemassa, tutkitaanpa, miksi yhtälöiden juurien löytäminen on tärkeää ja miten puolitusmenetelmä sopii tähän laajempaan kuvaan.

Yhtälöiden juurten löytäminen

Tässä keskustelussa keskitymme vain yhtälöihin, joissa on yksi riippumaton muuttuja. Tällaiset yhtälöt voivat olla lineaarisia tai epälineaarisia. Lineaariset yhtälöt kuvaavat suoran viivan kuvaajaa, kun taas epälineaariset yhtälöt kuvaavat käyriä ja monimutkaisempia muotoja.

Yhtälön juuri on yhtälön toteuttavan riippumattoman muuttujan arvo. Esimerkiksi yhtälön juuri f(x) = 4 – x2 = 0 on 2, koska f(2) = 4 – 22 = 0.

Tarkastellaan funktiota f(x) reaalilukuna jatkuvana funktiona. Väliarvolauseen mukaan yhtälöllä f(x) = 0 on ainakin yksi juuri a:n ja b:n välillä aina, kun f(a)f(b) < 0. Toisin sanoen funktiolla f(x) on juuri, ”c”, jossain a:n ja b:n välillä.

Yhtälöiden juurten löytäminen

Tätä merkkimuutosominaisuutta hyödyntää juuri puolitusmenetelmä. Seuraavassa osiossa näytetään, miltä tämä idea näyttää graafisesti.

Puolitusmenetelmän graafinen esitys

Seuraava kaavio esittää puolitusmenetelmän toimintamekanismia. Kaaviosta näemme, että yhtälön varsinainen juuri on merkitty punaisella.

Menettely voidaan tiivistää seuraavasti:

  • Valitsemme ensin kaksi alustavaa arvausta, a.1 ja b1, jolle f(a1)f(b1) < 0. Väliarvolauseen mukaan juuren täytyy sijaita [a1, b1].
  • Laskemme sitten a:n keskipisteen1 ja b1, joka on b2Alkuperäinen aikaväli on nyt lyhennetty arvoon [a1, b2] koska f(a1)f(b2) <0.
  • Samalla tavalla aikaväli puolitetaan yhä uudelleen, kunnes löydetään likimääräinen ratkaisu halutun toleranssin sisällä.

Bisection-menetelmän graafinen esitys

Kun geometrinen intuitio on selvä, voimme nyt formalisoida proseduurin askel askeleelta etenevänä algoritmina.

Bisection Method Algorithm

Puolitusmenetelmäalgoritmin soveltamisen vaiheet yhtälön f(x) = 0 juuren löytämiseksi ovat seuraavat.

Vaihe 1) Valitse alkuarviot a, b ja toleranssiaste e.

Vaihe 2) Jos f(a)f(b) >= 0, niin juuri ei ole tällä välillä. Tässä tapauksessa ei ole ratkaisua välillä [a, b].

Vaihe 3) Etsi keskipiste, c = (a + b)/2.

(i) Jos funktion arvo keskipisteessä f(c) = 0, niin c on juuri. Siirry vaiheeseen 5.
(ii) Jos f(a)f(c) < 0, niin juuri on a:n ja c:n välissä. Aseta silloin a = a, b = c.
(iii) Muussa tapauksessa asetetaan a = c ja b = b.

Vaihe 4) Jos absoluuttinen virhe on suurempi kuin toleranssiarvo, eli (b – a) > e, palaa vaiheeseen 3.

Vaihe 5) Näytä c likimääräisenä juurena.

Katsotaanpa esimerkkiä puolitusmenetelmän algoritmista toiminnassa. Löydämme seuraavan jatkuvan funktion juuren käyttämällä puolitusmenetelmä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

Näin ollen yllä olevan funktion juuri on välillä [-10, 10].

Vaihe 3) Seuraavaksi lasketaan keskipiste c.

Esimerkki puolittamisesta

Seuraavat ehdot on nyt tarkistettava:

(i) Onko f(c) = 0:
         f(c) = f(0) = (0)3 - (0)2 + 2 = 2, joka ei ole yhtä suuri kuin 0.

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

Ehto täyttyy. Seuraavalla iteraatiolla arvot ovat:

         a = a = -10
         b = c = 0

Vaihe 4) Koska (b – a) = (0 – (-10)) = 10 > 0.01, prosessi toistetaan. Seuraavat iteraatiot on esitetty alla olevassa 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) Yhdennessätoista iteraatiossa vaiheen 4 ehto muuttuu epätosiksi. Näin ollen yhtälön likimääräinen juuri on -1.00586.

Numeerisen esimerkin jälkeen seuraavassa osiossa esitetään looginen kaavio, joka kuvaa koko ohjausvirran.

Puolittamismenetelmän looginen kaavio

Alla oleva vuokaavio tiivistää puolitusmenetelmän päätöksentekologiikan, mukaan lukien sulkujen tarkistuksen, keskipisteen päivityksen ja toleranssitestin.

Puolittamismenetelmän looginen kaavio

Pseudo-Code

Alla oleva pseudokoodi peilaa algoritmia ja toimii pohjana puolitusmenetelmän toteuttamiselle millä tahansa ohjelmointikielellä.

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++

Seuraavat C/C++ ohjelma toteuttaa puolitusmenetelmän löytääkseen f(x) = x -funktion juuren3 - x2 + 2 välillä [-10, 10].

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

Python Alla oleva versio tuottaa saman likimääräisen juuren käyttämällä identtistä logiikkaa, mikä tekee siitä ihanteellisen nopeaan kokeiluun ja opetukseen.

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

Puolitusmenetelmän edut ja rajoitukset

Kuten kaikilla numeerisilla tekniikoilla, puolitusmenetelmällä on selkeitä vahvuuksia ja muutamia käytännön haittoja. Alla oleva taulukko kokoaa yhteen tärkeimmät hyvät ja huonot puolet.

Plussat MIINUKSET
Helppo ja yksinkertainen juurien etsintämenetelmä, joka voidaan toteuttaa millä tahansa kielellä. Konvergenssi on hidasta, koska menetelmä yksinkertaisesti puolittaa välin jokaisella askeleella.
Se konvergoi aina, kun annetaan kelvollinen sulke, koska se sulkee juuren koko prosessin ajan. Jos jokin alkuperäisistä arvauksista on jo lähellä juurta, juureen pääseminen vaatii silti useita iteraatioita.
Virheprosenttia voidaan hallita suoraan lisäämällä tai vähentämällä iteraatioiden määrää tai tiukentamalla toleranssia. Se ei voi löytää kompleksisia juuria tai parillisen monikerrallisuuden useita juuria, koska funktio ei vaihda merkkiä tällaisissa juurissa.

Puolitusmenetelmän sovellukset

Puolitusmenetelmää käytetään monissa käytännön ja nykyaikaisissa laskentatilanteissa, joissa vaaditaan vankkaa juurenlöytövaihetta.

  • Tekniset simulaatiot: Lämmönsiirrossa, virtausdynamiikassa ja rakenneanalyysissä esiintyvien epälineaaristen yhtälöiden ratkaiseminen.
  • Talousmallinnus: Tuottojen, sisäisten tuottoprosenttien ja kannattavuusrajojemme laskeminen silloin, kun suljetun muodon ratkaisuja ei ole.
  • Koneoppiminen ja tekoäly: Kynnysarvojen paikantaminen, mallien kalibrointi ja hyperparametrien virittäminen tekoälypohjaisissa numeerisissa ratkaisimissa.
  • Tietokonegrafiikka: Säteen ja pinnan leikkauspisteiden ja parametriarvojen määrittäminen käyriä pitkin.
  • Sulautetut järjestelmät: Juurten approksimointi vähän resursseja kuluttavissa ohjaimissa, joissa yksinkertaisuus ja ennustettavuus ovat arvokkaampia kuin nopeus.

UKK

Puolitusmenetelmä on numeerinen tekniikka, joka löytää jatkuvan funktion juuren puolittamalla toistuvasti välin, jossa funktion etumerkki vaihtuu, ja valitsemalla puolikkaan, joka edelleen sisältää juuren.

Se suppenee aina, kun funktio on jatkuva välillä [a, b] ja f(a)f(b) on pienempi kuin nolla, koska väliarvolause takaa, että välillä on juuri, ja puolittaminen kutistaa sulkeita sen ympärillä.

Puolitusmenetelmä suppenee lineaarisesti. Virhe puolittuu karkeasti jokaisella iteraatiolla, joten toleranssin e saavuttaminen pituudeltaan L vaatii noin log2(L/e) iteraatiota, mikä on hitaampaa kuin Newtonin tai sekanttimenetelmien käyttö.

Menetelmä epäonnistuu, kun f(a):lla ja f(b):llä on sama etumerkki, kun funktio on epäjatkuva välillä tai kun juurella on parillinen monikertaisuus, koska funktio ei vaihda etumerkkiä tällaisen juuren yli.

Tekoälypohjaiset ratkaisijat yhdistävät usein puolitusmenetelmän opittuihin malleihin. Neuroverkko ehdottaa tiukkaa sulkua todennäköisen juuren ympärille, ja puolitusmenetelmä takaa sitten luotettavan ja sertifioidun ratkaisun kyseisen sulkutilan sisällä.

Tekoälymallit ovat erinomaisia ​​hahmontunnistuksessa, mutta eivät aina pysty varmistamaan tarkkoja vastauksia. Klassiset numeeriset menetelmät, kuten puolitus, tarjoavat todistettavissa olevan konvergenssin ja rajatun virheen, mikä tekee niistä ihanteellisia luotettavia taustajärjestelmiä tekoälyprosessien sisällä turvallisuuskriittisiin laskelmiin.

Tiivistä tämä viesti seuraavasti: