繁体   English   中英

如何优化非线性方程的解?

[英]How to optimize solution of nonlinear equations?

我有非线性方程,例如:

Y = f1(X)

Y = f2(X)

...

Y = fn(X)

通常,它们没有确切的解决方案,因此我使用牛顿方法来解决它们。 方法是基于迭代的,我正在寻找优化计算的方法。 有什么方法可以减少计算时间? 避免计算平方根或其他数学函数? 也许我应该在C ++代码中使用汇编语言(解决方案是用C ++编写的)?

非线性最小二乘问题的一种流行方法是Levenberg-Marquardt算法。 它是高斯-牛顿法和梯度下降法之间的混合体。 它结合了两全其美的优势(在不适当地出现问题的搜索空间中导航并迅速收敛)。 但是在实现方面还有很多回旋余地。 例如,如果方阵J ^ TJ(其中J是包含所有方程式的所有导数的雅可比矩阵)稀疏,则可以使用迭代CG算法快速求解方程组,而不是像J的Cholesky因式分解那样的直接方法^ TJ或J的QR分解

但是,不要仅仅假设某些部分很慢并且需要用汇编器编写。 汇编程序是最后要考虑的事情。 在走那条路线之前,您应该始终使用探查器来检查瓶颈在哪里。

您是在谈论一次求解多个单参数函数,还是要一起求解的多参数方程组?

如果是前者,那么我经常发现,找到一个更好的初始近似值(从牛顿-拉夫森循环开始的位置)比完善循环本身可以节省更多的执行时间,因为循环的收敛最初可能很慢,但速度很快后来。 如果您对这些功能一无所知,那么很难找到一个不错的初始近似值,但是首先尝试进行割线迭代可能是值得的。 您可能还想看看布伦特的方法

考虑并行使用Rational Root Test。 如果无法使用绝对精度值,则使用最接近零的结果作为最佳拟合,以继续使用牛顿法。 一旦找到单根,您可以通过将其除以monom(x-根)来降低等式的等级。 划分和合理的根测试在这里实现https://github.com/ohhmm/openmind/blob/sh/omnn/math/test/Sum_test.cpp#L260

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM