2016-03-16 3 views
2

У меня есть два вектора, х и у, которые определены (случайным образом) следующим образом: x1=[1000 3000 5000 6000 4000 2000 500 0 -1000 -3000 -5000 -6000 -4000 -2000 -500 1 999 2999 4999]; y1=[5000 4999 4990 3500 2500 2499 2498 2497 2496 2495 2494 1000 -1000 -999 -998 -997 -996 -995 -994];Кубический сплайновая реализация в Matlab

Ниже сюжет я получил, просто введя в сюжет (x1, y1):

Plot of raw data

есть ли способ, чтобы получить гладкую кривую из приведенных выше данных, используя команду interp1? Мне сказали, что я должен использовать кубические сплайны для достижения желаемого сюжета, однако, поскольку я новичок в Matlab, я не знаю, как реализовать такое решение. Заранее спасибо!

Редактировать: Я попытался реализовать его следующим образом, но я получаю отвратительный перспективный сюжет! x1_temp=-6000:100:6000; pc=pchip(x1,y1,x1_temp); plot(x1,y1,'o',x1_temp,pc,'-');

Как я могу изменить этот код для получения правильного участка?

+1

ли вы читали документацию для [ 'interp1'] (http://www.mathworks.com/help/matlab/ref/interp1.html)? В разделе [метод] (http://www.mathworks.com/help/matlab/ref/interp1.html#inputarg_method) отображаются различные варианты сплайнов. Лично я рекомендую вам начинать с 'pchip' вместо кубических сплайнов, если нет веских оснований для использования чистых кубических сплайнов. Прочтите документы, попробуйте сами и попросите снова (С КОДОМ !!!), если вы застряли. – Dan

+2

У вас есть монотонный вектор x, но монотонный вектор y. Поэтому вы не должны интерполировать с помощью 'interp1 (x1, y1, MyNewsPointsOnX, 'pchip')', но вместо этого используйте 'interp1 (y1, x1, MyNewsPointsOnY, 'pchip')'. С 'MyNewsPointsOnY = linspace (min (y1), max (y1), 1000);' – obchardon

+0

@ Dan Я отредактировал свое оригинальное сообщение, чтобы включить мою попытку решить эту проблему. –

ответ

3

Я думаю, вы смущены тем, что вы интерполируете. Вы должны интерполировать x1 и y1 отдельно, а затем строить их друг против друга. Следующий пример создает гладкую кривую:

x1=[1000 3000 5000 6000 4000 2000 500 0 -1000 -3000 -5000 -6000 -4000 -2000 -500 1 999 2999 4999]; 
y1=[5000 4999 4990 3500 2500 2499 2498 2497 2496 2495 2494 1000 -1000 -999 -998 -997 -996 -995 -994]; 

s = [0,cumsum(sqrt(diff(x1).^2+diff(y1).^2))] 
N = length(s); 

figure(); 
plot(x1,y1); 
hold on 

s_fine = interp1(linspace(0,1,N),s,linspace(0,1,5*N)); 
pcx=interp1(s,x1,s_fine,'spline'); 
pcy=interp1(s,y1,s_fine,'spline'); 
plot(pcx,pcy,'r-'); 
+0

Благодарим за отзыв. Вы были правы, я был смущен тем, что я должен был интерполировать. Ваше решение делает то, что я хотел сделать в своем уме :) –

Смежные вопросы