erros FindRoot: Mathematica
-
27-10-2019 - |
Pergunta
FindRoot[
27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] == 0
,
{x, 0.000001}
]
converge para a {x -> -0.0918521}
solução, mas como eu posso conseguir Mathematica para evitar a seguinte mensagem de erro antes de a solução:
FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
Eu estou usando FindRoot para resolver algumas expressões bastante confuso. Eu às vezes também receber o seguinte erro, embora Mathematica ainda vai render uma resposta, mas estou querendo saber se existe uma maneira de evitá-lo assim:
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. >>
Solução
A solução que você está recebendo não é a solução real. A mensagem indica que algo estava errado e FindRoot
retorna o último valor de x
. Este é o último item sob 'Mais Informações' para FindRoot
:
- Se FindRoot não conseguir encontrar uma solução para a precisão que você especifique a poucos passos
MaxIterations
, ele retorna à aproximação mais recente a uma solução que encontrou. Você pode então aplicar FindRoot novo, com essa aproximação como um ponto de partida.
Por exemplo, neste caso, também não há solução:
FindRoot[x^2 + 1 == 0, {x, 1}]
Você receberá um aviso FindRoot::jsing
e Mathematica retornos {x -> 0.}
(que é a aproximação mais recente).
Um caso semelhante como esta, mas com uma função Log
:
FindRoot[1 + Log[1 + x]^2 == 0, {x, 2}]
Dá uma FindRoot::nlnum
semelhante ao que você está vendo e retorna {x -> 0.000269448}
(que é a aproximação mais recente, neste caso).
Este é um gráfico da mesma função, para fins de ilustração:
Se você quiser incluir raízes complexas, considere esta parte da documentação para FindRoot
(em 'Mais informações' também):
- Você sempre pode dizer FindRoot para procurar raízes complexas, adicionando 0.I ao valor inicial.
Assim, por exemplo, você pode ter um valor inicial perto de uma raiz complexa, assim:
FindRoot[x^2 + 1 == 0, {x, 1 + 1. I}]
que converge (sem mensagens) para {x -> 8.46358*10^-23 + 1. I}
(Então, basicamente I
).
Ou com um valor inicial perto da outra raiz complexo:
FindRoot[x^2 + 1 == 0, {x, 1 - 1. I}]
Você vai ter basicamente -I
(para ser preciso que você começa {x -> 8.46358*10^-23 - 1. I}
).
Outras dicas
Não há uma verdadeira solução para esta equação. Mathematica acaba ficando em algum lugar perto do mínimo da função, e relata isso porque é aí que a converge algoritmo para.
Plot[27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x],
{x, -2, 0.09}, AxesOrigin -> {0, 0}]
Mathematica faz avisá-lo sobre isso:
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}