曲线拟合5分

时间:2014-05-19 14:24:31

标签: math matrix curve-fitting least-squares

我试图在C中曲线拟合5分。我使用上一篇文章(Can sombody simplify this equation for me?)中的代码做了4分,但现在我需要添加另一个点。

// Input data: arrays x[] and y[]
// x[1],x[2],x[3],x[4] - X values
// y[1],y[2],y[3],y[4] - Y values

// Calculations
A = 0
B = 0
C = 0
D = 0
S1 = x[1] + x[2] + x[3] + x[4]
S2 = x[1]*x[2] + x[1]*x[3] + x[1]*x[4] + x[2]*x[3] + x[2]*x[4] + x[3]*x[4]
S3 = x[1]*x[2]*x[3] + x[1]*x[2]*x[4] + x[1]*x[3]*x[4] + x[2]*x[3]*x[4]
for i = 1 to 4 loop
   C0 = y[i]/(((4*x[i]-3*S1)*x[i]+2*S2)*x[i]-S3)
   C1 = C0*(S1 - x[i])
   C2 = S2*C0 - C1*x[i]
   C3 = S3*C0 - C2*x[i]
   A = A + C0
   B = B - C1
   C = C + C2
   D = D - C3
end-loop

// Result: A, B, C, D

我一直在尝试将其转换为5点曲线拟合,但我无法弄清楚循环内部的内容:

// Input data: arrays x[] and y[]
// x[1],x[2],x[3],x[4],x[5] - X values
// y[1],y[2],y[3],y[4],y[5] - Y values

// Calculations
A = 0
B = 0
C = 0
D = 0
E = 0
S1 = x[1] + x[2] + x[3] + x[4]
S2 = x[1]*x[2] + x[1]*x[3] + x[1]*x[4] + x[2]*x[3] + x[2]*x[4] + x[3]*x[4]
S3 = x[1]*x[2]*x[3] + x[1]*x[2]*x[4] + x[1]*x[3]*x[4] + x[2]*x[3]*x[4]
S4 = x[1]*x[2]*x[3]*x[4] + x[1]*x[2]*x[3]*[5] + x[1]*x[2]*x[4]*[5] + x[1]*x[3]*x[4]*[5] + x[2]*x[3]*x[4]*[5]

for i = 1 to 4 loop
   C0 = ??
   C1 = ??
   C2 = ??
   C3 = ??
   C4 = ??
   A = A + C0
   B = B - C1
   C = C + C2
   D = D - C3
   E = E + C4
end-loop

// Result: A, B, C, D, E

任何填写C0 ... C4的帮助将不胜感激。我知道这与矩阵有关,但我无法弄明白。使用伪代码或实际代码的示例将是最有帮助的。

感谢

2 个答案:

答案 0 :(得分:3)

拒绝错过了这个概括的机会。 :)

相反,我们将对Lagrange polynomials及其计算的Newton Divided Difference Method进行一些了解。

拉格朗日多项式

给定n+1个数据点,插值多项式为

Interpolating Polynomial Definition

其中l_j(i)

l_i definition

这意味着我们可以通过仅对这些多项式求和来找到近似n+1点的多项式,而不考虑间距等。但是,这有点痛苦,我不想在C中这样做。让我们来看看Newton Polynomials

牛顿多项式

相同的开始,给定n+1个数据点,近似多项式将是

enter image description here每个n(x)都是

系数

enter image description here

enter image description here,是分歧的差异。

最终形式结束了,看起来像

enter image description here

正如您所看到的,给定分割的差值,公式非常简单。您只需执行每个新划分的差异并乘以每个点到目前为止。请注意,您最终会得到nn+1度的多项式。

分差

剩下的就是定义分割后的差异,这两张图片最能说明这些差异:

enter image description here

enter image description here

有了这些信息,C实现应该是合理的。我希望这有所帮助,我希望你学到了一些东西! :)

答案 1 :(得分:0)

如果x值与x2-x1=hx3-x2=hx4-x3=hx5-x4=h等距,那么

C0 = y1;
C1 = -(25*y1-48*y2+36*y3-16*y4+3*y5)/(12*h);
C2 = (35*y1-104*y2+114*y3-56*y4+11*y5)/(24*h*h);
C3 = -(5*y1-18*y2+24*y3-14*y4+3*y5)/(12*h*h*h);
C4 = (y1-4*y2+6*y3-4*y4+y5)/(24*h*h*h*h);

y(x) = C0+C1*(x-x1)+C2*(x-x1)^2+C3*(x-x1)^3+C4*(x-x1)^4
// where `^` denotes exponentiation (and not XOR).