同时优化一组非线性方程中的参数

本文关键字:线性方程 参数 一组 优化 | 更新日期: 2023-09-27 18:24:13

我有大量的方程(n)和大量的未知数(m),其中m大于n。我试图使用n个方程和一大组观测值来找到m的值。

我已经研究了Levenberg-Marquardt在C#中的一些实现,但我找不到任何能解决1个以上方程的实现。例如,我看着http://kniaz.net/software/LMA.aspx这似乎就是我想要的,只是它只需要一个方程作为参数,我想同时求解多个方程。与此包类似:http://www.alglib.net/包含LM的良好实现,但仅针对单个方程。

我想知道C#中是否有任何好的实现,或者我可以在C#代码中使用这些实现?试图计算方程的一阶微分也是很昂贵的,所以我希望能够使用小的有限差来近似它们。

此外,对于LM是如何工作的以及如何实现它,有什么好的、易于理解的解释吗?为了自己动手,我试着通读了一些数学课本,但我对数学一无所知,所以大部分解释都忘了。

编辑:

我的问题的更多细节:

1) 方程是动态形成的,可以随着我的问题的每次运行而变化

2) 我对起始参数没有很好的猜测。我计划用随机启动参数多次运行它,以找到全局最小值。

编辑2:

还有一个问题,我正在阅读这篇论文:http://ananth.in/docs/lmtut.pdf我在第2节中看到了以下内容:

x=(x1;x2…xn)是一个向量,并且每个rj是来自的函数ℜn到ℜ.rj指作为残差,并且假设m>=n。

这是否意味着,如果我的参数比函数多,LM就不起作用?例如,如果我想为函数求解A和B:

Y=AX+B

这是不可能的,因为我的参数向量大小为2(A和B),而我的函数计数为1?

同时优化一组非线性方程中的参数

Levenberg-Marquardt算法可以处理您的问题;然而,我在C#中找不到实现这种情况的实现[UPDATE:有关如何让alglib.net做你想做的事情的详细信息,请参阅下面的编辑]。MINPACK确实有这种情况的入口点(LMDIF1或LMDIF,如果如您所述,您希望使用差来近似导数)。您可以尝试使用StackOverflow上一个问题中列出的工具自动翻译C/C++版本的MINPACK。

至于你在"编辑2"中的问题:"如果我的参数比函数多,这是否意味着LM不起作用?",答案是:不,你错了。在你的情况下,论文中的"m"实际上等于你拥有的方程数量,乘以你拥有的数据点数量(假设你所说的"观测值"是每个方程右手边和左手边之间的差值)。换句话说,他在那里谈到的r-sub-i函数正是那些方程差(RHS-LHS)。

重要编辑:现在我看到你找到的第二个包alglib.net,做你想做的事(但请注意,它只在GPL下免费提供)。由于你不想提供导数,你应该使用"V"方案,其中,假设你有n个方程和k个参数的观测值,f向量有n*k个元素,其中

f[i + j*n] = (RHS_of_equation[i](data_point[j]) - LHS_of_equation[i](data_point[j]))

(当然,i和j从0开始)。