2016-03-16 67 views
2

我有兩個向量定義的(隨機),x和y如下: 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];三次樣條的實施

以下是我在情節簡單地輸入(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

謝謝你的迴應。你是對的,我對我應該插入什麼感到困惑。你的解決方案做我想做的事情:) –