方法一:转自yihandk666
x=[0 0.1 0.16 0.27 0.41 0.48 0.59 0.8]
y=[5 9 70 118 100 17 0 5];
那么用plot画出的函数为折线,如下图:
要想把那个折点平滑掉。像论文中那样,具体采用样条函数:下面是样条函数的定义:
spline function 一类分段(片)光滑、并且在各段交接处也有一定光滑性的函数。简称样条。样条一词来源于工程绘图人员为了将一些指定点连接成一条光顺曲线所使用的工具,即 富有弹性的细木条或薄钢条。由这样的样条形成的曲线在连接点处具有连续的坡度与曲率。分段低次多项式、在分段处具有一定光滑性的函数插值就是模拟以上原理 发展起来的,它克服了高次多项式插值可能出现的振荡现象,具有较好的数值稳定性和收敛性,由这种插值过程产生的函数就是多项式样条函数。
大概意思就是让转折点变平滑,下面就是采用这种方式:
values = spcrv([[x(1) x x(end)];[y(1) y y(end)]],3);
plot(values(1,:),values(2,:))
具体里面的原理我也没看过,不过目的是达到了 下面是结果
方法二:转自greatdju
figure:
x1=[0.8395 0.7995 0.7895 0.7867 0.7857 0.7853 0.7847 ];
y1=[1.11E-01 4.64E-02 1.19E-03 1.77E-04 1.57E-05 3.45E-06 2.55E-07 ];
subplot(1,2,1);
semilogy(x1,y1); %原来的折线
title('左边:原来的折线')
x2=linspace(min(x1),max(x1));
y2=interp1(x1,y1,x2,'cubic');
subplot(1,2,2)
semilogy(x2,y2) %处理后的曲线
title('右边:处理后的曲线');
x=[0.1 0.16 0.27 0.41 0.48 0.59 0.8];
y=[8 70 118 100 9 0 5];
以上是每一个X和Y对应的坐标,这个图形就像二次函数一样的
如果要在图中绘制一条直线加上y=70的直线,用不同颜色区分。
x=[0 0.1 0.16 0.27 0.41 0.48 0.59 0.8];
y=[5 9 70 118 100 17 0 5];
y1=[22.8 22.8 22.8 22.8 22.8 22.8 22.8 22.8]; values1=spcrv([[x(1) x x(end)];[y(1) y y(end)]],3,1000); values2=spcrv([[x(1) x x(end)];[y1(1) y1 y1(end)]],3,1000); plot(values1(1,:),values1(2,:),'r',values2(1,:),values2(2,:),'b')
ans2: 代码如下:
x=[0.1 0.16 0.27 0.41 0.48 0.59 0.8];
y=[8 70 118 100 9 0 5];
xp=0:0.1:1; yp=interp1(x,y,xp);
plot(x,y,'b-',xp,yp,'r-')%红色为差值后的平滑图像
hold on y1=70; plot(xp,y1,'c-') %
ans3:
x=[0.1 0.16 0.27 0.41 0.48 0.59 0.8];
y=[8 70 118 100 9 0 5]; X=linspace(0,.9); Y=spline(x,y,X); plot(x,y,'ro',X,Y,X,70+0*X)
%使用样条插值就可以画出平滑曲线了,添加这样几行代码
X=0:0.001:7.8;
Y=spline(x,y,X);
plot(X,Y)
也就是用插值方法,增加样点,用样条函数拟合,这样使得曲线平滑了
%不是很平滑的曲线
x=1:5;
y=1+x.^2+8*rand(1,length(x));
plot(x,y,'b-');
%插值,增加x样点数
x1 = 1:0.1:5
%用样条函数插值
y1=spline(x,y,x1);
hold on;
plot(x1,y1,'r-');
(红线比蓝线平滑)