Странный результат spap2 - PullRequest
       10

Странный результат spap2

0 голосов
/ 13 ноября 2018

Я сталкиваюсь со странными результатами spap2 по некоторым данным:

enter image description here

Фактические данные - синяя кривая, красные кружки - это узлы, которые я использую, а желтая кривая - это отображение кривой кубического сплайна.

Код довольно прост, я не могу понять, в чем проблема:

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

Я не ожидаю хорошей подгонки, но, по крайней мере, сплайновая подгонка слипается с узлами ... но здесь результат совершенно ошибочный. Я застрял с этим, не могу увидеть, где проблема с этим образцом данных.

Примечание: узлы вычисляются в отдельном алгоритме и должны использоваться для интерполятора, здесь вопрос о хорошей подгонке отсутствует. Вопрос в том, почему посадка сплайна не проходит через узлы.

1 Ответ

0 голосов
/ 14 ноября 2018

Я сделал несколько ошибок.

Во-первых, ошибочно полагать, что результирующий сплайн будет проходить через узлы, так как он является приблизительным (см. ответ ). Аппроксимация сглаживает все исходные данные, поэтому нет возможности придерживаться узлов.

Во-вторых, я забыл расширить концевые узлы, чтобы наложить граничные условия. Граничное условие по умолчанию должно иметь все производные (включая 0-й порядок) равными нулю, что приводит к этой форме. Решение состоит в том, чтобы использовать augknt, чтобы получить фактический кубический сплайн с двумя непрерывными производными:

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

Итоговая подгонка:

better fit

что намного лучше, учитывая выбор последовательности узлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...