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

标签 c# math optimization nonlinear-functions levenberg-marquardt

我有大量方程式 (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# 中找到实现这种情况的实现[更新:有关如何让 alglib.net 执行您想要的操作的详细信息,请参阅下面的编辑]。 MINPACK 确实有针对这种情况的入口点(LMDIF1 或 LMDIF,如果如您所述,您希望使用差异来近似求导)。您可以尝试自动翻译 C/C++ version of MINPACK使用 a previous question on StackOverflow 中列出的工具.

至于你在“编辑 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 开始)。

关于c# - 同时优化一组非线性方程中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9242359/

相关文章:

c# - 从 WPF 窗体中的 Canvas 获取 UI 元素大小

c# - 在 Html.ActionLink 中包含所有查询字符串参数

javascript - 如何通过 css/js 将 N 个圆分布到另一个圆的内部边界?

algorithm - 180° 偏移无关紧要时的角度加权平均值 (MATLAB)

java - C 与 Java 中的随机数生成

r - 在 R 中计算向量值 Hessian

python - 基于语言测试的阿拉伯语句子过滤列表 : Why so slow?

c# - 如何使用 HTMLElement 以编程方式单击链接元素?

c# - 如何将第二个外键添加到已经是复合外键一部分的 EF 属性

算法 : explanation about complexity and optimization