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. >> 

War es hilfreich?

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:

    Mathematica-Grafiken

    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 Grunde I).

      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}).

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}]

Bildbeschreibung hier eingeben

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}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top