6年前第一次接触matlab,期间只有在完成某些作业的时候用到过,也仅限于plot之类。去年冬天S函数怎么都用不好;工作面试说不清Simulink和m文件;上周用了近一周时间来做数据拟合并求其导数。下面是数据拟合的简单记录,使用两种拟合方法。
%%导入数据的基本操作
num=xlsread('C:\Users\Desktop\data'); %导入数据(路径+文件名)
x=num(:,1); %第1列,时间
y=num(:,2); %第2列,幅值
%%多项式拟合法(这里采用9次多项式)
p=polyfit(x,y,9); %得到拟合曲线的多项式系数
yval=polyval(p,x); %得到拟合曲线的多项式的函数值
p1=polyder(p); %1阶导数多项式系数
v=polyval(p1,x); %1阶导数多项式的函数值
%%基本画图
figure('Name','曲线拟合');
f1=plot(x,y1'*'); %显示原数据,离散
xlabel('时间');
ylabel('幅值');
grid on; %网格显示
hold on; %上下图画到一个figure里,hold off为取消
f2=plot(x,yval,'r','LineWidth',2); %显示拟合曲线,连续,红色,线宽2
legend('离散点','连续曲线'); %原数据及拟合曲线图注
上面的方法得到的拟合曲线是连续的并且能得到具体的表达式。另外,cftool工具箱也很好用,里面有很多拟合方法。越来越觉得matlab真的很强大。
下面的求导方式得到一个个离散点。
h=0.1; %两数据点间的时间间隔
for i=1:200
dy(i)=y(i+1)-y(i);
k1(i)= dy(i)/h; % 1阶导数
t1(i)=x(i)+h/2;
end
for j=1:
ddy(j)=dy(j+1)-dy(j);
k2(j)=ddy(j)/h; %2阶导数
t2(j)=x(j+1);
end
%%平滑方法-----贝塞尔曲线拟合matlab实现
这是一个子函数,在主函数调用就可以了,其原理我也不懂,但拟合效果较上述好。这是其他博主微博里分享的,见下面的链接。
function [X,Y]=bezier(x,y)
n=length(x);
t=linspace(0,1);
xx=0;yy=0;
for k=0:n-1
tmp=nchoosek(n-1,k)*t.^k.*(1-t).^(n-1-k);
xx=xx+tmp*x(k+1);
yy=yy+tmp*y(k+1);
end
if nargout==2
X=xx;Y=yy;
end
具体可参考博客:贝塞尔曲线原理https://blog.csdn.net/shenziheng1/article/details/54410816
贝塞尔曲线matlab实现https://blog.csdn.net/yeyang911/article/details/53573397
写在最后:感谢大家的分享和帮助,也希望我的分享能有它的价值。