Я получаю странные результаты от 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
Я не ожидаю хорошей посадки, но, по крайней мере, шлицевая посадка стыкуется с узлами ... но здесь результат совершенно ошибочный. Я застрял в этом, не могу понять, в чем проблема с этим образцом данных.
Примечание: узлы вычисляются в отдельном алгоритме и должны использоваться для интерполятора, здесь вопрос не в получении хорошей подгонки. Вопрос в том, почему шлиц не проходит сквозь узлы.
@nkjt Узлы уже выбраны, ваша ссылка не помогает. Моя проблема в том, что шлиц должен проходить сквозь узлы, а здесь этого не происходит. По вашей ссылке, даже если в первом примере подгонка плохая, кривая проходит сквозь узлы.
@Wolfie Действительно. Я добавил все значения данных (не так давно, но все же), я не вижу, как разместить здесь MCVE с меньшим количеством информации.
Акцент на MCVE не на минимальный (правка, которую вы предоставили, хорошая), акцент на полный, т.е. раньше мы не могли запустить ваш код и воспроизвести результаты, теперь мы можем :)





Я сделал несколько ошибок.
Во-первых, ошибочно полагать, что результирующий сплайн пройдет через узлы, поскольку это приближение (см. Этот отвечать). Аппроксимация сглаживает все исходные данные, поэтому узлов не остается.
Во-вторых, я забыл расширить концевые узлы, чтобы наложить граничные условия. Граничное условие по умолчанию состоит в том, чтобы все производные (включая 0-й порядок) были равны нулю, что приводит к этой форме. Решение состоит в том, чтобы использовать augknt, чтобы получить реальный кубический сплайн с двумя непрерывными производными:
spgood = spap2(augknt(knots_zY,4), 4, ec, Y);
В результате получится:
что намного лучше, учитывая выбор последовательности узлов.
Пожалуйста, опубликуйте минимальный воспроизводимый пример