Strange result of spap2

296 Views Asked by At

I encounter strange results from spap2 on some data:

enter image description here

The actual data is the blue curve, red circles are the knots I am using and yellow curve is the display of the cubic spline curve.

The code is quite simple, I cannot figure out what is the problem:

spgood = spap2(knots_zY, 4, ec, Y);
plot(ec, Y); 
hold on;
scatter(knots_zY, Y(ec==knots_zY));
fnplt(spgood)

ec is the vector -4.12:0.02:-0.54. Y is the following vector:

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

The knots are defined with the following 12 values:

-4.1200   -3.9400   -3.5400   -3.3000   -3.1400   -2.6800   -2.3600   -2.0600   -1.5000   -1.1600   -0.7000   -0.5400

I don't expect a nice fit, but at least the spline fit sticks with the knots ... but here the result is completely erroneous. I am stuck with this, unable to see where is the problem with this data sample.

Note: the knots are computed in a separate algorithm and should be used for the interpolator, getting a good fit is not the question here. The question is why the spline fit does not pass through the knots.

1

There are 1 best solutions below

0
On

I have made several errors.

First, it's a mistake to assume that the result spline will pass through the knots, as it is an approximation (see this answer). The approximation smoothes the whole original data so there is no way to stick on knots.

Second, I have forgot to extend the end knots to impose boundary conditions. The default boundary condition is to have all derivatives (including the 0th-order) to be zero, resulting in this shape. The solution is then to use augknt to get an actual cubic spline with two continuous derivatives:

spgood = spap2(augknt(knots_zY,4), 4, ec, Y);

The resulting fit is:

better fit

which is way better, given the choice of the knot sequence.