FindRoot[
27215. - 7.27596*10^-12 x + 52300. x^2 - 9977.4 Log[1. - 1. x] == 0
,
{x, 0.000001}
]
收敛到解决方案
{x -> -0.0918521}
但我怎样才能让 Mathematica 在解决方案之前避免以下错误消息:FindRoot::nlnum: The function value {Indeterminate} is not a list of numbers with dimensions {1} at {x} = {1.}. >>
我正在使用 FindRoot 来解决一些非常困惑的表达式。我有时也会收到以下错误,尽管 Mathematica 仍然会给出答案,但我想知道是否也有办法避免它:
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. >>
最佳答案
您得到的解决方案不是实际的解决方案。该消息表明出现问题,FindRoot
返回 x
的最后一个值。这是 FindRoot
的“更多信息”下的最后一项:
MaxIterations
步骤中指定的精度的解,它会返回它找到的解的最新近似值。然后,您可以再次应用 FindRoot,以此近似值作为起点。 例如,在这种情况下也没有解决方案:
FindRoot[x^2 + 1 == 0, {x, 1}]
您将收到
FindRoot::jsing
警告并且 Mathematica 返回 {x -> 0.}
(这是最近的近似值)。类似的情况,但带有
Log
函数:FindRoot[1 + Log[1 + x]^2 == 0, {x, 2}]
给出与您所看到的类似的
FindRoot::nlnum
并返回 {x -> 0.000269448}
(在这种情况下是最近的近似值)。这是同一函数的图,用于说明目的:
如果要包含复杂的根,请考虑
FindRoot
文档的这一部分(也在“更多信息”下):因此,例如,您可以在一个复数根附近取一个起始值,如下所示:
FindRoot[x^2 + 1 == 0, {x, 1 + 1. I}]
它收敛(没有消息)到
{x -> 8.46358*10^-23 + 1. I}
(所以基本上是 I
)。或者在另一个复杂根附近使用一个起始值:
FindRoot[x^2 + 1 == 0, {x, 1 - 1. I}]
你基本上会得到
-I
(准确地说你得到 {x -> 8.46358*10^-23 - 1. I}
)。关于wolfram-mathematica - Mathematica : FindRoot errors,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8827349/