在MatLab中样条插值中点的顺序是否重要?

lhcgjxsq  于 2022-12-27  发布在  Matlab
关注(0)|答案(1)|浏览(153)

我使用MatLab用鼠标选择数据点,然后用样条曲线拟合,我发现下面的函数可以完成这项工作

[xy, spcv] = getcurve()

它返回我用鼠标选取的点的x和y

x = [ -0.8103   -0.6740   -0.5599   -0.5120   -0.4936   -0.4530   -0.4494   -0.4494   -0.4494   -0.4751 -0.5157   -0.6409   -0.6667   -0.7772   -0.7772   -0.6998   -0.5304   -0.4641   -0.2431    0.0110 0.1142    0.1989    0.2836    0.3499    0.3499    0.4125    0.5267]
y = [0.8621    0.8388    0.7640    0.7547    0.7266    0.6472    0.5911    0.5257    0.4696    0.3668 0.2967    0.2360    0.2220    0.0724   -0.1472   -0.1939   -0.2874   -0.4743   -0.5304   -0.5257 -0.4930   -0.3668   -0.2967   -0.2593   -0.2593   -0.2827   -0.3715

绘制getcurve()返回的样条曲线spcv,得到下图

通过阅读getcurve的代码,我看到它使用cscvn返回 * 一个参数化的'natural'三次样条,该样条插值到给定的点 *。这可能是曲线通过所有给定的点而不是最佳拟合曲线的原因。我想将其替换为三次平滑样条,如下所示

sp = spaps(x, y, 0.);
xx = -1:0.01:2;
plot(xx, fnval(sp, xx), 'b', 'linewidth', 2); hold on;
plot(x, y, 'ko');

这让我觉得有些奇怪,如下所示
它看起来像是试图从小x到大x拟合数据点,而不是数据序列给出的顺序。我期待一条平滑的红色曲线,如下所示(我用手画的)

我正在寻找一个解决方案,我可以取代cscvn与spaps在getcurve和保持正确的顺序。谢谢。

2lpgd968

2lpgd9681#

1.-要插入折回的曲线,必须参数化xy

x = [ -0.8103   -0.6740   -0.5599   -0.5120   -0.4936   -0.4530   -0.4494   -0.4494   -0.4494   -0.4751 -0.5157   -0.6409   -0.6667   -0.7772   -0.7772   -0.6998   -0.5304   -0.4641   -0.2431    0.0110 0.1142    0.1989    0.2836    0.3499    0.3499    0.4125    0.5267];
y = [0.8621    0.8388    0.7640    0.7547    0.7266    0.6472    0.5911    0.5257    0.4696    0.3668 0.2967    0.2360    0.2220    0.0724   -0.1472   -0.1939   -0.2874   -0.4743   -0.5304   -0.5257 -0.4930   -0.3668   -0.2967   -0.2593   -0.2593   -0.2827   -0.3715];

figure(1)
ax1=gca
fnplt(cscvn([x;y])); hold(ax1,'on');
plot(ax1,x,y,'o');
grid on

sp = spaps(x, y, 0.);
xx = -1:0.01:2;
figure(2)
plot(xx, fnval(sp, xx), 'b', 'linewidth', 2); hold on;
plot(x, y, 'ko'); grid on

nx=[1:numel(x)];ny=[1:numel(y)];

fx=fit(nx',x','poly3','Normalize','on','Robust','Bisquare')
fy=fit(ny',y','poly3','Normalize','on','Robust','Bisquare')
plot(ax1,fx(nx),fy(ny))

f2x=fit(nx',x','cubicinterp','Normalize','on')
f2y=fit(ny',y','cubicinterp','Normalize','on')
plot(ax1,f2x(nx),f2y(ny))

f3x=fit(nx',x','smoothingspline','Normalize','on')
f3y=fit(ny',y','smoothingspline','Normalize','on')
plot(ax1,f3x(nx),f3y(ny))

f4x=fit(nx',x','poly1','Normalize','on')
f4y=fit(ny',y','poly1','Normalize','on')
plot(ax1,f4x(nx),f4y(ny))

f5x=fit(nx',x','poly11','Normalize','on')
f5y=fit(ny',y','poly11','Normalize','on')
plot(ax1,f5x(nx),f5y(ny))

f6x=fit(nx',x','rat33','Normalize','on')
f6y=fit(ny',y','rat33','Normalize','on')
plot(ax1,f6x(nx),f6y(ny))

**2.-**注意,nxnyxy具有相同数量的样本。

如果在nx上插值x,在ny上插值y,然后应用拟合,则生成的曲线将以您要求的方式更接近所有点。

相关问题