2016-03-04 9 views
0

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

Для установки экземпляра:

x = [3 4 7 9]; 
y = [2 1 2 0.5]; 

можно использовать функцию CSAPE для получения кусочно-полиномиальной

pp = csape(x,y,'variational'); 

Далее, оценивающие п.п. в диапазоне [0-10] выходы,

xx = 0:0.1:10; 
yy =ppval(pp,xx); 
plot(xx,yy) 

enter image description here

Однако этот метод не обеспечивает плоскую экстраполяцию вне диапазона [3-9] (т.е. для x < 3 все значения для y должны быть 2, а для x> 9 все значения для y должны быть равны 0,5)

Есть ли способ достичь желаемого результата?

Edit: Непрерывность на границе узла должны быть сохранены

ответ

1

Я не думаю, что есть необходимость в использовании csape, вы можете просто использовать spline. Из документации spline:

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

Кроме того, сплайн позволяет получить интерполированные yy значения непосредственно, так:

x = [3 4 7 9]; 
y = [2 1 2 0.5]; 
xx = 0:0.1:10; 
yy = spline(x,[0 y 0], xx); 
plot(xx,yy) 

Это дает мне сюжет ниже.

Spline Plot

Глядя на это, наклон равен нулю на границах (х = 3 и х = 9), которая является то, что мы спрашиваем, а «зажимают» сплайн с нулевым градиентом на границах. Если вы хотите иметь нулевой градиент вне границ, я бы рекомендовал просто делать следующее:

yy(xx<x(1)) = y(1); 
yy(xx>x(length(x))) = y(length(y)); 

Давать:

enter image description here

Редактировать

Это дает непрерывную y функцию на концах, но y' не является гладким на концах узлов. Если вы хотите, чтобы y 'был гладким, вы могли бы накладывать свои входные массивы и использовать его в качестве входа в свою функцию spline. Это даст вам некоторые колебания, как показано ниже, хотя это может быть или не быть тем, что вы хотите.

% Spline on padded input arrays 
x = [0 1 2 3 4 7 9 10 11 12]; 
y = [2 2 2 2 1 2 0.5 0.5 0.5 0.5]; 
yy = spline(x,y, xx); 

enter image description here

+0

Спасибо RPM. Это очень полезно. Действительно, мне нужно иметь нулевой градиент за пределами границ, как и во втором сюжете. Еще один вопрос: замените ли значения значений вне границ на y (1) и y (length (y)), сохраняя непрерывность функции на граничных узлах? – sets

+0

Ну, просто глядя на сюжет, вы можете видеть, что 'y' непрерывна, но я не думаю, что' y'' будет гладкой. Если вы хотите, чтобы они были гладкими, вы могли бы заполнить свои массивы (добавьте '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' '' '' '' '' '' '' '' '' '' '' '' ',' Я сделаю редактирование на этот счет. – RPM