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 的“更多信息”下的最后一项:

  • 如果 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 文档的这一部分(也在“更多信息”下):
  • 您始终可以通过将 0.I 添加到起始值来告诉 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/

    10-12 04:59