第一篇:Matlab+Excel+DataFitting+Derivative

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

写在最后:感谢大家的分享和帮助,也希望我的分享能有它的价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值