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

发布于 2020-02-18 16:48:33
不同的寻根方法具有不同的属性。收敛速度只有一个,可以计算迭代次数,也可以计算CPU时间。两者都将在很大程度上取决于起始值、函数的曲率和单调性、边界、评估函数的成本、解析导数的可用性等。其他有趣的性质可能是收敛性的保证,或者是否需要导数。
Wikipedia上关于寻根算法的文章很好地概述了不同方法的优缺点:
如果一种方法在你的特殊情况下比其他方法工作得更好,你应该直接实现和使用它!在进行基准测试时要小心,很容易找到每种方法都很出色的示例。出于这个原因,您应该在不同的函数上测试每个算法,可能是10个不同的函数,并且每个函数具有不同的间隔。对于相同的函数,但起始间隔较大时,二等分的性能会较差。Brent是一种经过验证的好方法,这就是为什么在MSL中使用它的原因。您甚至可以考虑向MSL发送一个Pull请求并添加替代方案。
https://stackoverflow.com/questions/60260770
复制相似问题