服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - Matlab实现灰色预测的示例代码

Matlab实现灰色预测的示例代码

2022-12-05 13:18slandarer C/C++

这篇文章主要为大家详细介绍了如何利用Matlab实现灰色预测,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下

模型介绍

略微带过一下原理:

灰色预测对于趋势不强的数据,将其原始数据进行累加后得到具有明显趋势的新数据进行拟合,假设原数据为:

Matlab实现灰色预测的示例代码

则新数据集X(1)中数据为:

Matlab实现灰色预测的示例代码

通常认为累加数据服从指数分布,欸那我们直接假设:

Matlab实现灰色预测的示例代码

直接进行一个非线性拟合不就完事了,但是,从小学二年级开始,老师就教导我们,像这用指数函数拟合啊,各个参数的变化对于整体曲线的影响效果差别很大啊,直接拟合误差会很大啊,怎么能给他整成一个线性拟合啊?(直接拟合我有试过,能够大体描述趋势并做出预测,但是误差会比灰色预测大一点)。

指数函数一般符合一个微分方程:

Matlab实现灰色预测的示例代码

解常微分方程易得:

Matlab实现灰色预测的示例代码

这样我们只需要将a,u这俩常数求出来就能得到x(1)(t) ,就能得到X(1)序列然后逐项做差就能得到X(0)序列。

当k≤t≤k+1时,有:

Matlab实现灰色预测的示例代码

带入回之前的微分方程就有:

Matlab实现灰色预测的示例代码

实际上直接进行线性拟合就好了,当然我们也可以拿最小二乘法装模作样的分析一下,令:

Matlab实现灰色预测的示例代码

 

基础代码

核心代码非常短,只有六行,代码中给出了详细的注释,基础绘图还是MATLAB风比较简陋,后面会给出图像修饰代码。

X0=[15 16.1 17.3 18.4 18.7 19.1 19.9 21.3 22.5];
t=1:9;    % 原始数据自变量范围
pt=10:12; % 预测数据自变量范围

X1=cumsum(X0);                    % 累加生成趋势明显新序列
Z=X1(1:end-1)+diff(X1)./2;        % 均值,即(X1(1:end-1)+X1(2:end))./2
a_u=polyfit(-Z,X0(2:end),1);      % a_u=(B'*B)\B'*Y,B=[-Z,ones]
a=a_u(1);u=a_u(2);
P=(X1(1)-u/a)./exp(a.*([t,pt]-1))+u/a; % 求X1拟合值
P=[P(1),diff(P)];                      % X1逐项做差求预测值

% 绘图
plot([t,pt],P,'*-');
hold on
plot(t,X0,'s-')  
legend('预测值','真实值');

Matlab实现灰色预测的示例代码

 

基础代码+修饰

X0=[15 16.1 17.3 18.4 18.7 19.1 19.9 21.3 22.5];
t=1:9;    % 原始数据自变量范围
pt=10:12; % 预测数据自变量范围

X1=cumsum(X0);                    % 累加生成趋势明显新序列
Z=X1(1:end-1)+diff(X1)./2;        % 均值,即(X1(1:end-1)+X1(2:end))./2
a_u=polyfit(-Z,X0(2:end),1);      % a_u=(B'*B)\B'*Y,B=[-Z,ones]
a=a_u(1);u=a_u(2);
P=(X1(1)-u/a)./exp(a.*([t,pt]-1))+u/a; % 求X1拟合值
P=[P(1),diff(P)];                      % X1逐项做差求预测值

% 绘图
plot([t,pt],P,'s-','Color',[82,124,179]./255,'MarkerFaceColor',[82,124,179]./255,...
  'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',16)  
hold on
plot(t,X0,'d-.','Color',[169,64,71]./255,'MarkerFaceColor',[169,64,71]./255,...
  'MarkerEdgeColor',[1,1,1],'LineWidth',2,'MarkerSize',16)  

% 增添图例
lgd=legend('fitting result','original data');
lgd.Location='best';
lgd.FontSize=16;

% 坐标区域修饰
ax=gca;grid on;box off
ax.LineWidth=2;
ax.Color=[249,250,245]./255;
ax.XMinorTick='on';
ax.YMinorTick='on';
ax.GridLineStyle='-.';
ax.XColor=[1,1,1].*.2;
ax.YColor=[1,1,1].*.2;
ax.FontName='Cambria';
ax.FontSize=14;

Matlab实现灰色预测的示例代码

到此这篇关于Matlab实现灰色预测的示例代码的文章就介绍到这了,更多相关Matlab灰色预测内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://mp.weixin.qq.com/s/VQieLxYll0keo6fGhipmkA

延伸 · 阅读

精彩推荐
  • C/C++c++素数筛选法

    c++素数筛选法

    本文讲的是筛选法的C++实现, 筛选法又称筛法,是求不超过自然数N(N>1)的所有质数的一种方法。据说是古希腊的埃拉托斯特尼(Eratosthenes,约公元前...

    傻蜗牛9672021-05-13
  • C/C++C语言实现520表白代码 祝你表白成功!

    C语言实现520表白代码 祝你表白成功!

    这篇文章主要为大家详细介绍了C语言实现520表白代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    岩枭6652021-07-29
  • C/C++C++中 map的基本操作

    C++中 map的基本操作

    map是一类关联式容器。接下来通过本文给大家分享c++中的map基本操作,需要的朋友参考下...

    杨柳岸晓风7592021-05-10
  • C/C++c/c++获取系统时间函数的方法示例

    c/c++获取系统时间函数的方法示例

    这篇文章主要介绍了c/c++获取系统时间函数的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友...

    优秀afa4452021-08-20
  • C/C++浅谈C语言的变量和常量

    浅谈C语言的变量和常量

    这篇文章主要为大家详细介绍了C语言的变量和常量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你...

    陆悠漓10482022-09-22
  • C/C++C语言实现三子棋游戏(初级版)

    C语言实现三子棋游戏(初级版)

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏初级版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    sugar high8632021-09-28
  • C/C++浅谈时间戳与日期时间互转C语言

    浅谈时间戳与日期时间互转C语言

    下面小编就为大家带来一篇浅谈时间戳与日期时间互转C语言。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C语言教程网4212021-04-06
  • C/C++C++17 使用 std::string_view避免字符串拷贝优化程序性能

    C++17 使用 std::string_view避免字符串拷贝优化程序性能

    这篇文章主要介绍了C++17 使用 std::string_view避免字符串拷贝优化程序性能,帮助大家提高程序运行速度,感兴趣的朋友可以了解下...

    半杯茶的小酒杯11012021-09-29