Matlab智能仿真 |
您所在的位置:网站首页 › 曲线图画法 › Matlab智能仿真 |
作者的话: 众所周知,有个神器名叫Matlab。 Matlab可以有很多应用,此处主要介绍智能仿真。 还是挺好用的,个人建议通过例程来进行学习,留意注释哦 多项式拟合,就是在得知两组数据具有相关性的前提下,通过多项式曲线(次数需要自己自行调整),来拟合原始数据。 多项式次数过高:拟合速度慢,电脑运算时间长。在此例中,会发现,三次和四次的拟合效果差不多,那我们采用的就应该是三次。 多项式次数过低:拟合效果差,得不到想要的多项式拟合效果。在此例中,会发现,一次拟合严重不符合原始数据,就是拟合次数过低的体现。 相关性验证:用corrcoef(x,y)得到相关性矩阵,其中x,y都应该是矩阵,数值越接近1相关性越高 以下为代码: %%针对matlab提供的census.mat数据文件,将其中的数据进行多项式拟合, clear;clc; %清屏,初始化load census.mat %导入数据 %计算样本的相关系数矩阵,并画散点图,证明二者有较强的相关性 subplot(3,3,1); %开启绘图窗口,创建9个子图,当前操作第一个子图scatter(cdate,pop,'om') %用散点图的方式显示原始数据,用品红色的o标注title('U.S. Population from 1790 to 1990'); %给图形窗口写一个标题xlabel('Census Year'); %给x轴命名ylabel('Population (millions)'); %给y轴命名corrcoef(cdate,pop); %相关性矩阵sdate=(cdate-mean(cdate))./std(cdate); %样本数据标准化 %根据不同的拟合次数先画拟合图和残差图,以选择合适的模型 k=2; %从第二个子图开始操作for i=1:4 %循环,设置不同拟合次数 t=polyfit(sdate,pop,i); %拟合系数矩阵 fit_y=polyval(t,sdate); %计算y的拟合值 subplot(3,3,k);%操作第k个子图 k=k+1; %操作下一个子图 plot(cdate,fit_y,'+-',cdate,pop,'om'); %显示拟合后的线和原数据 title('U.S. Population from 1790 to 1990') legend('Polynomial Model','Data','Location','NorthWest'); xlabel('Census Year'); ylabel('Population (millions)'); hold off; subplot(3,3,k);%操作第k个子图 k=k+1; %操作下一个子图 res = pop - fit_y; %计算拟合值与原数据的差 plot(cdate,res,'+m') %可视化残差 title(['Residuals for the Quadratic Polynomial Model(n=',num2str(i),')’]); %给不同的子图显示标题end %结束循环标志t=polyfit(sdate,pop,3); %计算3次拟合的残差和拟合优度,polyfit返回的是不同次方项的系数矩阵fit_y=polyval(t,sdate); %拟合后的y值,将系数矩阵与对应的y按次方相乘yresid = pop - fit_y; SSresid = sum(yresid.^2); SStotal = (length(pop)-1) * var(pop); rsq = 1 - SSresid/SStotal %最小二乘法计算平方误差,公式在最后的tips中运行结果:
观察数据曲线和残差图,可以得出三次多项式拟合得很不错了 所以得到的多项式为: tips: Matlab的安装可以在网上或者淘宝上找资源,请预留相当大的内存空间 %为Matlab中的注释标志 Matlab有命令行和脚本两种,以上所给出的完整代码放入复制到脚本中可以运行。但是也可以一行一行在命令行中运行,更方便观察。 census.mat是Matlab自带的,直接引用就行。 在Matlab命令行中,语句结束带;就不会显示运行结果,所以如果大家要在命令行中一行一行尝试的话,记得把末尾的;删去。 记得标准化数据(自变量x) 最后记得运算残差,用最小二乘法。公式为
有建议欢迎指出,也欢迎友好交流!另也欢迎关注其他平台上本人的账号 如下: 微信公众号:知识薪火站 知乎:youzuos 小红书:知识薪火站 感谢支持!
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |