近似非线性方程组解的算法

时间:2018-07-12 06:28:28

标签: algorithm nonlinear-functions

我正在寻找一种近似以下方程组解的算法:enter image description here

方程必须在C ++嵌入式系统中求解。

背景:

  • 我们测量了两个变量X_m和Y_m,所以它们是已知的
  • 我们要计算实际值:X_r和Y_r
  • X和Y是实数
  • 我们在校准期间测量函数f_xy和f_yx。每个函数最多有18个点。
  • 可以将功能存储为查找表
  • 我试图用二阶多项式逼近函数并计算解,但是由于拟合误差,它不够准确。

我正在寻找一种算法来近似C ++嵌入式系统中的结果,但我什至不知道要搜索什么。我发现了一些有关link的理论的论文,但是我认为必须有一种更简单的方法来实现这一目标。

还:如何在校准过程中确定算法是否可以解决功能?

2 个答案:

答案 0 :(得分:-1)

通常的方法是通过牛顿的迭代,从初始逼近(Xm, Ym)开始[假设f仅仅是校正]。由于方程式的特殊形状,您可以将一个未知数中的一个方程式简化为两倍。

Xr = Xm - Fyx(Ym - Fxy(Xr))
Yr = Ym - Fxy(Xm - Fyx(Yr))

读取的迭代

Xr <-- Xr - (Xm - Fyx(Ym - Fxy(Xr))) / (1 + Fxy'(Ym - Fxy(Xr)).Fxy'(Xr))
Yr <-- Yr - (Ym - Fxy(Xm - Fyx(Yr))) / (1 + Fyx'(Xm - Fyx(Yr)).Fyx'(Yr))

因此,尽管准确度并不比计算f本身重要,但您也应该将f的导数制成表格。


如果校准点不太嘈杂,我建议使用三次样条插值法,您可以为此预先计算所有系数。同时,这些系数允许您估计导数(作为对应的二次插值,是连续的)。

原则上(除非点被均匀地隔开),您需要执行二分查找以确定参数所处的间隔。但是在这里,您将在附近的值处评估函数,以便从先前位置进行线性搜索会更好。


解决该问题的另一种方法是考虑在点网格上计算的双变量解曲面Xr = G(Xm, Ym)Yr = G(Xm, Ym)。如果表面足够光滑,则可以使用粗网格。

因此,通过任何一种方法(例如上述方法),您都将预先计算每个网格节点处的解以及XY方向上某些插值的系数。我再次推荐了三次样条。

现在要在网格单元中进行插值,您可以通过Coons公式https://en.wikipedia.org/wiki/Coons_patch将两个univarite插值组合为一个双变量。

答案 1 :(得分:-1)

通过f_xy拟合二阶多项式?通常这是不可行的。首选解决方案是Runga-Kutta插值。您在参数的左边和右边分别选择两个已知值,权重分别为1,2,2,1。这样可以估算d(f_xy)/dx,然后将其用于插值。