This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.2)

 Documentation /  Mathematica /  Das Mathematica Buch /  Höhere Mathematik in Mathematica /  Numerische Operationen mit Funktionen /

Numerische Lösung von PolynomgleichungenNumerische Lösung von Differentialgleichungen

3.9.6 Numerische Nullstellensuche

NSolve bietet einen allgemeinen Weg zur Suche nach numerischen Näherungslösungen von Polynomgleichungen. Es kann jedoch sehr viel schwieriger sein, numerische Lösungen für allgemeinere Gleichungen zu finden (siehe Abschnitt 3.4.2). FindRoot bietet eine Möglichkeit für die Suche nach einer numerischen Lösung für eine beliebige Gleichung oder für ein beliebiges Gleichungssystem.

Numerische Wurzelsuche

Die Kurven für und schneiden sich in einem Punkt.

In[1]:= Plot[{Cos[x], x}, {x, -1, 1}]

Out[1]=

Dies findet einen numerischen Näherungswert für den Wert von , an dem der Schnitt stattfindet. Die 0 teilt FindRoot mit, welcher Wert von zuerst zu versuchen ist.

In[2]:= FindRoot[Cos[x] == x, {x, 0}]

Out[2]=

Bei dem Versuch, eine Lösung für Ihre Gleichung zu finden, beginnt FindRoot an dem spezifizierten Punkt und versucht dann, einer Lösung fortschreitend immer näher zu kommen. Auch wenn Ihre Gleichungen mehrere Lösungen haben, gibt FindRoot immer die erste Lösung, die es findet, zurück. Welche Lösung dies ist, wird von Ihrer Wahl des Startwertes abhängen. Solange Sie genügend nahe bei einer der Lösungen starten, wird FindRoot immer diese Lösung zurückgeben.

Die Gleichung hat eine unendliche Anzahl von Lösungen der Form . Wenn Sie hinreichend nahe bei einer bestimmten Lösung starten, wird FindRoot diese Lösung liefern.

In[3]:= FindRoot[Sin[x] == 0, {x, 3}]

Out[3]=

Starten Sie mit , so erhalten Sie eine numerische Näherung der Lösung .

In[4]:= FindRoot[Sin[x] == 0, {x, 6}]

Out[4]=

Dies ereignet sich, wenn FindRoot keine Lösung für Ihre Gleichung finden kann.

In[5]:= FindRoot[Sin[x] == 2, {x, 1}]

Out[5]=

Wenn Sie wollen, daß FindRoot nach komplexen Lösungen für diese Gleichung sucht, dann müssen Sie einen komplexen Startwert angeben.

In[6]:= FindRoot[Sin[x] == 2, {x, I}]

Out[6]=

Sie können FindRoot Grenzen für die Region vorgeben, in der es nach Lösungen suchen soll.

Dies weist FindRoot an, Werte von x zu versuchen, die bei 1 beginnen, aber niemals das Gebiet von 0.5 bis 1.5 zu verlassen. In diesem Fall findet FindRoot keine Lösungen in dem spezifizierten Gebiet.

In[7]:= FindRoot[Sin[x] == 0, {x, 1, 0.5, 1.5}]

Out[7]=

Die Auswahl guter Startpunkte ist entscheidend für das Erhalten brauchbarer Antworten von FindRoot. Wenn Sie wissen wollen, wie man gute Startpunkte wählt, so müssen Sie ein wenig verstehen, wie FindRoot tatsächlich funktioniert.

Im einfachsten Fall setzt FindRoot das Newton-Verfahren ein. Um die Lösung einer Gleichung der Form zu finden, startet dieses Verfahren bei und verwendet dann die Kenntnis der Ableitung , um sich in einer Folge von Schritten in Richtung auf eine Lösung zu bewegen. Jeder neue Punkt , den es berechnet, wird mit Hilfe des vorigen Punktes mit der Formel gefunden.

Ein wichtiger Nachteil des Newton-Verfahrens besteht darin, daß es „steckenbleibt", wenn es jemals an einen Punkt gelangt, an dem die Ableitung der Funktion verschwindet. Sie können dies in der Regel vermeiden, indem Sie Startpunkte wählen, die keine Spezialeigenschaften bezüglich der Gleichungen haben, die sie zu lösen versuchen.

Die Ableitung von ist Null im Startpunkt . Deshalb kann FindRoot nicht entscheiden, ob es den ersten Schritt in der positiven oder negativen Richtung nehmen soll.

In[8]:= FindRoot[x^2 - 1 == 0, {x, 0}]

Out[8]=

Starten Sie an einem zufällig gewählten Punkt, so wird FindRoot gewöhnlich erfolgreich eine Lösung finden.

In[9]:= FindRoot[x^2 - 1 == 0, {x, Random[ ]}]

Out[9]=

FindRoot setzt in vielen Fällen verschiedene Versionen des Newton-Verfahrens ein. Insbesondere bei mehreren Variablen kann es extrem kompliziert werden, genau den Satz von Startpunkten zu wählen, der zu einer bestimmten Lösung führt. Die beste Methode besteht darin, zu versuchen, so dicht wie möglich bei der Lösung zu starten, und jegliche „Spezialpunkte" zu vermeiden.

Dies findet eine Lösung für ein System simultaner Gleichungen. Es ist gut, wenn man es vermeidet, für x und y gleiche oder irgendwie „spezielle" Startwerte zu wählen.

In[10]:= FindRoot[{Sin[x] == Cos[y], x + y == 1},
{x, .1}, {y, .2}]

Out[10]=

Wenn die Funktionen, die in Ihren Gleichungen auftauchen, hinreichend einfach sind, dann wird Mathematica in der Lage sein, ihre Ableitungen symbolisch zu finden. In allen bislang verwendeten Beispielen von FindRoot ist dies möglich gewesen. Deshalb kann FindRoot die Formel für das Newton-Verfahren direkt einsetzen.

Wenn anderseits FindRoot die Ableitung Ihrer Funktionen numerisch ermitteln muß, dann muß es einen anderen Ansatz verwenden. In einfachen Fällen basiert der verwendete Ansatz auf dem „Sekanten-Verfahren". Eine Eigenschaft dieser Methode ist, daß Sie für den Start nicht nur den ersten, sondern die ersten zwei Versuchswerte spezifizieren müssen.

Dies spezifiziert die ersten zwei Werte von x, die zu versuchen sind.

In[11]:= FindRoot[Cos[x] == x, {x, {0, 1}}]

Out[11]=

Kann Mathematica keine explizite Formel für die Ableitung dessen bestimmen, was in Ihrer Gleichung erscheint, so müssen Sie die ersten zwei Versuchswerte spezifizieren. Hier findet FindRoot eine Nullstelle der Riemannschen Zetafunktion.

In[12]:= FindRoot[Zeta[1/2 + I t] == 0, {t, {12, 13}}]

Out[12]=

Wenn Sie nach der Wurzel einer Funktion einer Variablen suchen, und die ersten zwei Punkte, die Sie FindRoot zum Probieren übergeben, Funktionswerte mit entgegengesetztem Vorzeichen liefern, dann wird FindRoot garantiert eine Wurzel finden. (Dies trifft zu, solange Ihre Funktion reell ist und einige grundlegende Stetigkeitsbedingungen erfüllt.)

Optionen für FindRoot

Es gibt mehrere Optionen, die Sie zur Kontrolle der Operation von FindRoot einsetzen können. Zuerst einmal können Sie MaxIterations festlegen, um die maximale Schrittzahl anzugeben, die FindRoot beim Versuch, eine Lösung zu finden, nehmen sollte. Auch wenn FindRoot mit der Schrittzahl, die Sie vorgeben, keine Lösung findet, gibt es doch den zuletzt versuchten Wert zurück. Wenn Sie die Suche fortsetzen wollen, so können Sie dann diesen Wert als Startwert angeben.

FindRoot evaluiert Ihre Funktion, um herauszuarbeiten, ob es eine annehmbare Wurzel gefunden hat, und prüft, ob das Ergebnis Null innerhalb der durch die Option AccuracyGoal angegebenen Genauigkeit ist. FindRoot wird immer eine Warnmeldung ausgeben, wenn es keine Lösung innerhalb der spezifizierten Genauigkeit findet. Bei internen Operationen verwendet FindRoot die durch die Option WorkingPrecision spezifizierte Präzision. Die Vorgabe für AccuracyGoal ist 10 Stellen geringer als die für WorkingPrecision.

Dies spezifiziert, daß die Zetafunktion Null mit 10-stelliger Genauigkeit in der Lösung sein muß. Die Riemannsche Vermutung besagt, daß der Imaginärteil von t in der Wurzel genau gleich Null sein soll.

In[13]:= FindRoot[Zeta[1/2 + I t] == 0, {t, {12, 13}},
AccuracyGoal -> 10]

Out[13]=

Numerische Lösung von PolynomgleichungenNumerische Lösung von Differentialgleichungen