Sie sind auf Seite 1von 11


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


Das könnte Ihnen auch gefallen