如何将数据拟合到具有两个独立变量的已知公式?

时间:2018-10-22 22:16:45

标签: math curve-fitting

假设我有一个非线性公式,例如y =(ax + bx ^ 2 + cx ^ 3)* dx1 ^ 2

a,b,c,d是要查找的系数,而x和x1是我要拟合的表中的数据。

我需要一种可以用代码(例如C或Delphi)编写的优化算法,以进行迭代以获得合理的系数a,b,c,d。

不想使用Matlab或软件包,因为它必须是独立程序。引用delphi或活动的X单位会很有帮助。如果我可以免费使用它,不要介意购买该软件。

1 个答案:

答案 0 :(得分:3)

您的问题在a,b,c和d中都是线性的,即使在数据中是立方的。因此,我建议将其表述为ordinary linear least squares问题。请允许我将您的x1重命名为z。想法是这样的:您有

ax i + bx i 2 + cx i 3 + dz i 2 ≈y i

对于某些i∈{1,2,3 ... n}。您可以将其写为近似矩阵方程:

⎡x₁ x₁² x₁³ z₁²⎤   ⎡a⎤   ⎡y₁⎤
⎢x₂ x₂² x₂³ z₂²⎥   ⎢b⎥   ⎢y₂⎥
⎢x₃ x₃² x₃³ z₃²⎥ ∙ ⎢c⎥ ≈ ⎢y₃⎥
⎢ ⋮ ⋮  ⋮  ⋮ ⎥   ⎣d⎦   ⎢⋮⎥
⎣xₙ xₙ² xₙ³ zₙ²⎦         ⎣yₙ⎦

或更短时间内

M∙X≈Y

现在您multiply位于矩阵M的transpose的两侧:

M T ∙M∙X = M T ∙Y

请注意,我从≈更改为=,因为最小二乘解将完全满足此修改方程(出于冗长的原因,我不想在这里讨论)。这是一个简单的4×4线性方程组。使用常见技术(例如Gaussian elimination)求解以找到X =(a,b,c,d)。

如果n大,您甚至可以即时计算(M T ∙M)和(M T ∙Y),而无需存储M本身。这样,4×4 + 4 = 20个数字将成为您在输入记录之间需要维护的所有内存。实际上(M T ∙M)是symmetric,所以10个数字足以表示矩阵,总共14个。