小编sai*_*ddy的帖子

Modelica中非线性求解器的仿真速度

为什么 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 时间(见图)。

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

通过布伦特方法(solveOneNonlinearEquation solver)和典型的定点迭代(FPI)方案求解非线性方程的CPU时间

simulation performance modelica

3
推荐指数
1
解决办法
133
查看次数

公差标准 Brent 方法

布伦特方法的停止条件是

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即使函数的值不接近于零,即低于给定的容差,当实现收敛时是否总是这样?

algorithm math root numerical-methods modelica

3
推荐指数
1
解决办法
223
查看次数