【问题标题】:Curve Fit 5 points曲线拟合 5 点
【发布时间】:2014-05-19 23:29:48
【问题描述】:

我正在尝试在 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 的帮助将不胜感激。我知道这与矩阵有关,但我无法弄清楚。带有伪代码或真实代码的示例将是最有帮助的。

谢谢

【问题讨论】:

  • x 值的间距是否相等?
  • 感谢您的回复。是的,它们或多或少是等距的,最终的曲线应该看起来像钟形曲线,当然会有一些变化。
  • @user3550036 你到底在近似什么?您说“最终曲线应该看起来像钟形曲线”-如果您的意思是所讨论的函数是高斯(即正常)密度,那将产生很大的不同。如果是这样,请直接使用高斯密度而不是多项式 - 即使所有数据点都是正数,也不能保证多项式在所有地方都是正数。

标签: math matrix curve-fitting least-squares


【解决方案1】:

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

相反,我们将稍微了解一下Lagrange polynomialsNewton Divided Difference Method 的计算。

拉格朗日多项式

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

l_j(i) 在哪里

.

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

牛顿多项式

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

其中每个n(x)

,系数为

,为分差。

最终的形式看起来像

.

如您所见,考虑到除差值,公式非常简单。到目前为止,您只需执行每个新的划分差异并乘以每个点。应该注意的是,您最终会得到来自n+1 点的次数为n 的多项式。

分差

剩下的就是定义这两张图片最能解释的划分差异:

.

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

【讨论】:

  • 您好,也感谢您的帮助。在您用红色圈出的项目中,我没有看到任何 y0,但在上面的等式最终形式中,它使用 y0。你介意详细说明这些 [y0], [y0,y1] 是如何转化为你所拥有的红色的吗?
  • 这只是索引的不同。带红色圆圈的索引从 1 开始,而其他的从 0 开始。:)
  • [y0] 将是 y1[y0,y1] 将是 y2,1,如果您要翻译符号。
  • 如果你想得到一个钟形曲线,对数据x[k], sqrt(C-log(y[k]))使用多项式插值得到一个多项式p(x)。那么插值曲线就是exp(C-p(x)^2)。选择比任何log(y[k]) 的最大值大的C,例如两倍或加一。
【解决方案2】:

如果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).

【讨论】:

  • 请注意,上面是一个 4 阶多项式,您可能需要 4 个 3 阶三次样条曲线。原问题没有具体说明。
  • 感谢您的帮助。我确实想要一个四阶多项式。如果它们的间距不完全相等,我将如何替换“h”?你可以用对应于(x2-x1)= h1,(x3-x2)= h2,x4-x3 = h3,x5-x4 = h4的h1,h2,h3,h4替换它们吗?还是在数学上不允许
  • 如果它们的间距不完全是h,那么四阶矩阵求逆Vandermonde matrix要复杂得多。
猜你喜欢
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 2021-01-19
  • 2015-03-02
  • 2015-02-04
相关资源
最近更新 更多