Beruflich Dokumente
Kultur Dokumente
Universität Wien
Algorithmen
zur
Nullstellenbestimmung
Bisektion,
Sekantenmethode,
Newtonverfahren
von
Franz
Eigner
UK
Statistisches
Programmieren
bei
Prof.
Wozabal
Statistisches
Programmieren
Franz
Eigner,
SS07
1. Verfahren zum Auffinden einer Nullstelle einer Funktion f: R ‐> R.
Die
3
vorgestellten
Algorithmen
gehen
adaptiv
vor,
d.h.
die
jeweils
nächsten
Suchpunkte
sind
abhängig
von
den
Funktionswerten
der
vorhergehenden
Suchpunkte.
Allgemein
ist
das
Prinzip
so,
daß
das
Intervall,
welches
das
Minimum
enthält
von
Schritt
zu
Schritt
weiter
eingeengt
wird.
Die
Algorithmen
sind
darauf
ausgelegt,
nach
dem
Auffinden
einer
Nullstelle
abzubrechen,
auch
wenn
eine
Funktion
mit
mehreren
Nullstellen
vorliegt.
Bei
relativ
glattem
Verlauf
der
Zielfunktion
wird
das
globale
Optimum
gefunden.
In
ungünstigen
Fällen
wird
nur
ein
lokales
Optimum
gefunden.
1.1)
Bisektion
(Halbierungsmethode)
Grundsätzlich
finden
Bisektionsverfahren
immer
dann
Anwendung,
wenn
ein
Problem
gelöst
werden
kann,
indem
es
in
zwei
etwa
gleichgroße
Teilprobleme
zerlegt
wird,
die
dann
einzeln
für
sich
behandelt
werden
können.
Diese
Methode
eignet
sich
für
Funktionen
f,
die
in
einem
Intervall
I
=
[a,b]
stetig
sind
und
zwischen
den
Endpunkten
a
und
b
ihr
Vorzeichen
wechseln,
d.h.
f(a)
*
f(b)
<
0.
Nach
dem
Zwischenwertsatz
gibt
es
in
diesem
Intervall
ein
x0
є
I
derart,
dass
f(x0)
=
0.
Durch
sukzessive
Halbierung
des
Intervalls
um
die
Stelle,
an
der
das
Vorzeichen
wechselt,
zieht
sich
das
Intervall
I,
in
welchem
sich
die
Nullstelle
befindet,
immer
weiter
zusammen.
Algorithmus:
1.
(fa*fb>0)
muss
erfüllt
sein
(Intervall
enthält
Nullstelle)
2. Setze
x
=
(a+b)/2
3. Wiederhole
:
Falls
f(a)
*
f(x)
<
0,
setze
b=x,
sonst
setze
a=x
Abbruch:
falls
|f(x)|
<
tol
4. Ausgabe:
x
Die
Bisektion
eignet
sich
insbesondere
für
folgende
Fälle:
• Die
Startwerte
der
klassischen
Verfahren
wie
z.B.
Newton‐Verfahren
liegen
nicht
hinreichend
nah
genug
an
der
Nullstelle,
so
dass
dort
keine
lokale
Konvergenz
eintritt.
Nachteile
der
Bisektion:
• Bei
einfachen
Fällen
(streng
monotone
Funktion)
ist
sie
langsamer
als
ein
quadratisch
konvergentes
Verfahren
(Newtonverfahren)
• Ohne
Vorzeichenwechsel
im
gegebenen
Intervall
kann
der
Algorithmus
nicht
starten.
2
Statistisches
Programmieren
Franz
Eigner,
SS07
1.2) Sekantenmethode
Das
Verfahren
ist
der
Halbierungsmethode
sehr
ähnlich.
Es
wird
ebenfalls
ein
Intervall
I
=
[a,b]
betrachtet.
Die
Nullstellen
von
f
können
aber
auch
außerhalb
von
I
liegen,
und
die
Funktion
f
muss
somit
als
überall
stetig
vorausgesetzt
werden.
Algorithmus:
1. setze
k=1.
Wähle
x0
und
x1
als
Startwerte
2. Wiederhole
:
und
setze
jeweils
k
=
k+1
Abbruch,
falls
|f(xk)|
<
tol
3. Ausgabe:
xk
Meistens
ist
die
Sekantenmethode
schneller
als
die
Halbierungsmethode,
da
in
die
Berechnung
der
Zwischenergebnisse
der
Funktionsverlauf
stärker
eingeht.
Bestimmte
Verläufe
machen
das
Verfahren
aber
langsamer,
etwa
wenn
die
Nullstelle
am
Rand
des
Intervalls
liegt
und
der
Funktionsgraph
dort
steil
ansteigt.
Das
Verfahren
ist
auch
etwas
unsicherer,
da
x
nicht
im
betrachteten
Intervall
[a,b]
liegen
muss.
1.3)
Newtonverfahren
(Tangentenmethode)
Die
vorhergehenden
Methoden
verwendeten
nur
Berechnungen
von
Funktionswerten,
nicht
aber
Ableitungen.
Das
wichtigste
Verfahren,
das
auch
Ableitungen
verwendet,
ist
das
Newton‐Verfahren.
Gegeben
ein
Startwert
xn.
Wir
bestimmen
im
Punkt
(xn,
f(xn))
die
Tangente
an
den
Graphen
von
f
und
wählen
ihren
Schnittpunkt
mit
der
x‐Achse
als
neue
Näherung
xn+1.
Algorithmus:
("Newton‐Raphson")
1. Wähle
x1
als
Startwert
2. Wiederhole
:
xk+1
:=
xk
‐
f(xk)/f‘(xk)
und
setze
jeweils
k
=
k+1
Abbruch,
falls
|f(xk)|
<
tol
3. Ausgabe:
xk
Die
Konvergenz
dieses
Verfahrens
übertrifft
die
Sekantenmethode
i.A.
deutlich.
Wesentlich
für
eine
gute
Konvergenz
ist,
daß
der
Startwert
schon
relativ
nahe
beim
Optimum
ist.
Ist
der
Startwert
so
gewählt,
dass
das
Newton‐Verfahren
konvergiert,
so
ist
die
Konvergenz
quadratisch,
also
mit
Konvergenzordnung
2.
Das
Newton‐Verfahren
kann
allerdings
auch
scheitern.
Es
kann
passieren,
dass
• die
Folge
divergiert,
der
Abstand
zur
Nullstelle
wächst
bis
ins
Unendliche.
• die
Folge
divergiert,
bleibt
aber
beschränkt.
Die
Folge
oszilliert
zwischen
speziellen
Werten.
Vorteile
des
Newtonverfahrens:
• i.
A.
schneller
als
Bisektion
und
Sekantenverfahren
• es
wird
mehr
Information
benötigt.
(1.
Ableitung)
3
Statistisches
Programmieren
Franz
Eigner,
SS07
Vergleich
der
Konvergenzgeschwindigkeit
anhand
der
folgenden
Funktionen:
2.
(1)
f(x)
=
x^2
(2)
f(x)
=
x^2
+57
(3)
f(x)
=
5*sin(10x)
(4)
f(x)
=
x^4
–
(7/3)
x^2
(5)
f(x)
=
60x
‐
108x^2
+
66x^3
‐13
x^4
4
Statistisches
Programmieren
Franz
Eigner,
SS07
• f1(x) = x^2
Exakte
Berechnung
der
Nullstelle:
SOLVE(f1(x)
=
0,
x)
x
=
0
Bisektion:
Nullstelle
kann
mit
Bisektionsverfahren
nicht
berechnet
werden,
da
die
2
Funktionswerte
des
angegeben
Intervalls
[a,b]
die
gleichen
Vorzeichen
aufweisen,
d.h.
die
Bedingung:
f(a)*f(b)
<
0
ist
nicht
erfüllt.
Sekantenmethode:
>
erg.sekanten.f1=sekanten(f1,
x1=0.1,
x2=2,
intervall=c(0,
3),
tol=tol1)
>
erg.sekanten.f1
$xwert
[1]
0.002721088
$Anzahl_Iterationen
[1]
9
Konvergiert
aber
z.b
nicht
für
x1=
‐2,
x2=
2.
Newtonverfahren:
>
erg.newton.f1=newton(f1,
df1,
0.5,
c(0,
3),
tol=tol1)
>
erg.newton.f1
$xwert
[1]
0.001953125
$Anzahl_Iterationen
[1]
8
Für
einen
Startwert
von
10
benötigt
man
allerdings
schon
12
Iterationen.
Résumé:
Newton‐
und
Sekantenverfahren
erzielen
ähnliche
Ergebnisse.
Die
Bisektion
offenbart
einer
ihrer
Schwächen.
• f2(x)
=
x^2
+
57
Exakte
Berechnung
der
Nullstelle:
f2(x)
≔
x^2
+
57
APPROX(SOLVE(f2(x)
=
0,
x))
x
=
‐
7.549834435∙i
∨
x
=
7.549834435∙i
Nullstellen
wären
2
imaginäre
Zahlen,
in
der
Menge
R
gibt
es
allerdings
keine
Nullstelle
!!
Bisektion
bricht
ab,
da
die
2
Funktionswerte
des
Intervalls
[a,b]
immer
die
gleichen
Vorzeichen
(hier
+)
aufweisen,
d.h.
die
Bedingung:
f(a)*f(b)
<
0
ist
nicht
erfüllt.
Newtonverfahren
und
Sekantenverfahren
lassen
die
Schleife
unendlich
lang
durchlaufen
‐>
man
erhält
keine
Lösung.
Eine
zusätzliche
Abbruchbedingung,
welche
nur
eine
endlich
große
Anzahl
von
Iterationen
zulässt,
würde
die
Endlosschleife
verhindern.
5
Statistisches
Programmieren
Franz
Eigner,
SS07
• f3(x)
=
5*sin(10x)
Exakte
Berechnung
der
Nullstelle:
Unendlich
viele
verschiedene
Nullstellen
in
bestimmten
Abständen
Bisektion:
>
erg.bisektion.f3=bisektion(f3,
c(0,
2),tol=tol1)
>
erg.bisektion.f3
$xwert
[1]
1.256637
$Anzahl_Iterationen
[1]
21
Das
Ergebnis
ist
relativ
robust.
Bei
der
Wahl
von
c(0,20)
erhält
man
ähnlich
‘schnell’
eine
(andere)
Lösung.
Der
Algorithmus
ist
aber
grundsätzlich
nicht
besonders
flott.
Sekantenmethode:
>
erg.sekanten.f3=sekanten(f3,
x1=0.1,
x2=3,
intervall=c(0,
3),
tol=tol1)
>
erg.sekanten.f3
$xwert
[1]
2.199115
$Anzahl_Iterationen
[1]
6
Newtonverfahren:
>
erg.newton.f3=newton(f3,
df3,
0.5,
c(0,
3),
tol=tol1)
>
erg.newton.f3
$xwert
[1]
0.9424778
$Anzahl_Iterationen
[1]
5
Wenn
ich
als
Startwert
10
nehme,
brauche
ich
sogar
nur
3
Iterationen.
Wahl
des
Startwertes
ist
hier
aber
eher
sekundär.
Man
gelangt
immer
relativ
rasch
zu
einer
Nullstelle.
Résumé:
Bisektion
fällt
punkto
Geschwindigkeit
relativ
stark
zurück.
Newtonverfahren
ist
hier
i.A.
knapp
besser
als
die
Sekantenmethode.
6
Statistisches
Programmieren
Franz
Eigner,
SS07
• f4(x)
=
x^4
–
(7/3)
x^2
Exakte
Berechnung
der
Nullstelle:
APPROX(SOLVE(f4(x)
=
0,
x,
Real))
x
=
‐1.527525231
∨
x
=
1.527525231
∨
x
=
0
Bisektion:
>
erg.bisektion.f4<‐bisektion(f4,
c(0.1,
2),tol=tol1)
>
erg.bisektion.f4
$xwert
[1]
1.527526
$Anzahl_Iterationen
[1]
18
Achtung:
wählt
man
z.B.
c(‐2,2),
erhält
man
kein
Ergebnis.
Es
findet
nämlich
kein
Vorzeichenwechsel
statt.
Sekantenmethode:
>
erg.sekanten.f4=sekanten(f4,
x1=0.1,
x2=3,
intervall=c(0,
3),
tol=tol1)
>
erg.sekanten.f4
$xwert
[1]
0.001840566
$Anzahl_Iterationen
[1]
10
(x1=‐3,
x2=‐2)
für
Nullstelle
mit
x
=
‐1.527530
(x1=2,
x2=3)
für
Nullstelle
mit
x
=
1.527530
Newtonverfahren:
>
erg.newton.f4=newton(f4,
df4,
0.5,
c(0,
3),
tol=tol1)
>
erg.newton.f4
$xwert
[1]
0.001641103
$Anzahl_Iterationen
[1]
8
Mit
einem
Startwert
von
1.5
bzw.
‐1.5
wird
die
Nullstelle
mit
x
=
1.512753
bzw.
mit
x
=‐1.512753
gefunden.
Wahl
des
Startwertes
ist
hier
besonders
wichtig
!
Résumé:
Punkto
Geschwindigkeit
liegen
ähnliche
Ergebnisse
vor
wie
bei
den
anderen
Funktionen.
Jedoch:
Das
Newtonverfahren
hat
Probleme
alle
Nullstellen
zu
finden,
wenn
die
Startwerte
allzu
weit
von
der
Lösung
entfernt
sind.
Die
Sekantenmethode
scheint
hier
etwas
weniger
sensibel
zu
sein.
7
Statistisches
Programmieren
Franz
Eigner,
SS07
• f5(x)
=
60x
‐
108x^2
+
66x^3
‐13
x^4
Exakte
Berechnung
der
Nullstelle:
APPROX(SOLVE(f5(x)
=
0,
x,
Real))
x
=
2.469974917
∨
x
=
0
Bisektion:
>
erg.bisektion.f5=bisektion(f5,
c(0.1,
x2),tol=tol1)
x2
Xwerte
Anzahl_Iter
‐10
2.980232e‐08
23
3
2.469975
22
‐7
‐7.748604e‐08
23
6
2.469975
23
‐4
9.536743e‐08
19
9
2.469975
23
‐1
9.536743e‐08
19
Achtung:
wählt
man
z.B.
c(0.1,
2)
oder
c(‐5,
5)
erhält
man
kein
Ergebnis.
Es
findet
nämlich
kein
Vorzeichenwechsel
statt.
Sekantenmethode:
>
erg.sekanten.f5=sekanten(f5,
x1=0.1,
x2,
intervall=c(0,
3),
tol=tol1)
x2
Xwerte
Anzahl_Iter
8
2
0.0000000463
15
2
‐4
0.0000000003
7
9
3
2.4699748829
68
3
‐3
0.0000000002
7
10
4
0.0000000001
8
4
‐2
0.0000000001
7
11
5
0.0000000063
7
5
‐1
‐0.0000000467
6
12
6
0.0000000017
7
6
0
0.0000000000
0
13
7
0.0000000010
7
7
1
2.4699749150
103
Beide
Lösungen
werden
gefunden
mit
Hilfe
von
verschiedenen
Startwerten.
Newtonverfahren:
>
erg.newton.f5=newton(f5,
df5,
n,
c(0,
3),
tol=tol1)
Startwerte
Xwerte
Anzahl_Iter
0.5
2.46997492
5
‐5.0
0.00000000
10
1.0
0.00000000
7
‐4.0
‐0.00000002
9
1.5
0.00000000
6
‐3.0
0.00000000
9
2.0
0.00000000
1
‐2.0
0.00000000
8
2.5
2.46997492
3
‐1.0
0.00000000
6
3.0
2.46997493
5
0.0
0.00000000
0
4.0
2.46997492
7
Beide
Lösungen
werden
gefunden
mit
Hilfe
von
verschiedenen
Startwerten.
Résumé:
Die
verlässlichsten
Ergebnisse
liefert
das
Newtonverfahren.
Die
Sekantenmethode
erlaubt
sich
ein
paar
ungünstige
Durchläufe.
Das
Bisektionsverfahren
erscheint
als
relativ
robust
bzgl.
der
Wahl
des
Intervalls
und
liefert
durchwegs
gleich
schnelle
Ergebnisse.
8
Statistisches
Programmieren
Franz
Eigner,
SS07
3. Lösen von Gleichungen
Durch
Umformung
kann
die
Nullstellensuche
zur
Lösungsfindung
von
Gleichungen
verwendet
werden.
Log(x)‐x^(‐2)
=
0
• log(x)
=
x^‐2
Lösung:
x
=
±
∞
oder
x
=
1.531584411
Bisekton:
>
bisektion(s1,
c(0,
3),tol=tol1)
$xwert
[1]
1.531586
$Anzahl_Iterationen
[1]
14
$Zwischenergebnisse
untere_Grenze
obere_Grenze
Mittel
Funktionswert
0.000000
3.000000
1.500000
‐0.0389793363
1.500000
3.000000
2.250000
0.6133993520
1.500000
2.250000
1.875000
0.3441642150
1.500000
1.875000
1.687500
0.1720821630
1.500000
1.687500
1.593750
0.0723949971
1.500000
1.593750
1.546875
0.0183202276
1.500000
1.546875
1.523438
‐0.0099051301
1.523438
1.546875
1.535156
0.0043108704
1.523438
1.535156
1.529297
‐0.0027709592
1.529297
1.535156
1.532227
0.0007764553
1.529297
1.532227
1.530762
‐0.0009956217
1.530762
1.532227
1.531494
‐0.0001091763
1.531494
1.532227
1.531860
0.0003337411
1.531494
1.531860
1.531677
0.0001123078
(vorletzte
Iteration)
Sekantenmethode:
>
sekanten(s1,
x1=0.1,
x2=2,
intervall=c(0,
3),
tol=tol1)
$xwert
[1]
1.531584
$Anzahl_Iterationen
[1]
6
$Zwischenergebnisse
Durchlauf
xwerte
Funktionswerte
1
0
0.100000
‐1.023026e+02
2
0
2.000000
4.431472e‐01
3
1
1.991805
4.369800e‐01
4
2
1.411157
‐1.577591e‐01
5
3
1.565178
3.980002e‐02
6
4
1.534149
3.097212e‐03
9
Statistisches
Programmieren
Franz
Eigner,
SS07
7
5
1.531531
‐6.505369e‐05
(vorletzte
Iteration)
x2
Xwerte
Anzahl_Iter
1
1.00
1.53158
6
7
2.50
1.53159
7
2
1.25
1.53158
5
8
2.75
1.53158
8
3
1.50
1.53158
4
9
3.00
1.53158
10
4
1.75
1.53158
5
10
3.25
1.53158
12
5
2.00
1.53158
6
11
3.50
1.53158
34
6
2.25
1.53158
7
Ab
x2
=
3.5
erhält
man
keine
Lösung
mehr.
(gegeben:
x1=0.1,
intervall=c(0,
3)
)
Newtonverfahren:
>
erg.newton.s1=newton(s1,
ds1,
0.5,
c(0,
3),
tol=tol1)
>
erg.newton.s1
$xwert
[1]
1.531584
$Anzahl_Iterationen
[1]
6
$Zwischenergebnisse
Iter
XWerte
Funktionswerte
1
0
0.5000000
‐4.693147181
2
1
0.7607304
‐2.001455246
3
2
1.1024230
‐0.725306933
4
3
1.4046548
‐0.167036610
5
4
1.5211736
‐0.012675748
6
5
1.5315163
‐0.000082405
(vorletzte
Iteration)
Achtung:
Bei
einem
Startwert
von
z.B.
5
konvergiert
das
Verfahren
nicht
!
Entwickung
der
fx‐Werte
der
drei
Verfahren:
Das
Newtonverfahrens
kann
seinen
anfänglichen
Rückstand
rasch
aufholen
und
liefert
am
schnellsten
Funktionswerte,
die
sehr
nahe
bei
0
liegen.
Die
fx‐Werte
werden
dabei
kontinuierlich
besser
und
nähern
sich
von
einer
Richtung
dem
Nullpunkt
an.
Das
Sekantenverfahren
liefert
zackiger
fxwerte,
sie
nehmen
sowohl
positive
als
auch
negative
Werte
an.
Das
Bisektionsverfahren
liefert
recht
konstant
bessere
Annäherungswerte
für
fx,
braucht
aber
ziemlich
lange,
bis
die
fx‐
Werte
wirklich
nahe
bei
0
sind.
Entwicklung
der
x‐Werte
der
drei
Verfahren:
Im
Newtonverfahren
konvergieren
sie
konsequent
Richtung
xn
(werden
also
entweder
immer
größer
oder
kleiner
bis
sie
xn
erreichen),
während
beim
Sekantenverfahren
die
x‐Werte
abwechselnd
größer
oder
kleiner
als
xn
sein
können.
10
Statistisches
Programmieren
Franz
Eigner,
SS07
Résumé:
Es
gilt
punkto
Schnelligkeit
i.A.:
Newton
<
Sekanten
<
Bisektion.
• xe^x
=
1
Bisektion:
>
erg.bisektion.s2=bisektion(s2,
c(0,
3),tol=tol1)
>
erg.bisektion.s2
$xwert
[1]
0.5671463
$Anzahl_Iterationen
[1]
16
Sekantenmethode:
>
erg.sekanten.s2=sekanten(s2,
x1=0.1,
x2=0.9,
intervall=c(0,
3),
tol=tol1)
>
erg.sekanten.s2
$xwert
[1]
0.567143
$Anzahl_Iterationen
[1]
5
Für
x2=5
benötigt
er
8
Iterationen.
Scheint
robust
zu
sein.
Newtonverfahren:
>
erg.newton.s2=newton(s2,
ds2,
5,
c(0,
3),
tol=tol1)
>
erg.newton.s2
$xwert
[1]
0.5671433
$Anzahl_Iterationen
[1]
10
x0
Xwerte
Iter
1
0.0
0.56714
5
7
3.0
0.56714
7
2
0.5
0.56714
3
8
3.5
0.56714
8
3
1.0
0.56714
4
9
4.0
0.56714
8
4
1.5
0.56714
5
10
4.5
0.56714
9
5
2.0
0.56714
6
11
5.0
0.56714
10
6
2.5
0.56714
6
Bei
einem
Startwert
von
0.5
braucht
er
sogar
nur
3
Iterationen.
Ergebnisse
sind
recht
robust.
Résumé:
Newtonverfahren
und
Sekantenmethode
scheinen
hier
ähnlich
schnell
zu
sein
und
liefern
durchwegs
rasch
die
Lösung.
Bisektion
hinkt
etwas
nach.
Quellenangabe
Uchida,
Gabriele:
Skriptum
für
Decision
Support
I.
Universität
Wien.
Schreiber,
Alfred:
VO
Algorithmen,
WS
00/01.
Universität
Flensburg.
www.gefilde.de/ashome/vorlesungen/algorithmen/algorithmen.html
11