我使用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和保持正确的顺序。谢谢。
1条答案
按热度按时间2lpgd9681#
1.-要插入折回的曲线,必须参数化
x
和y
**2.-**注意,
nx
和ny
与x
和y
具有相同数量的样本。如果在
nx
上插值x
,在ny
上插值y
,然后应用拟合,则生成的曲线将以您要求的方式更接近所有点。