A
B
Voiko sinisen alueen pisteestä A piirtää yhtenäistä viivaa keltaisen alueen pisteeseen B ilman, että ylitetään punaista viivaa vähintään kerran?
Havaintoa kutsuttiin kurssilla MAA6 Bolzanon lauseeksi
[
]
1. arvaus
x
[
]
2. arvaus
x
[
]
3. arvaus
x
[
]
4. arvaus
x
[
]
5. arvaus
x
... tätä voidaan jatkaa. Keskipiste kuitenkin lähenee joka iteraatiolla nollakohtaa, eli se on nollakohdan likiarvo
Puolitusmentelmän yksi puolitusaskel voidaan siis kuvata seuraavasti:
Olkoon puolitettava väli \([a,b]\)
[
]
]
\(f(2)\) ja \(f(3)\) erimerkkiset
\(\Rightarrow\) uusi väli [2,3]
[
]
[
\(f(2)\) ja \(f(3)\) samanmerkkiset
\(\Rightarrow\) uusi väli [3,4]
Huom! Joskus harvoin sattuu niin, että \(f(c)=0\). Tällöin voidaan lopettaa puolittaminen tähän, koska nollakohta on sattumalta löytynyt.
Esim. etsi funktion \(f(x)=\ln(x)-1\) nollakohdan likiarvo yhden desimaalin tarkkuudella käyttäen puolitusmentelmää. Aloita välistä \([2,3]\).
| a | b | c | f(a) ja f(c) erimerkkiset |
|---|---|---|---|
| 2 | 3 | 2.5 | epätosi |
| 2.5 | 3 | 2.75 | tosi |
| 2.5 | 2.75 | 2.625 | epätosi |
| 2.625 | 2.75 | 2.6875 | epätosi |
| 2.6875 | 2.75 | 2.71875 | tosi |
| 2.6875 | 2.71875 | STOP |
Koska välin \([a,b]\) molemmat päätepisteet pyöristyvät yhden desimaalin tarkkuudella samaan lukuun, niin \(x\approx 2{,}7\)
Erimerkkisyyden voi laskennallisesti todeta parilla eri tapaa:
Puolitusmenetelmä voidaan esittää myös vuokaaviona
Etsi Pythonilla funktion \(f(x)=x^3-5x\) nollakohta välillä \([1,3]\)
a) käyttämällä 10 iteraatiota b) 4:n desimaalin tarkkuudella
a)
# Määritetään funktio Pythoniin
def f(x):
return x**3 - 5*x
# Asetetaan välin päätepisteille alkuarvot
a = 1.0
b = 3.0
for i in range(10):
c = (a + b)/2
if f(a)*f(c) < 0:
b = c
else:
a = c
print("Nollakohdan likiarvo on x = " + str(c))# Määritetään funktio Pythoniin
def f(x):
return x**3 - 5*x
# Asetetaan välin päätepisteille alkuarvot
a = 1.0
b = 3.0
while round(a,4) != round(b,4):
c = (a + b)/2
if f(a)*f(c) < 0:
b = c
else:
a = c
print("Nollakohdan likiarvo on x = " + str(round(c,4)))b) Komento round(x,n) pyöristää luvun x n:n desimaalin tarkkuudelle. Jatketaan toistoa niin kauan, kun a ja b eivät pyöristy samaan lukuun 4 desimaalin tarkkuudella
Puolitusmenetelmä nspiren taulukkolaskentaohjelmassa
Esim. etsi taulukkolaskimella funktion \(f(x)=x^3-5x\) nollakohta välillä \([1,3]\) puolitusmenetelmällä 4:n desimaalin tarkkuudella
Puolitusmenetelmä perustui funktion jatkuvuuteen. Entä jos funktio olisi myös derivoituva, auttaako tämä nollakohdan likiarvon määritämisessä?
\(x_1\)
\(x_2\)
\(x_3\)
Derivoituvan funktion \(f\) kohtaan \(x_1\) piirretyn tangentin kulmakerroin on \(f'(x_1)\), ja tangentilta löytyy piste \((x_1,f(x_1))\).
Suoran yhtälön kaavasta tangentin yhtälöksi saadaan:
\(y-f(x_1)=f'(x_1)(x-x_1)\)
Nollakohdassa \(y=0\), joten
\(-f(x_1)=f'(x_1)(x-x_1)\)
Kun yhtälöstä ratkaistaan \(x\), saadaan
\(x=x_1-\frac{f(x_1)}{f'(x_1)}\),
jossa \(x\) on uusi arvio nollakohdalle
\[x_n=x_{n-1}-\frac{f(x_{n-1})}{f'(x_{n-1})}\]
Iteroimalla saadaan Newtonin menetelmän kaava
\[x_n=x_{n-1}-\frac{f(x_{n-1})}{\underbrace{f'(x_{n-1})}_{\neq 0}}\]
Huom! Derivoituvuuden lisäksi täytyy olettaa, ettei derivaatta ole iteraatiokohdissa nolla, koska muuten jaettaisiin nollalla.
Lukujonon \((x_n)\) jäsenet voidaan laskea kätevimmin iteroimalla funktiota
\[g(x)=x-\frac{f(x)}{f'(x)}\]
Funktion \(g(x)=x-\frac{f(x)}{f'(x)}\) iterointi nspiressä:
# Määritetään funktio Pythoniin
def f(x):
return x**3 - 5*x
# Määritetään funktion f derivaatta
def df(x):
return 3*x**2 - 5
# Määritetään iteroitava funktio g(x)
def g(x):
return x - f(x)/df(x)
# Asetetaan alkuarvaus
x = 2.0
for i in range(10):
x = g(x)
print("Nollakohdan likiarvo on x = " + str(x))Iterointi Pythonissa 10 kertaa:
Kuten puolitusmenetelmässäkin, alkuarvon valitsemiseksi on hyvä katsoa kuvaajaa, erityisesti jos funktiolla on useampi nollakohta
Nyrkkisääntönä alkuarvo pitäisi olla "riittävän lähellä" haluttua nollakohtaa, mutta kokeilemalla asia selviää helpoiten
Varoitus: aina Newtonin menetelmä ei suppene kohti mitään nollakohtaa