如何使用两个独立变量将拟合数据曲线拟合到已知公式?

问题描述 投票:1回答:1

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

其中a,b,c,d是要找到的系数,x和x1是我试图拟合的表格中的数据。

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

不想使用Matlab或软件包,因为这必须是一个独立的程序。引用delphi或active X单元很有帮助。如果我可以自由使用它,请不要介意支付软件费用。

math curve-fitting
1个回答
3
投票

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

axi + bxi2 + cxi3 + dzi2 ≈ yi

对于一些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

MT M M X X = MT Y Y.

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

如果n很大,你甚至可以动态计算(MT∙M)和(MT∙Y),而无需存储M本身。这样4×4 + 4 = 20个数字将是输入记录之间需要维护的所有内存。实际上(MT∙M)是symmetric所以10个数字足够用于矩阵,总共14个。

© www.soinside.com 2019 - 2024. All rights reserved.