Pregunta

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

converge a la solución {x -> -0.0918521}, pero ¿cómo puedo hacer que Mathematica evite el siguiente mensaje de error antes de la solución?

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

Estoy usando FindRoot para resolver algunas expresiones bastante confusas.A veces también recibo el siguiente error, aunque Mathematica todavía dará una respuesta, pero me pregunto si hay una manera de evitarlo también:

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. >> 
¿Fue útil?

Solución

La solución que está obteniendo no es la solución real. El mensaje indica que algo estaba mal y FindRoot devuelve el último valor de x. Este es el último elemento en 'Más información' para FindRoot:

  • Si FindRoot no logra encontrar una solución a la precisión que usted especifica dentro de los pasos de MaxIterations, devuelve la aproximación más reciente a la solución que encontró. A continuación, puede aplicar FindRoot nuevamente, con esta aproximación como punto de partida.

Por ejemplo, en este caso tampoco hay solución:

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

Obtendrá una advertencia de FindRoot::jsing y Mathematica devuelve {x -> 0.} (que es la aproximación más reciente).

Un caso similar como este, pero con una función Log:

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

Da un FindRoot::nlnum similar al que está viendo y devuelve {x -> 0.000269448} (que es la aproximación más reciente en este caso).

Este es un gráfico de la misma función, con fines ilustrativos:

Gráficos de Mathematica

Si desea incluir raíces complejas, considere esta parte de la documentación para FindRoot (en 'Más información' también):

  • Siempre puede decirle a FindRoot que busque raíces complejas agregando 0.I al valor inicial.

Entonces, por ejemplo, puede tomar un valor inicial cerca de una raíz compleja, así:

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

Que converge (sin mensajes) a {x -> 8.46358*10^-23 + 1. I} (básicamente I).

O con un valor inicial cerca de la otra raíz compleja:

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

Obtendrá básicamente -I (para ser precisos, obtendrá {x -> 8.46358*10^-23 - 1. I}).

Otros consejos

No existe una solución real para esta ecuación.Mathematica termina acercándose al mínimo de la función y lo informa porque ahí es donde converge el algoritmo.

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

ingrese la descripción de la imagen aquí

Mathematica le advierte sobre esto:

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}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top