将多项式拟合到函数的最大值

时间:2016-04-18 10:27:14

标签: matlab octave

我想将多项式拟合到噪声数据,以使近似多项式始终> =原始数据。例如:

x = linspace (-2, 6);
y = (x-2).^2 + 1 + 2 * randn (size (x));

function ret = delta (P, x, y)
  yP = polyval (P, x);
  d = yP - y;
  d (d < 0) *= 1000;
  ret = sumsq (d);
endfunction

P0 = polyfit (x, y, 2);
f = @(P) delta (P, x, y);
[P, FVAL] = sqp (P0, f)

xi = linspace (min(x), max(x), 100);
yi = polyval (P, xi);

plot(x, y, xi, yi);
grid on

original (blue) and approx. (green) data

是否有更好的方法/方法也适用于更高阶的多项式?

简单方法是使用polyfit然后计算max(y-yi)并将其添加为偏移但这不是最佳的...

编辑:我想使用GNU OCtave,但添加了&#34; matlab&#34;作为标签因为语言和功能类似。

编辑:基于tvo的答案和真实数据:

x = [10 20 30 40 50 60 80 100];
y = [0.2372, 0.1312, 0.0936, 0.0805, 0.0614, 0.0512, 0.0554, 0.1407];

function ret = delta (P, x, y)
  ret = sumsq (polyval (P, x) - y);
endfunction

f = @(P) delta (P, x, y);
h = @(P) polyval(P, x) - y;

P0 = polyfit (x, y, 3);
[P] = sqp (P0, f, [], h)

xi  = linspace (min(x), max(x));
yi  = polyval (P0, xi);
yio = polyval (P, xi);

plot(x, y, xi, yi, ";initial guess;", xi, yio, ";optimized;");
grid on

tvos result plot

但正如您所看到的,优化和评估的poly具有点&lt;不允许的原始点。

1 个答案:

答案 0 :(得分:4)

你的方法看起来很好,我认为没有理由它不能用于实际的高阶多项式。如果您认为无法使用,请解释原因。

您正在使用Octave&#39; sqp&#39;求解。文档在这里:http://www.gnu.org/software/octave/doc/v4.0.1/Nonlinear-Programming.html

当它为负时,您可能希望避免将错误乘以任意数字(在您的示例中为1000)。对于不同的数据集,这可能会失败,特别是如果它们更大,即更多的数据点。

您可以尝试使用Octave&#39; sqp&#39;的非线性不等式约束选项。提议,即h(x)> = 0(见doc)。

作为目标函数phi,您可以使用平方范数误差(如示例中所示),并为每个数据点添加形式h(x)&gt; = 0的约束。请注意&#39; x&#39;是你想要拟合的多项式系数,而h(x)是在特定数据点评估的多项式。

例如:

phi = @(P) delta_mod (P, x, y); % mod: Don't increase the importance of negative residuals!!
h = @(P) polyval(P, x1) - y1;

Psol = sqp(P0, phi, [], h);

请注意约束函数&#39; h&#39;确保多项式将位于(x1,y1)之上,并且目标函数为“phi”。会尽量保持尽可能接近。你可以扩展&#39; h&#39;为集合中的每个数据点包含一个约束(请参阅doc)。