为什么 Modelica 的非线性求解器Modelica.Math.Nonlinear.solveOneNonlinearEquation比传统的定点迭代 (FPI) 方案花费更多的时间来求解非线性方程?等式
y= arctan(1-x/1+x)-x
Run Code Online (Sandbox Code Playgroud)
求解solveOneNonlinearEquation器(基本上使用布伦特方法)求解上述方程需要 6 次迭代,而传统的迭代方法需要 111 次迭代。但是,迭代方案所用的 CPU 时间少于solveOneNonlinearEquation求解器所用的 CPU 时间(见图)。
为什么是这样?可能是由于迭代方案的计算效率,即迭代方案中较少的事件生成?

布伦特方法的停止条件是
if abs(m) <= tol or fb == 0.0 then // root found (interval is small enough)
found := true;
Run Code Online (Sandbox Code Playgroud)
但是,如果abs(m)达到低于所述容差但 的值f(b)不接近零怎么办?这种情况会被认为是收敛失败还是收敛成功?我可以看到abs(m) < tolerance,即|b-a| < tolerance,但函数的值不等于零或任何接近的值。不是布伦特的方法的全部意义在于找到一个函数的根,使得f(b) == 0.0或低于某个容差?
|b-a| < tolerance即使函数的值不接近于零,即低于给定的容差,当实现收敛时是否总是这样?