Domanda

FindRoot[
 27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] == 0
 , 
 {x, 0.000001}
]

converge alla soluzione {x -> -0.0918521} ma come posso ottenere Mathematica per evitare il seguente messaggio di errore prima della soluzione:

FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>

Sto usando FindRoot per risolvere alcune espressioni piuttosto complicate.A volte ricevo anche il seguente errore, sebbene Mathematica fornisca comunque una risposta, ma mi chiedo se c'è anche un modo per evitarlo:

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. >> 
È stato utile?

Soluzione

La soluzione che stai ottenendo non è la soluzione effettiva. Il messaggio indica che qualcosa non va e FindRoot restituisce l'ultimo valore di x. Questo è l'ultimo elemento in "Ulteriori informazioni" per FindRoot:

  • Se FindRoot non riesce a trovare una soluzione alla precisione specificata nei passaggi MaxIterations, restituisce l'approssimazione più recente a una soluzione trovata. È quindi possibile applicare nuovamente FindRoot, con questa approssimazione come punto di partenza.

Ad esempio, anche in questo caso non esiste una soluzione:

FindRoot[x^2 + 1 == 0, {x, 1}]

Riceverai un avviso FindRoot::jsing e Mathematica restituirà {x -> 0.} (che è l'approssimazione più recente).

Un caso simile come questo, ma con una funzione Log:

FindRoot[1 + Log[1 + x]^2 == 0, {x, 2}]

Fornisce un FindRoot::nlnum simile a quello che stai vedendo e restituisce {x -> 0.000269448} (che è l'approssimazione più recente in questo caso).

Questo è un grafico della stessa funzione, a scopo illustrativo:

Mathematica graphics

Se desideri includere radici complesse, considera questa parte della documentazione per FindRoot (anche in "Ulteriori informazioni"):

  • Puoi sempre dire a FindRoot di cercare radici complesse aggiungendo 0.I al valore iniziale.

Quindi, ad esempio, puoi prendere un valore iniziale vicino a una radice complessa, in questo modo:

FindRoot[x^2 + 1 == 0, {x, 1 + 1. I}]

Che converge (senza messaggi) a {x -> 8.46358*10^-23 + 1. I} (quindi fondamentalmente I).

O con un valore iniziale vicino all'altra radice complessa:

FindRoot[x^2 + 1 == 0, {x, 1 - 1. I}]

Otterrai fondamentalmente -I (per essere precisi ottieni {x -> 8.46358*10^-23 - 1. I}).

Altri suggerimenti

Non esiste una vera soluzione a questa equazione.Mathematica finisce per arrivare da qualche parte vicino al minimo della funzione e lo segnala perché è lì che converge l'algoritmo.

Plot[27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x],
 {x, -2, 0.09}, AxesOrigin -> {0, 0}]

inserisci qui la descrizione dell'immagine

Mathematica ti avverte di questo:

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}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top