在某些数据上,我从spap2
遇到奇怪的结果:
实际数据是蓝色曲线,红色圆圈是我正在使用的结,黄色曲线是三次样条曲线的显示。
代码非常简单,我无法找出问题所在:
spgood = spap2(knots_zY, 4, ec, Y);
plot(ec, Y);
hold on;
scatter(knots_zY, Y(ec==knots_zY));
fnplt(spgood)
ec
是向量-4.12:0.02:-0.54
。
Y是以下向量:
4.1291 4.0732 4.0173 4.2624 4.3826 4.3267 4.2708 4.4367 4.3808 4.1031 4.1721 3.8152 4.1572
4.1013 4.0454 3.5916 3.8367 3.7808 3.8218 3.6690 3.9141 3.7333 3.8023 3.3204 3.5656 3.4305
3.5787 3.3978 3.3419 3.2860 3.4062 3.4753 3.5706 3.2385 3.1826 3.4947 3.5315 3.1746 3.2089
3.2276 3.1940 2.9162 3.0364 3.0263 2.8155 2.7596 2.9555 2.8996 2.9081 2.7322 2.8524 2.6397
2.7662 2.5279 2.5417 2.2005 2.3409 2.5108 2.5202 2.3359 2.3660 2.3100 2.1682 2.1123 2.2140
2.1288 2.1116 1.9856 2.0089 1.8845 1.9148 1.9308 1.7273 1.7642 1.7326 1.6606 1.7378 1.6570
1.5815 1.5701 1.4630 1.5503 1.5181 1.4385 1.3083 1.3168 1.2991 1.2523 1.1390 0.9988 1.0373
0.9913 1.0113 0.9754 0.8912 0.8790 0.7491 0.7557 0.7544 0.7119 0.7031 0.6843 0.6418 0.5938
0.5193 0.5334 0.4312 0.4839 0.4437 0.3992 0.3689 0.3287 0.3348 0.3076 0.2274 0.2174 0.1970
0.2188 0.1760 0.1384 0.1773 0.1342 0.1388 0.1097 0.0830 0.0782 0.0725 0.0863 0.0581 0.0466
0.0398 0.0431 0.0187 0.0187 0.0176 0.0167 0.0231 0.0033 -0.0117 -0.0016 0.0084 -0.0055 -0.0120
-0.0080 -0.0064 -0.0075 -0.0134 -0.0075 0.0012 -0.0077 -0.0024 0.0006 0.0010 0.0043 0.0016 0.0018
0.0042 0.0030 0.0029 0.0029 0.0021 0.0013 -0.0002 -0.0020 -0.0030 -0.0032 -0.0002 -0.0013 0.0035
0.0028 -0.0000 -0.0057 -0.0032 0.0020 0.0597 0.1835 0.5083 1.0275 1.6448 3.0549
用以下12个值定义结:
-4.1200 -3.9400 -3.5400 -3.3000 -3.1400 -2.6800 -2.3600 -2.0600 -1.5000 -1.1600 -0.7000 -0.5400
我不期望很好的拟合,但是至少样条拟合会紧贴结点,但是在这里结果是完全错误的。我对此感到困惑,无法看到此数据示例的问题所在。
注意:结是在单独的算法中计算的,应该用于插值器,在这里并不是一个合适的问题。问题是为什么花键拟合不穿过结。
答案 0 :(得分:0)
我犯了几个错误。
首先,假定结果样条线将通过结是一个错误,因为这是一个近似值(请参阅此answer)。近似值可以平滑整个原始数据,因此无法坚持下去。
第二,我忘了延长结点以施加边界条件。默认的边界条件是使所有导数(包括0阶)均为零,从而形成此形状。然后的解决方案是使用augknt
来获得具有两个连续导数的实际三次样条:
spgood = spap2(augknt(knots_zY,4), 4, ec, Y);
结果拟合为:
考虑到打结顺序,这会更好。