假设我有一个非线性公式,例如y =(ax + bx ^ 2 + cx ^ 3)* dx1 ^ 2
a,b,c,d是要查找的系数,而x和x1是我要拟合的表中的数据。
我需要一种可以用代码(例如C或Delphi)编写的优化算法,以进行迭代以获得合理的系数a,b,c,d。
不想使用Matlab或软件包,因为它必须是独立程序。引用delphi或活动的X单位会很有帮助。如果我可以免费使用它,不要介意购买该软件。
答案 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个。