Mathematica 14 - Mit Solve bekomme ich nicht alle Lösungen - woran liegt das?
- Erstellt am 25.1.2024
- Software: Mathematica 14
Ich habe in Mathematica zwei Funktionen definiert:
- f[x_]:=(a Sin[x] + Cos[x]) b
- g[x_]:=(a Sin[x] + Cos[x]) Sqrt[b]
Mit dem Befehl
Solve[f[x]==0,x]
erhalte ich die Lösung
Mit dem Befehl
Solve[g[x]==0,x]
erhalte ich jedoch nur eine unvollständige Lösung
und die Solve::ifun-Meldung
Inverse functions are being used by Solve, so some solutions may not be found; use Reduce for complete solution information. (Inverse Funktionen werden von Solve verwendet, so dass einige Lösungen möglicherweise nicht gefunden werden; verwenden Sie Reduce für vollständige Lösungsinformationen.)
Die gefundenen Lösungen sind hier nicht generell richtig. Wenn a∈ℝ, a≠0 und b≠0 sind, lösen die erste und die vierte Lösung die Gleichung nicht. Das sieht man zum Beispiel mit den Tests
Assuming[a∈Reals,FullSimplify[g[-ArcCos[-(a/Sqrt[1+a^2])]]]]
Assuming[a∈Reals, FullSimplify[g[ArcCos[a/Sqrt[1+a^2]]]]]
Warum ist das so, obwohl die endgültige Lösung unabhängig von b sein sollte? Was kann ich hier tun?
Erläuterung
Die endgültige Lösung ist unabhängig von b, aber der Prozess ist es nicht. Insbesondere ist er nicht unabhängig von b in Bezug auf die rechnerischen Vorbehalte, die man kontrollieren muss, um einen robusten und zuverlässigen Algorithmus zu entwickeln. Die Vorbehalte sind im Wesentlichen einer: der Umgang mit Verzweigungsschnitten (branch cuts). Mathematica verarbeitet symbolische Ausdrücke mit Hilfe von Mustern (Patterns). Der Artikel New Methods for Computing Algebraic Integrals im Wolfram-Blog ist eine sehr detaillierte Erklärung dieser Funktion, angewandt auf unbestimmte polynomiale Integrale.
Für das vorliegende Problem bedeuten die musterbasierten Operationen, dass Mathematica versucht, die Form oder Struktur der Gleichung zu erkennen und von dort aus zu arbeiten. Wenn in der symbolischen Gleichung keine Quadratwurzeln vorhanden sind, muss der allgemeinere Lösungsalgorithmus, der Verzweigungsschnitte und die Vorbehalte der Komplexen Analyse berücksichtigt, nicht verwendet werden. Wenn jedoch die Quadratwurzel-Operation vorhanden ist, berücksichtigt Solve, dass es sich im Allgemeinen um ein komplexeres Problem handeln könnte und geht von der Möglichkeit aus, dass aufgrund der Hauptvariablen und der Parameter mit mehreren Verzweigungsschnitten gearbeitet werden muss. Da Solve darauf ausgelegt ist, eine schnelle Lösung zu liefern, ist es außerdem standardmäßig so definiert, dass es nur einen Wert der Zweige berücksichtigt. Siehe hierzu die Dokumentation zur Solve::ifun-Meldung.
Um die Tatsache zu umgehen, dass Solve nur eine Lösung des Verzweigungsschnitts berücksichtigt, können Sie zwei Optionen angeben: Method und MaxExtraConditions. Method ist ein kurzer und bequemer Weg, um die von Reduce verwendeten Algorithmen in Solve aufzurufen:
Solve[g[x]==0,x,Method->Reduce]
Dies führt zum Ergebnis, das Solve auch für die Gleichung f[x]==0 gefunden hat:
Andererseits hebt MaxExtraConditions die Einschränkung auf, dass die Lösung nur für einen Zweig berechnet werden kann.
Solve[g[x]==0,x,MaxExtraConditions->All]
Dies führt zu dem folgenden Ergebnis
Außerdem wird die Solve::fdimc-Meldung
When parameter values satisfy the condition b==0, the solution set contains a full-dimensional component; use Reduce for complete solution information. (Wenn die Parameterwerte die Bedingung b==0 erfüllen, enthält die Lösungsmenge eine volldimensionale Komponente; verwenden Sie Reduce für vollständige Lösungsinformationen.)
angezeigt. Der Befehl Reduce berücksichtigt die Möglichkeit, dass b==0 sein kann:
Reduce[g[x] == 0, x]
|