Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Beschäftigen uns mit dem numerischen Lösen nichtlinearer Gleichungen

f(x)=0,f(x)=0,

wobei der Definitionsbereich [a,b][a,b] von f:[a,b]Rf:[a,b]\to\bbR so eingeschränkt sei, dass es genau eine Lösung gibt. Nichtlineare Gleichungen können immer auf diese Form gebracht werden, sodass das Lösen nichtlinearer Gleichungen äquivalent zum Finden von Nullstellen ist.

4.1Kondition

Formale Untersuchungen zur Kondition des Problems sind mit unseren Mittel nicht möglich. Die Eingabe ist hier eine Funktion. Die Ausgabe ist eine Nullstelle der Funktion. Wir müssten uns also mit Abständen in Funktionenräume beschäftigen um überhaupt über Eingabefehler reden zu können. Grundsätzlich gilt aber, dass die Kondition des Problems vor allem an der konkreten Gestalt der Funktion ff festgelegt wird.

Für quadratische Gleichungen haben wir die Kondition des Nullstellenfindens genauer untersucht. Allerdings haben wir dort nicht die gesamte quadratische Funktion als Eingabe betrachtet, sondern nur die in der Funktionsdefinition auftretenden Parameter pp und qq. Somit konnten wir Eingabefehler mit unseren Mittel ausdrücken.

Eine andere Frage ist die nach der Kondition beim Auswerten der Funktion ff an einer Stelle xx. Diese Frage können wir mit unseren Mitteln beantworten, sofern eine konkrete Funktion betrachtet wird. Für eine allgemeine Funktion ff sind keine Aussagen möglich. Da alle numerische Lösungsverfahren die Funktion ff an mehreren Stellen auswerten müssen, ist die Frage nach der Kondition dieser Auswertungen sehr relevant für die Stabilität von Lösungsalgorithmen.

4.2Iterative Verfahren

4.2.1Idee

Alle Lösungsverfahren für nichtlineare Gleichungen arbeiten iterativ, d.h. sie arbeiten nach folgendem Muster:

  1. Wähle einen Startwert x0[a,b]x_0\in[a,b].

  2. Für k=1,2k=1,2\ldots wiederhole:

    1. Berechne eine neue Näherungslösung xkx_k aus xk1x_{k-1}.

Im Prinzip kann xkx_k nicht nur von xk1x_{k-1} sondern auch von mehreren Vorgängern abhängen, ist aber hier nicht Thema.

Die Folge x0,x1,x2,x_0,x_1,x_2,\ldots liefert immer bessere Näherungen an die tatsächliche Lösung, sofern das Verfahren sinnvoll konstruiert ist.

Um aus der obigen Verfahrensidee konkrete Algorithmen zu erhalten, müssen wir folgende Fragen beantworten:

4.2.2Abbruchkriterium

Die Frage nach dem Abbruch der Iteration ist relevant, weil ein Computer nur endlich viele Rechenschritte durchführen kann. Die Antwort ist eine Abwägung zwischen verfügbarer Rechenzeit und akzeptiertem Lösungsfehler. Folgende Varianten sind üblich:

4.2.3Konvergenzordnung

Aus der Beziehung x=limkxkx^\ast=\lim\limits_{k\to\infty}x_k lassen sich keine Erkenntnisse zur Konvergenzgeschwindigkeit gewinnen. Deshalb ist man an konkreten Abschätzungen des Lösungsfehlers interessiert:

Aus beiden Abschätzungen folgt insbesondere x=limkxkx^\ast=\lim\limits_{k\to\infty}x_k, also Konvergenz.

Je höher die Konvergenzordnung, desto schneller die Konvergenz. Entsprechend sind bei hoher Konvergenzordnung weniger Iterationen nötig um einen vorgegebenen maximalen Lösungsfehler zu erreichen als bei niedriger Konvergenzordnung.

Abschätzungen der obigen Form sind jedoch selten direkt zu bekommen. Meist fügt man einen Zwischenschritt folgender Form ein:

xkxCxk1xp,k=1,2,,|x_k-x^\ast|\leq C\,|x_{k-1}-x^\ast|^p,\qquad k=1,2,\ldots,

wobei p1p\geq 1 und C>0C>0. Daraus folgt dann Konvergenz mit Konvergenzordnung pp, sofern folgende Bedingungen an die Konstante CC und den Startfehler x0x|x_0-x^\ast| erfüllt sind (IDVID 420):

Beispiel: Gilt für ein festes kk, dass xk1x0.1|x_{k-1}-x^\ast|\approx 0.1, so sinkt der Fehler in den nächsten Schritten bei linear Konvergenz (p=1p=1) stets nur um den Faktor C<1C<1. Bei quadratischer Konvergenz (p=2p=2) hingegen beträgt der Fehler in den nächsten Schritte etwa 0.01, 0.0001, 0.00000001.

4.3Bisektionsverfahren

4.3.1Verfahren

Das Bisektionsverfahren (auch: Intervallschachtelung) ist ein einfaches Verfahren zur Nullstellenbestimmung.

Die Bedinung der Form f(a)f(b)0f(a)\,f(b)\leq 0 sichert, dass entweder im Intervall (a,b)(a,b) eine Nullstelle liegt (bei strenger Ungleichheit) oder ein Intervallende eine Nullstelle ist (bei Gleichheit). Liegen mehrere Nullstellen im Startintervall [a0,b0][a_0,b_0], so liefert das Verfahren nur eine dieser Nullstellen, wobei keine allgemeine Aussagen darüber möglich sind, welche Nullstelle geliefert wird.

4.3.2Konvergenz und Abbruchkriterium

Ist der gewünschte maximale (absolute) Lösungsfehler Δ>0\Delta>0 vorgegeben, so kann wegen

xkxbkak2|x_k-x^\ast|\leq\frac{b_k-a_k}{2}

die Iteration gestoppt werden, sobald bkak2Δb_k-a_k\leq 2\,\Delta. Wegen

bkak=b0a02kb_k-a_k=\frac{b_0-a_0}{2^k}

ist die Iterationsanzahl dann

n=log2b0a02Δ;n=\left\lceil\log_2\frac{b_0-a_0}{2\,\Delta}\right\rceil;

insbesondere ist sie im Vorfeld exakt bekannt. Ein zusätzliche Begrenzung der Iterationsanzahl als weiteres Abbruchkriterium ist nicht nötig.

4.3.3Algorithmus

Ein konkreter Algorithmus zur Umsetzung des Bisektionsverfahrens kann wie folgt aussehen (ohne explizites Erwähnen des Rundens nach jeder Rechenoperation):

Eine vollständige Stabilitätsanalyse ist trotz des relativ einfachen Algorithmus recht mühsam. Das Verfahren gilt als sehr stabil. Wenn die Funktion ff also fehlerfrei auswertbar ist (fehlerfreie Eingabe), dann liegt der Ausgabefehler in der Größenordnung des durch übliche fehlerbehaftete Eingaben auch bei exakter Rechnung nicht zu vermeidenden Ausgabefehlers (Kondition!), sofern Δ\Delta im Abbruchkriterium entsprechend klein gewählt wird. Einige Hinweise zur Einschätzung der Stabilität:

4.4Newton-Verfahren

4.4.1Verfahren

Das Newton-Verfahren nutzt zusätzlich zu den Funktionswerten von ff auch die erste Ableitung ff' um Informationen über die Lage einer Nullstelle zu erhalten.

Dieses Verfahren wählt xkx_k also Nullstelle der Tangent an ff an der Stelle xk1x_{k-1} (IDVID 450).

4.4.2Konvergenz und Abbruchkriterium

Aus dieser Abschätzung folgt quadratische Konvergenz xkxcγ(2k)|x_k-x^\ast|\leq c\,\gamma^{(2^k)} mit c=1c=1 und

γ={c22c1x0x,falls c2<2c1,c22c1x0x,sonst,\gamma=\begin{cases} \sqrt{\frac{c_2}{2\,c_1}}\,|x_0-x^\ast|,&\text{falls }c_2<2\,c_1,\\ \frac{c_2}{2\,c_1}\,|x_0-x^\ast|,&\text{sonst},\\ \end{cases}

wobei

x0x<{2c1c2,falls c2<2c1,2c1c2,sonst|x_0-x^\ast|<\begin{cases} \sqrt{\frac{2\,c_1}{c_2}},&\text{falls }c_2<2\,c_1,\\ \frac{2\,c_1}{c_2},&\text{sonst} \end{cases}

gelten muss. Damit das Newton-Verfahren konvergiert müssen also insbesondere zwei Bedingungen erfüllt sein:

Sind diese Bedingungen erfüllt, so konvergiert das Newton-Verfahren quadratisch. Man spricht auch von lokaler quadratischer Konvergenz. Im Gegensatz dazu ist das Bijektionsverfahren global konvergent, allerdings nur linear.

Da die Konstanten c1c_1 und c2c_2 praktisch nicht zugänglich sind, kann aus der Abschätzung für die Konvergenzordnung kein in der Praxis einsetzbares Abbruchkriterium gewonnen werden. Man behilft sich mit der Tatsache, dass bei Konvergenz der Abstand xkxk1|x_k-x_{k-1}| zwischen zwei Iterierten gegen Null geht. Abgebrochen wird also, wenn dieser Abstand unter eine vorgegebene Schranke fällt.

4.4.3Algorithmus

Ein konkrete Umsetzung des Newton-Verfahrens kann wie folgt aussehen (ohne explizites Erwähnen des Rundens nach jeder Rechenoperation):

Dieser Algorithmus ist stabil. Insbesondere werden Rundungsfehler im Laufe der Iterationen nicht verstärkt. Jede neue Iteration kann als Neustart des Algorithmus mit anderem Startwert betrachtet werden. Da die Wahl des Startwertes (innerhalb gewisser Grenzen) keinen Einfluss auf die Lösung hat, spielen Rundungsfehler des Startwertes keine Rolle.

4.4.4Beispiele

Um das Problem der nicht globalen Konvergenz zu verdeutlichen führen wir das Newton-Verfahren für viele verschiedene Startwerte x0x_0 aus und stellen die Konvergenz bzw. Nichtkonvergenz grafisch dar. Dabei sehen wir eine Näherungsfolge x0,x1,x2,x_0,x_1,x_2,\ldots als konvergent an, wenn innerhalb von 1000 Iterationen der Abstand xkxk1|x_k-x_{k-1}| unter 10-10 sinkt. Zusätzlich stellen wir dar, gegen welche von ggf. mehreren Nullstellen die Folge konvergiert.

In den folgenden Diagrammen sind neben der betrachteten Funktion ff die Iterationsanzahlen bis zum erstmaligen Unterschreiten der Fehlerschranke und (farblich) die angenäherten Nullstellen ausgehend von verschiedenen Startwerten x0x_0 dargestellt.

Source
import numpy as np
import matplotlib.pyplot as plt

def visualize_newton(f, f1, zeros, a, b, n=1000):

    # grid of different initial values
    x0s = np.linspace(a, b, n)
    
    # Newton method for each initial value
    delta = 1e-10
    max_iter = 1000
    limits = []
    iters = []
    for x0 in x0s:
        x_old = x0
        for k in range(max_iter):
            x = x_old - f(x_old) / f1(x_old)
            if np.abs(x - x_old) < delta:
                limits.append(round(x))
                iters.append(k)
                break
            x_old = x
        else:
            limits.append(np.nan)
            iters.append(max_iter)
    
    # convert limits to colors
    colors = ['#ff0000', '#40c000', '#0000ff']
    no_conv_color = '#808080'  # no convergence
    if len(zeros) > len(colors):
        print('More zeros than colors! Ignoring some zeros.')
    zero_to_color = dict(zip(zeros, colors))
    limits_color = [zero_to_color.get(limit, no_conv_color) for limit in limits]
    
    # plot
    fig, ax1 = plt.subplots(figsize=(10, 5))
    ax2 = ax1.twinx()
    ax1.bar(x0s, iters, color=limits_color, width=(b - a) / n)
    ax2.plot(x0s, f(x0s), '-k')
    for zero in zeros:
        ax2.plot(zero, f(zero), 'o', color=zero_to_color[int(zero)], markersize=10)
    ax1.set_xlim(a, b)
    ax1.set_ylim(0, max([i for i in iters if i < max_iter]))
    ax1.grid(axis='x')
    ax2.grid(axis='y')
    ax1.set_xlabel('$x$')
    ax1.set_ylabel('Iterationen')
    ax2.set_ylabel('$f$')
    ax1.set_title('Einzugsbereiche der Nullstellen und Konvergenzgeschwindigkeit')
    plt.show()

4.4.4.1Polynom 3. Grades

Konvergenzverhalten für das Polynom

f(x)=x3+2x2x2,x[2.5,1.3].f(x)=x^3+2\,x^2-x-2,\quad x\in[-2.5,1.3].
visualize_newton(
    lambda x: x ** 3 + 2 * x ** 2 - x - 2,
    lambda x: 3 * x ** 2 + 4 * x - 1,
    [-2, -1, 1],
    -2.5, 1.3
)
<Figure size 1000x500 with 2 Axes>

An den Extremstellen gilt f(x)=0f'(x)=0, sodass das Newton-Verfahren dort nicht anwendbar ist (alle Berechnungen liefern nan, sodass die Abbruchbedingung nie erfüllt ist). Für x0x_0, für die weitere Iterierte auf eine Extremstelle fallen, ist das Newton-Verfahren ebenfalls nicht anwendbar. Ist x0x_0 in der Nähe einer Extremstelle, so führen schon sehr kleine Änderungen an x0x_0 zum Wechsel der angestrebten Nullstelle.

4.4.4.2Sinus

Konvergenzverhalten für die Sinusfunktion

f(x)=sin(πx),x[0.5,3.5].f(x)=\sin(\pi\,x),\quad x\in[0.5,3.5].
visualize_newton(
    lambda x: np.sin(np.pi * x),
    lambda x: np.pi * np.cos(np.pi * x),
    [1, 2, 3],
    0.5, 3.5
)
<Figure size 1000x500 with 2 Axes>

Liegt x0x_0 in der Nähe einer Extremstelle, so verläuft die Tangente sehr schwach. Entsprechend weit entfernt ist x1x_1, sodass auch Startwerte innerhalb des dargestellten Intervalls zu Näherungen von weit entfernt liegenden Nullstellen führen können. Liegt die angestrebte Nullstelle nicht im dargestellten Intervall, so wird der entsprechende Startwert grau eingefärbt (gleiche Farbe wie bei Nicht-Konvergenz).