我有非线性方程式,例如:
Y = f1(X)
Y = f2(X)
...
Y = fn(X)
一般来说,他们没有确切的解决方案,因此我使用Newton's method来解决它们。方法是基于迭代的,我正在寻找优化计算的方法。 有什么方法可以缩短计算时间?避免计算平方根或其他数学函数? 也许我应该在C ++代码中使用汇编(解决方案是用C ++编写的)?
答案 0 :(得分:3)
非线性最小二乘问题的一种流行方法是Levenberg-Marquardt算法。它是Gauss-Newton和Gradient-Descent方法之间的混合体。它结合了两个世界的优点(导航搜索空间很好地解决了病态问题并快速收敛)。但是在实施方面有很多摆动空间。例如,如果方矩阵J ^ TJ(其中J是包含所有方程的所有导数的雅可比矩阵)是稀疏的,则可以使用迭代CG算法快速求解方程系统,而不是像J的Cholesky分解那样的直接方法。 ^ TJ或J的QR分解。
但是,不要只是假设某些部分很慢并且需要用汇编语言编写。汇编程序是最后要考虑的事情。在你走这条路之前,你应该总是使用一个分析器来检查瓶颈在哪里。
答案 1 :(得分:1)
您是在谈论一些单个参数函数来一次解决一个问题还是多个参数系统一起求解?
如果是前者,那么我经常发现找到一个更好的初始近似(从Newton-Raphson循环开始的地方)可以比抛光循环本身节省更多的执行时间,因为循环中的收敛最初可能很慢但是后来很快。如果你对函数一无所知,那么找到一个合适的初始近似是很难的,但是首先尝试一些割线迭代可能是值得的。您可能还想查看Brent's method
答案 2 :(得分:0)
考虑并行使用Rational Root Test。如果无法使用绝对精度值,则使用最接近零的结果作为最佳拟合,以继续使用牛顿法。 一旦找到单根,您可以通过将其除以monom(x-根)来降低等式的等级。 https://github.com/ohhmm/openmind/blob/sh/omnn/math/test/Sum_test.cpp#L260
在此处实现了除法和有理根检验