【MATLAB第74期】#源码分享 | 基于MATLAB的ARX-ARMAX线性自回归移动平均外生模型(结合最小二乘思路)

news2025/1/20 14:56:17

【MATLAB第74期】#源码分享 | 基于MATLAB的ARX-ARMAX线性自回归移动平均外生模型(结合最小二乘思路)

根据ARX预测输出和实际输出的误差向量,采用ARMAX算法结合ARX误差建模,对预测值进一步细化。通过将误差描述为白噪声的移动平均值,
目前,该代码仅支持输入维度为1,输出维度为1的数据。

一、ARX模型

1.ARX公式

在这里插入图片描述
其中,Y代表输出向量,u代表输入向量。
参数𝑎1,𝑎2,…,𝑎𝑝 , 𝑏0,𝑏1,…,𝑏𝑚 使用最小二乘算法求解。

上述方程可以写成矩阵形式:
在这里插入图片描述

2.ARX代码实现

clc;
clear all;
close all;
data=xlsread('数据.xlsx');
u_in=data(:,1);
y_out=data(:,2);
% ARX Process-----------------------------
L=length(u_in);
u_in_ID=u_in;%用于标识的输入数据
u_in_vfy=u_in;%用于验证的输入数据
y_out_ID=y_out;%用于标识的输出数据
y_out_vfy=y_out;%用于验证的输出数据
m=5;%用于生成输入、输出和错误的延迟顺序的参数
n=length(y_out_ID)-m;


I=eye(n,1)+1;% 
I(1)=I(1)-1; % 53 *1   ones(53,1)
A=I;%初始化矩阵A    53*1
Y=y_out_ID((m+1):end);%定义Y矢量  ,输出延迟m个值
na=1;
%将输出延迟1到m-na放入A矩阵
for k=1:1:m-na  %m-1
    A=[A y_out_ID((m-k+1):(end-k))]; % 53*1 5:57  4:56  3:55  2:54输出
end

%将“当前输入——第m个延迟输入”输入到矩阵A
for p=1:1:m
    k=p-1; %0 1 2 3 4
    A=[A u_in_ID((m-k+1):(end-k))]; % 53*1 6:58 5:57 4:56 3:55 2:54输入
end  % A  53*10
A(:,1)=[]; %删除用于初始化矩阵A的第一列
parsol=inv(A'*A)*A'*Y  %最小二乘法求解 

%基于先前生成已识别输出(预测秒数)矢量输出、当前和以前的输入和参数通过最小二乘法求解
%平方法
n=length(y_out_vfy)-m;  %53
I=eye(n,1)+1;
I(1)=I(1)-1; 
A=I;
for k=1:1:m-na
    A=[A y_out_vfy((m-k+1):(end-k))];
end

for p=1:1:m
    k=p-1;
    A=[A u_in_vfy((m-k+1):(end-k))];
end
A(:,1)=[]; %删除用于初始化矩阵A的第一列
y_out_sysID=A*parsol;% 预测结果


T_sim1 =y_out_sysID';
T_train=y_out_vfy((m+1):end)';
vfy=y_out_vfy((m+1):end);
M=size(T_sim1,2);

%%  均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);


%%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'ARX训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid


%%  相关指标计算
% R2
R1 = 1 - norm(T_train - T_sim1)^2 / norm(T_train - mean(T_train))^2;

disp(['ARX训练集数据的R2为:', num2str(R1)])

% MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;

disp(['ARX训练集数据的MAE为:', num2str(mae1)])

% MBE
mbe1 = sum(T_sim1 - T_train) ./ M ;

disp(['ARX训练集数据的MBE为:', num2str(mbe1)])

在这里插入图片描述

二、ARMAX模型

1.ARMAX公式

在这里插入图片描述

2.ARMAX代码实现(部分)

Y_actual=y_out_ID((m+1):end); %由于前m个值用于ARX中的延迟建模  53*1
u=u_in_ID((m+1):end);  %53*1 
Y_verify=y_out_vfy((m+1):end); %53*1
U_verify=u_in_vfy((m+1):end);%53*1
error =vfy- y_out_sysID;%误差矢量由实际错误组成
......
%基于先前生成已识别输出(预测秒数)矢量
%解决了输出、以前的错误、当前和以前的输入和参数
%通过最小二乘法
n=length(Y_verify)-m;
I=eye(n,1)+1;
I(1)=I(1)-1; %是一个哥伦布矢量,所有元素都是Unity
A=I;
Y=Y_verify((m+1):end);
for k=1:1:m-na
    A=[A Y_verify((m-k+1):(end-k))];
end

for p=1:1:m
    k=p-1;
    A=[A U_verify((m-k+1):(end-k))];
end

for p=1:1:m
    k=p;
    A=[A error((m-k+1):(end-k))];
end
A(:,1)=[];
Y_sysID=A*parsol;



T_sim11 =Y_sysID';
T_train11=Y_verify((m+1):end)';
M11=size(T_sim11,2);

%%  均方根误差
error11 = sqrt(sum((T_sim11 - T_train11).^2) ./ M11);


%%  绘图
figure
plot(1: M11, T_train11, 'r-*', 1: M11, T_sim11, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'ARMAX训练集预测结果对比'; ['RMSE=' num2str(error11)]};
title(string)
xlim([1, M11])
grid


%%  相关指标计算
% R2
R11 = 1 - norm(T_train11 - T_sim11)^2 / norm(T_train11 - mean(T_train11))^2;

disp(['ARMAX训练集数据的R2为:', num2str(R11)])

% MAE
mae11 = sum(abs(T_sim11 - T_train11)) ./ M11 ;

disp(['ARMAX训练集数据的MAE为:', num2str(mae11)])

% MBE
mbe11 = sum(T_sim11 - T_train11) ./ M11 ;

在这里插入图片描述

三、代码获取

CSDN后台私信“74期”即可获取下载方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/997088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务管理: 构建稳健的数据库事务处理

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

C++算法 —— 动态规划(4)子数组

文章目录 1、动规思路简介2、最大子数组和3、环形子数组的最大和4、乘积最大子数组5、乘积为正数的最长子数组长度6、等差数列划分7、最长湍流子数组8、单词拆分9、环绕字符串中唯一的子字符串 每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路…

商城系统优化

1、DB、模板的渲染速度(thymeleaf)、静态资源、日志、JVM 数据库的优化(参照数据库优化课程)使用索引,减少数据库的交互次数、缓存 thymeleaf使用缓存 静态资源:放到nginx中,实现动静分离 2、…

【数学】ABC 319 E

E - Bus Stops 题意: 思路: 感觉思路比较简单 首先注意到每个询问的范围是1e9,不难想到答案一定存在某个循环节,最后一定是要 %T的 那么问题就在于找到这个循环节是什么 猜想循环节为lcm(p1, p2, p3, ....) 用小数据验证 n…

一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用

目录 一.文件上传 二.文件下载 三.多文件上传 四,jrebel的介绍 前言: 我们之前已经实现了SpringMVC的增删改查,今天这一篇博客教会您SpringMVC文件上传、下载,多文件上传及工具jrebel的使用,希望这篇博客能够给正在…

二、Spark 调度系统

目录 Spark 调度系统DAGSchedulerSchedulerBackendTaskSchedulerExecutorBackendSpark 任务调度流程 Spark 调度系统 分布式计算的精髓,在于如何把抽象的计算图,转化为实实在在的分布式计算任务,然后以并行计算的方式交付执行。 Spark调度系…

Mojo安装使用初体验

一个声称比python块68000倍的语言 蹭个热度,安装试试 系统配置要求: 不支持Windows系统 配置要求: 系统:Ubuntu 20.04/22.04 LTSCPU:x86-64 CPU (with SSE4.2 or newer)内存:8 GiB memoryPython 3.8 - 3.10g or cla…

华为云云耀云服务器L实例评测 | 分分钟完成打地鼠小游戏部署

前言 在上篇文章【华为云云耀云服务器L实例评测 | 快速部署MySQL使用指南】中,我们已经用【华为云云耀云服务器L实例】在命令行窗口内完成了MySQL的部署并简单使用。但是后台有小伙伴跟我留言说,能不能用【华为云云耀云服务器L实例】来实现个简单的小游…

车载诊断数据库——诊断问卷调查表与CDD关联关系

车载诊断数据库——诊断问卷调查表与CDD关联关系 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生…

超级电容-电池-超级电容混合储能系统能量管理simulink仿真建模模型

建立混合储能系统模型 在Simulink中,首先需要建立一个超级电容和蓄电池并联的混合储能系统模型。其中,超级电容和蓄电池的荷电状态(SOC)需要根据实际情况进行管理。荷电状态可以通过对电池和超级电容的电压、电流等进行测量&…

说透 Nacos 一致性协议

1 Nacos ⼀致性协议 1.1 为什么 Nacos 需要⼀致性协议 Nacos尽可能减少用户部署以及运维成本,做到用户只需要⼀个程序包,就快速单机模式启动 Nacos 或集群模式启动 Nacos。而 Nacos 是⼀个需要存储数据的组件,为实现目标,就要在…

透视俄乌网络战之二:Conti勒索软件集团(上)

透视俄乌网络战之一:数据擦除软件 Conti勒索软件集团(上) 1. Conti简介2. 组织架构3. 核心成员4. 招募途径5. 工作薪酬6. 未来计划参考 1. Conti简介 Conti于2019年首次被发现,现已成为网络世界中最危险的勒索软件之一&#xff0…

汇川PLC学习Day3:轴控代码编写、用户程序结构说明与任务配置示例、

汇川PLC学习Day3:轴控代码编写、用户程序结构说明、任务配置示例 一、新建轴与轴控代码编写 1. 新建轴 (1)新建一个轴 (2)将轴名字更新为实际名字 可以后面实例化后再更改,汇川可以在更新名字时同步更新其他编写的代码名字&a…

GStreamer时钟同步

播放复杂媒体时,每个audio和video sample必须在特定时间按特定顺序播放。为此,GStreamer提供了一种同步机制,通过使用 GstClock object、buffer timestamps和SEGMENT event来实现: (1)GstClock:…

Java中如何获取一个字符串是什么类型

Java中如何获取一个字符串是什么类型? 在Java中,您可以使用一些方法来确定一个字符串的类型。下面是一些常用的方法: 使用正则表达式:您可以使用正则表达式来匹配字符串是否符合特定的模式或格式,以确定其类型。例如&…

【Linux入门指北】Linux磁盘扩容

文章目录 1、给 / 分区扩容 Linux在使用过程中由于数据量不断增大,导致磁盘空间不足,需要增加磁盘空间,主要有以下三种方式: 直接给 / 分区(或者某一分区)扩容,直接在原有磁盘上增大空间给虚拟机新增一块磁…

typeScript 学习笔记(二)

类接口 TypeScript 入门教程 (xcatliu.com) 十四.类 ① 类 类:定义了一件事物的抽象特点,包含它的属性和方法对象:类的实例,通过new生成面向对象(OOP)的三大特性:封装、继承、多态封装&…

C++学习笔记(重载、类)

C 1、函数重载2、类2.1、类的方法和属性2.2、类的方法的定义2.3、构造器和析构器2.4、基类与子类2.5、类的public、protected、private继承2.6、类的方法的重载2.7、子类方法的覆盖2.8、继承中的构造函数和析构函数 1、函数重载 函数重载大概可以理解为,定义两个名…

Rethink LSTMGRU

LSTM 设计思想 姑且不看偏置。 W W W 和 U U U 是加权的矩阵,写模型的时候用 nn.Linear(in_dim, out_dim) 就成; σ \sigma σ 是 Sigmoid 函数 第一条,遗忘门,定义为 有多少内容需要被遗忘;第二条:输入门…