HOWTO · Python

Verwenden Sie Fsolve in Python

Dieser Artikel zeigt, wie Sie fsolve in Python verwenden.

Auf dieser Seite

scipy.optimize.fsolve sucht numerisch nach einem Wert, für den eine nichtlineare Funktion gleich null ist. Diese Anleitung zeigt, wie Sie SciPy installieren, eine skalare Gleichung oder ein Gleichungssystem lösen, einen Startwert wählen und das Ergebnis des Solvers prüfen.

Welche Gleichungen löst fsolve?

fsolve ist eine Funktion aus dem Modul scipy.optimize von SciPy. Sie verwendet ein lokales numerisches Verfahren, um eine Nullstelle von func(x) = 0 zu finden, wobei x eine oder mehrere Unbekannte enthalten kann. Bei einem Gleichungssystem gibt func für jede Unbekannte einen Residualwert zurück; an einer Nullstelle liegen alle diese Werte nahe null.

Ein numerischer Solver beweist weder, dass eine Nullstelle existiert, noch dass sie eindeutig oder die einzige ist. Die Suche beginnt beim angegebenen Startwert, und unterschiedliche Startwerte können zu unterschiedlichen Nullstellen führen. Ein zurückgegebener Wert ist erst dann aussagekräftig, wenn Sie sowohl die Konvergenzinformationen des Solvers als auch die Residuen für Ihr Problem prüfen.

SciPy installieren und fsolve importieren

Installieren Sie SciPy mit python -m pip install scipy in der Python-Umgebung, in der Ihr Skript ausgeführt wird. Importieren Sie die Funktion im Skript mit from scipy.optimize import fsolve. Wenn SciPy in dieser Umgebung bereits installiert ist, ist keine erneute Installation erforderlich.

Eine skalare nichtlineare Gleichung lösen

Bei einer Unbekannten definieren Sie eine Funktion, die das Eingabearray entgegennimmt und einen Residualwert zurückgibt. Dieses Beispiel löst x² - 2 = 0 mit einem Startwert nahe der positiven Nullstelle.

Führen Sie das Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from scipy.optimize import fsolve


def residual(x):
    return x[0] ** 2 - 2


root, info, ier, message = fsolve(residual, [1.0], full_output=True)
print("root:", root[0])
print("residual:", residual(root))
print("converged:", ier == 1)
root: 1.4142135623730947
residual: -8.881784197001252e-16
converged: True

fsolve übergibt x als Array, daher liest die Funktion das einzelne Element mit x[0] aus. Auch das zurückgegebene root hat die Form eines Arrays. Mit full_output=True gibt der Aufruf die Lösung, ein Informationswörterbuch, einen ganzzahligen Statuswert und eine Meldung zurück. Der Statuswert 1 bedeutet, dass der Solver Konvergenz meldet. Prüfen Sie trotzdem das Residuum, um festzustellen, ob die Genauigkeit für Ihre Anwendung ausreicht.

Ein System nichtlinearer Gleichungen lösen

Geben Sie bei einem Gleichungssystem eine Folge von Residualwerten zurück, deren Länge der Anzahl der Unbekannten entspricht. Dieses Beispiel verwendet zwei Gleichungen mit zwei Unbekannten: x² + y² - 5 = 0 und x - y - 1 = 0. Der Anfangsvektor liegt nahe bei der Lösung (2, 1).

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

from scipy.optimize import fsolve


def equations(values):
    x, y = values
    return [x**2 + y**2 - 5, x - y - 1]


initial_guess = [1.8, 0.8]
solution, info, ier, message = fsolve(
    equations, initial_guess, full_output=True
)
print("solution:", solution)
print("residuals:", equations(solution))
print("converged:", ier == 1)
solution: [2. 1.]
residuals: [np.float64(-2.3092638912203256e-14), np.float64(0.0)]
converged: True

Die beiden Einträge in initial_guess entsprechen x und y; die Funktion gibt zwei Residualwerte in derselben Reihenfolge wie die Gleichungen zurück. Die Anzahl der Residualwerte muss der Anzahl der Unbekannten entsprechen. Bei Systemen mit mehreren Nullstellen kann der Anfangsvektor beeinflussen, welche davon die lokale Iteration ansteuert.

Einen Startwert wählen und das Ergebnis prüfen

Wählen Sie x0 möglichst nahe an einer plausiblen Nullstelle. Der Solver verwendet diesen Ausgangspunkt für seine lokale Suche. Ein weit entfernter oder schlecht skalierter Startwert kann zum Scheitern führen, eine andere Nullstelle liefern oder zu einem für die Anwendung ungeeigneten Punkt führen. Wenn mehrere Nullstellen plausibel sind, probieren Sie anhand des Modells gewählte Startwerte aus und vergleichen Sie die zurückgegebenen Lösungen.

Wenn Sie Diagnosedaten benötigen, setzen Sie full_output=True und prüfen Sie ier und mesg (in den Beispielen message genannt). Ein Statuswert von 1 meldet Konvergenz gemäß den Abbruchkriterien des Solvers. Er belegt weder, dass das Modell korrekt ist, noch, dass das Residuum für Ihren Anwendungsfall klein genug ist. Berechnen Sie func(solution) direkt und vergleichen Sie jeden Residualwert mit einer Toleranz, die zu den Einheiten und der Skalierung des Problems passt. Ist das Ergebnis ungeeignet, überdenken Sie den Startwert, die Skalierung, das Modell oder die Wahl des Solvers, statt einen zurückgegebenen Zahlenwert als Beweis für eine Nullstelle zu behandeln.

Die wichtigsten Parameter und Grenzen von fsolve

Der Aufruf hat die Form fsolve(func, x0, args=(), fprime=None, full_output=False, col_deriv=False, xtol=1.49012e-8, maxfev=0, band=None, epsfcn=None, factor=100, diag=None). Die offizielle SciPy-Referenz zu fsolve beschreibt die vollständige Signatur und die Rückgabewerte.

  • func ist die Funktion, deren Residualwerte gegen null geführt werden. Sie erhält die aktuelle Schätzung und alle zusätzlichen Werte aus args.
  • x0 ist die anfängliche Schätzung. Für eine Unbekannte kann sie ein skalarähnlicher Wert sein, bei einem Gleichungssystem ein Vektor. In den Beispielen werden Arrays verwendet, damit die Funktion Eingaben einheitlich verarbeitet.
  • args ist ein Tupel mit zusätzlichen Argumenten, die nach der Schätzung an func übergeben werden.
  • fprime kann optional die Jacobi-Matrix der Ableitungen bereitstellen. Standardmäßig entsprechen ihre Zeilen den Residualfunktionen und ihre Spalten den Variablen.
  • full_output fordert zusätzlich zur Lösung Diagnosedaten, den Status und eine Meldung an.
  • col_deriv gibt an, dass eine bereitgestellte Jacobi-Matrix die Ableitungen spaltenweise berechnet, wodurch eine Transposition entfallen kann. Der Parameter ist relevant, wenn fprime angegeben wird.
  • xtol legt die Toleranz für den relativen Fehler zwischen aufeinanderfolgenden Iterationen fest. Das Erfüllen dieses Abbruchkriteriums allein garantiert keine kleinen Residualwerte.
  • maxfev begrenzt die Anzahl der Funktionsauswertungen. Der Wert null wählt den SciPy-Standardwert, der von der Anzahl der Variablen abhängt.
  • band beschreibt die untere und obere Bandbreite einer gebänderten Jacobi-Matrix, wenn SciPy die Ableitungen schätzt und kein fprime angegeben ist.
  • epsfcn beeinflusst die Schrittweite der Finite-Differenzen für geschätzte Ableitungen, wenn kein fprime angegeben ist.
  • factor legt die anfängliche Schrittbegrenzung fest; der zulässige Bereich reicht von 0.1 bis 100.
  • diag kann positive Skalierungsfaktoren für die Variablen angeben. Das ist hilfreich, wenn ihre Größenordnungen stark voneinander abweichen.

fsolve ist ein lokaler Nullstellensucher und bietet keine allgemeine Lösungsgarantie. Sein numerisches Verhalten hängt von der Funktion, der Anfangsschätzung, der Skalierung und den Abbrucheinstellungen ab.