2016-03-16 66 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

谢谢你的回应。你是对的,我对我应该插入什么感到困惑。你的解决方案做我想做的事情:) –