【发布时间】:2016-04-18 10:27:14
【问题描述】:
我想将多项式拟合到噪声数据,以便近似多项式始终 >= 原始数据。例如:
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
有没有更好的方法/方法也适用于高阶多项式?
最简单的方法是只使用 polyfit 然后计算 max(y-yi) 并将其添加为偏移量,但这不是最佳选择...
编辑:我想使用 GNU OCtave,但添加了“matlab”作为标签,因为语言和功能相似。
编辑:基于 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
但如您所见,优化和评估的多边形的点
【问题讨论】:
-
您是否尝试过用所有数据点拟合直线,然后寻找误差最高的那些?
-
我猜您正在寻找的是 fmincon:使用(线性)约束将范数(例如 2 范数)最小化为 FUN(公式化为矩阵 A,其大小为欲望多项式 * 数字点数)和您的观察值作为 B 从 matlab 帮助中:X = fmincon(FUN,X0,A,B) 从 X0 开始并找到函数 FUN 的最小 X,受线性不等式 A*X
-
@AlexanderKemp:看起来很有希望,但我想使用 GNU Octave,而且 fmincon 显然还没有实现。