Modelica中非线性求解器的模拟速度

3
为什么Modelica的非线性求解器Modelica.Math.Nonlinear.solveOneNonlinearEquation比传统的固定点迭代(FPI)方案花费更多时间来解决非线性方程?
这个方程。
y= arctan(1-x/1+x)-x 

使用solveOneNonlinearEquation求解器(基本上使用Brent方法)可以在6次迭代中解决上述方程,而传统的迭代方法需要111次迭代。然而,迭代方案所需的CPU时间少于solveOneNonlinearEquation求解器所需的时间(参见图像)。

为什么会这样呢?可能是由于迭代方案的计算效率更高,即说迭代方案中的事件生成较少?

CPU Time of nonlinear equation solved by Brent's method (solveOneNonlinearEquation solver) and typical fixed point iterative (FPI) scheme


1
我猜你是指 Modelica.Math.Nonlinear.solveOneNonlinearEquationoneSolveNonlinearEquation,对吗? - marco
是的,它基本上使用了布伦特方法。 - sairam.nagareddy
1个回答

6
不同的根查找方法具有不同的特性。收敛速度仅是其中之一,可以用迭代次数或CPU时间来计算。这两者都将极大地依赖于起始值、函数的曲率和单调性、边界、评估函数的成本、解析导数的可用性等因素。其他有趣的特性可能包括收敛的保证,或是否需要导数。
维基百科上关于根查找算法的文章给出了不同方法的优缺点的良好概述。 如果一种方法在你的特定情况下比其他方法更好,那么你应该实现并使用它!在进行基准测试时要小心,很容易找到每种方法都能表现出色的例子。因此,您应该在各种函数上测试每个算法,可能有10种不同的函数,每个函数的间隔也不同。对于相同的函数但起始区间更大的情况,二分法的表现会更差。Brent是一种良好且经过验证的方法,这就是为什么它被用于MSL的原因。您甚至可以考虑向MSL发送Pull Request并添加替代方法。

谢谢您的回复。虽然我知道收敛速度取决于许多参数,如起始值、曲率、单调性等,但令我困惑的是,求解器在比仅6次迭代更少的CPU时间内执行了111次迭代。尽管111次迭代是一个基本的while循环,它评估了不同值的方程式。Brent方法也基本上是一个while循环,但需要更多时间,尽管求解器只需计算6次迭代。有什么原因吗?这可能与Modelica处理这两种迭代方案的方式有关吗? - sairam.nagareddy
1
停止准则是 如果abs(m)<=tol或fb==0.0,则 //找到根(间隔足够小) found:=true; 因此,为了调试,请仅打印tol和fb,查看Brent为何停止。 - matth
1
打开 C 编译器的优化功能(/O2 选项)可能会对相对性能产生影响。 - Dag B
在打印fb和abs(m)时,我发现Brent循环结束的可能性是因为abs(m) < tol。然而,fb的值与零非常远。在这种情况下,为什么Brent会给出一个似乎收敛的结果?难道Brent的目的不是找到u的值,使得f(u)或在这种情况下f(b)应该尽可能接近零,例如低于1e-8的容差吗? - sairam.nagareddy
也许x值非常接近彼此,但y值仍然远离零。这是否意味着Brent无法收敛? - sairam.nagareddy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接