Mathematica: FindRoot-Fehler
-
27-10-2019 - |
Frage
FindRoot[
27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] == 0
,
{x, 0.000001}
]
konvergiert zum {x -> -0.0918521}
der Lösung, aber wie kann ich Mathematica dazu bringen, die folgende Fehlermeldung vor der Lösung zu vermeiden:
FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
Ich verwende FindRoot, um einige ziemlich unordentliche Ausdrücke zu lösen.Manchmal erhalte ich auch den folgenden Fehler, obwohl Mathematica immer noch eine Antwort liefert, frage mich aber, ob es auch eine Möglichkeit gibt, dies zu vermeiden:
FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances. >>
Lösung
Die Lösung, die Sie erhalten, ist nicht die tatsächliche Lösung. Die Meldung zeigt an, dass ein Fehler aufgetreten ist, und FindRoot
gibt den letzten Wert von x
zurück. Dies ist der letzte Punkt unter 'Weitere Informationen' für FindRoot
:
- Wenn es FindRoot nicht gelingt, eine Lösung für die Genauigkeit zu finden, die Sie in
MaxIterations
-Schritten angegeben haben, wird die letzte Annäherung an eine gefundene Lösung zurückgegeben. Sie können dann FindRoot erneut anwenden, wobei diese Annäherung als Ausgangspunkt dient.In diesem Fall gibt es beispielsweise auch keine Lösung:
FindRoot[x^2 + 1 == 0, {x, 1}]
Sie erhalten eine
FindRoot::jsing
-Warnung und Mathematica gibt{x -> 0.}
zurück (dies ist die neueste Annäherung).Ein ähnlicher Fall wie dieser, jedoch mit einer
Log
-Funktion:FindRoot[1 + Log[1 + x]^2 == 0, {x, 2}]
Gibt einen
FindRoot::nlnum
ähnlich dem, was Sie sehen, und gibt{x -> 0.000269448}
zurück (in diesem Fall die neueste Annäherung).Dies ist eine Darstellung derselben Funktion zur Veranschaulichung:
Wenn Sie komplexe Wurzeln einschließen möchten, lesen Sie diesen Teil der Dokumentation für
FindRoot
(auch unter 'Weitere Informationen'):- Sie können FindRoot jederzeit anweisen, nach komplexen Wurzeln zu suchen, indem Sie dem Startwert 0.I hinzufügen.
So können Sie beispielsweise einen Startwert in der Nähe einer komplexen Wurzel verwenden, z. B.:
FindRoot[x^2 + 1 == 0, {x, 1 + 1. I}]
Welche konvergiert (ohne Nachrichten) zu
{x -> 8.46358*10^-23 + 1. I}
(also im GrundeI
).Oder mit einem Startwert in der Nähe der anderen komplexen Wurzel:
FindRoot[x^2 + 1 == 0, {x, 1 - 1. I}]
Sie erhalten grundsätzlich einen
-I
(genauer gesagt einen{x -> 8.46358*10^-23 - 1. I}
).
- Sie können FindRoot jederzeit anweisen, nach komplexen Wurzeln zu suchen, indem Sie dem Startwert 0.I hinzufügen.
Andere Tipps
Für diese Gleichung gibt es keine wirkliche Lösung.Mathematica nähert sich dem Minimum der Funktion und meldet dies, da dort der Algorithmus konvergiert.
Plot[27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x],
{x, -2, 0.09}, AxesOrigin -> {0, 0}]
Mathematica warnt Sie davor:
In[30]:= x /.
Table[FindRoot[
27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] ==
0, {x, y}], {y, -0.01, 0.01, 0.0002}]
During evaluation of In[30]:= FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
During evaluation of In[30]:= FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
During evaluation of In[30]:= FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
During evaluation of In[30]:= General::stop: Further output of FindRoot::nlnum will be suppressed during this calculation. >>
During evaluation of In[30]:= FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances. >>
During evaluation of In[30]:= FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances. >>
During evaluation of In[30]:= FindRoot::lstol: The line search decreased the step size to within tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the merit function. You may need more than MachinePrecision digits of working precision to meet these tolerances. >>
During evaluation of In[30]:= General::stop: Further output of FindRoot::lstol will be suppressed during this calculation. >>
Out[30]= {-0.0883278, -0.0913649, -0.0901617, -0.0877546, -0.0877383, \
-0.088508, -0.0937041, -0.0881606, -0.0912122, -0.0899562, \
-0.0876965, -0.0879619, -0.0877441, -0.101551, -0.0915088, \
-0.0880611, -0.0959972, -0.0930364, -0.0902243, -0.0877198, \
-0.0881157, -0.107205, -0.103746, -0.100439, -0.0972646, -0.094208, \
-0.0912554, -0.0878633, -0.089473, -0.0884659, -0.0876997, \
-0.0876936, -0.0879112, -0.104396, -0.100987, -0.0976638, -0.0879892, \
-0.087777, -0.0881334, -0.0880071, -0.0880255, -0.0880285, \
-0.0880345, -0.0911966, -0.0879797, -0.0890295, -0.087701, \
-0.0952537, -0.0941312, -0.0929994, -0.0918578, -0.0885677, \
-0.0895444, -0.0883719, -0.103914, -0.102701, -0.0885007, -0.0915083, \
-0.098988, -0.0963068, -0.0891533, -0.0907357, -0.0881215, \
-0.0893928, -0.108191, -0.104756, -0.101456, -0.0982737, -0.0951949, \
-0.0922072, -0.0892996, -0.0878794, -0.0877164, -0.0896659, \
-0.0886859, -0.0876952, -0.0909219, -0.0899049, -0.0888758, \
-0.0878343, -0.0952044, -0.0941281, -0.0887345, -0.0919322, \
-0.0886726, -0.0876955, -0.0877232, -0.0878879, -0.0877578, \
-0.101642, -0.0916633, -0.0991254, -0.0877255, -0.0936139, \
-0.0907846, -0.0877205, -0.0877454, -0.0881589, -0.0893507, \
-0.0878747, -0.0876961}