主要内容

非线性系统辨识

本例展示了如何使用线性ARX和非线性ANFIS模型进行动态系统识别。

加载数据

本例中用于ANFIS和ARX建模的数据集来自“反馈过程训练器PT 326”实验室设备[1]。该设备的功能类似于吹风机:空气通过管道吹起,并在入口加热。热电偶测量空气温度。输入 u k 电压是否通过电阻导线网来加热进来的空气和输出 y k 是出风口温度。

加载测试数据并绘制输入和输出。

负载dryerdataData_n = length(y);输出= y;Input = [[0;y (1: data_n-1)]...[0;0;y (1: data_n-2)]...[0;0;0;y (1: data_n-3)]...[0;0;0;0;y (1: data_n-4)]...[0;u (1: data_n-1))...[0;0;u (1: data_n-2))...[0;0;0;u (1: data_n-3))...[0;0;0;0;u (1: data_n-4))...[0;0;0;0;0;u (1: data_n-5))...[0;0;0;0;0;0;u (1: data_n-6)];数据=[输入输出];数据(1:6,:)= [];Input_name = [“y (k - 1)”“y (k-2)”“y (k3)”“y (k-4)”...“u (k - 1)”“u (k-2)”“u (k3)”“u (k-4)”“u(6年级)”“u (k-6)”];指数= 1:100;图subplot(2,1,1) plot(index,y(index),“-”指数y(指数),“o”)标题(“输出数据”) ylabel (“y (k)”) subplot(2,1,2) plot(index,u(index),“-”、索引、u(索引)“o”)标题(“输入数据”) ylabel (“u (k)”

图中包含2个轴对象。标题为Output Data的Axes对象1包含2个类型为line的对象。标题为Input Data的坐标轴对象2包含2个类型为line的对象。

数据点反映0.08秒的采样时间。输入 u k 是一个在3.41和6.41之间移动的二进制随机信号。在每个样本处改变输入的概率是0.2。数据集包含1000个输入/输出数据点。这些图显示了输出温度 y k 和输入电压 u k 对于前100个时间步。

识别ARX模型

ARX模型是如下形式的线性模型:

y k + 一个 1 y k - 1 + + 一个 y k - b 1 u k - d + + b n u k - d - n + 1

在这里:

  • y k 而且 u k 是原始数据的均值减去版本。

  • 一个 而且 b j 都是线性参数。

  • n , d 是精确指定ARX模型的三个整数。

为了找到烘干机设备的ARX模型,首先将数据集划分为一个训练( k = 1至300)和验证( k = 301 ~ 600)。

Trn_data_n = 300;Total_data_n = 600;Z = [y u];Z = dtrend(Z);Ave = mean(y);Ze = z(1:trn_data_n,:);Zv = z(trn_data_n+1:total_data_n,:);T = 0.08;

执行详尽的搜索以找到的最佳组合 n , d ,允许每个整数分别从1到10。要执行搜索并选择ARX参数,请使用arxstruc(系统识别工具箱)而且selstruc(系统识别工具箱)功能。

运行所有不同的模型。V = arxstruc(ze,zv,struc(1:10,1:10,1:10));找到最好的模型。nn = selstruc(V,0);显示模型参数disp ("[m n d] = "+ num2str (nn))
[m n d] = 5 10

最好的ARX模型有 = 5, n = 10,和 d = 2。创建时,训练均方根误差(RMSE)为0.1122,验证RMSE为0.0749。原图 y k 还有这个ARX模型。

使用这些参数创建并模拟ARX模型。

Th = arx(ze,nn);th。Ts = 0.08;U = z(:,2);Y = z(:,1) + ave;Yp = sim(u,th) + ave;

根据训练和验证数据绘制ARX模型输出。训练均方根误差(RMSE)为0.1121,验证RMSE为0.0748。

图subplot(2,1,1) index = 1:trn_data_n;情节(指数、y(指数)指数,yp(指数),“。”) rmse = norm(y(index)-yp(index))/√(length(index));标题(训练数据(实),ARX预测(点)...+换行符+" rmse = "+ num2str(rmse))“时间步骤”次要情节(2,1,2)指数= (trn_data_n + 1): (total_data_n);情节(指数、y(指数)指数,yp(指数),“。”) rmse = norm(y(index)-yp(index))/√(length(index));标题(验证数据(实体),ARX预测(点)...+换行符+" rmse = "+ num2str(rmse))“时间步骤”

图中包含2个轴对象。轴对象1,标题训练数据(实),ARX预测(点)RMSE = 0.11208包含2个类型线的对象。坐标轴对象2带有标题验证数据(实心),ARX预测(圆点)RMSE = 0.07483包含2个类型为行的对象。

识别ANFIS模型

ARX模型是线性的,可以快速地进行模型结构和参数识别。在前面的情节中的表现似乎是令人满意的。然而,如果你想要更好的性能,你可以尝试非线性模型,如自适应神经模糊推理系统(ANFIS)。

要使用ANFIS进行系统标识,首先要确定将哪些变量用于输入参数。为简单起见,使用10个候选输入( y k - 1 y k - 2 y k - 3. y k - 4 u k - 1 u k - 2 u k - 3. u k - 4 u k - 5 , u k - 6 ).使用 y k 作为输出。

使用函数执行输入的顺序前向搜索sequentialSearch.该函数依次选择每个输入变量来优化RMSE。

Trn_data_n = 300;Trn_data = data(1:trn_data_n,:);Val_data = data(trn_data_n+1:trn_data_n+300,:);[~,elapsed_time] = sequentialSearch(3,trn_data,val_data,input_name);
选择输入1…模型1:y (k - 1),错误:trn = 0.2043, val = 0.1888模型2:y (k-2)错误:trn = 0.3819, val = 0.3541模型3:y (k3)错误:trn = 0.5245, val = 0.4903模型4:y (k-4)错误:trn = 0.6308, val = 0.5977模型5:u (k - 1),错误:trn = 0.8271, val = 0.8434模型6:u (k-2)错误:trn = 0.7976, val = 0.8087模型7:u (k3)错误:trn = 0.7266, val = 0.7349模型8:u (k-4)错误:trn = 0.6215, val = 0.6346模型9:u(6年级),错误:trn = 0.5419, val = 0.5650模型10:u (k-6)错误:trn = 0.5304, val = 0.5601当前选择的输入:y(k-1)选择输入2…模型11:y (k - 1) y (k-2)错误:trn = 0.1085, val = 0.1024模型12:y (k - 1) y (k3)错误:trn = 0.1339, val = 0.1283模型13:y (k - 1) y (k-4)错误:trn = 0.1542, val = 0.1461模型14:y (k - 1) u (k - 1),错误:trn = 0.1892, val = 0.1734模型15:y (k - 1) u (k-2)错误:trn = 0.1663, val = 0.1574模型16:y (k - 1) u (k3)错误:trn = 0.1082, val = 0.1077模型17:y (k - 1) u (k-4)错误:trn = 0.0925, val = 0.0948模型18:y (k - 1) u(6年级),错误:trn = 0.1533, val = 0.1531模型19:y(k-1) u(k-6),错误:trn = 0.1952, val = 0.1853当前选择的输入:y(k-1) u(k-4)选择输入3…模型20:y (k - 1) u (k-4) y (k-2)错误:trn = 0.0808, val = 0.0822模型21:y (k - 1) u (k-4) y (k3)错误:trn = 0.0806, val = 0.0836模型22:y (k - 1) u (k-4) y (k-4)错误:trn = 0.0817, val = 0.0855模型23:y (k - 1) u (k-4) (k - 1),错误:trn = 0.0886, val = 0.0912模型24:y (k - 1) u (k-4) (k-2)错误:trn = 0.0835, val = 0.0843模型25:y (k - 1) u (k-4) (k3)错误:trn = 0.0609, val = 0.0604模型26:y (k - 1) u (k-4)(6年级),错误:trn = 0.0848, val = 0.0867模型27:y(k-1) u(k-4) u(k-6),误差:trn = 0.0890, val = 0.0894当前选择的输入:y(k-1) u(k-3) u(k-4)

图中包含一个轴对象。标题为Error for相应输入的axis对象包含3个类型为line的对象。这些对象代表训练、验证。

这张图显示了所有尝试的输入组合sequentialSearch.搜索选择 y k - 1 u k - 3. , u k - 4 因为具有这些输入的模型具有最低的训练RMSE和验证RMSE。

或者,您可以对输入候选项的所有可能组合使用穷尽搜索。和以前一样,从10个候选输入中搜索3个输入。你可以使用这个函数exhaustiveSearch为了这样的搜索;然而,这个函数尝试所有可能的候选组合, 1 0 3. 1 2 0 在这种情况下。

而不是exhaustiveSearch,使用自定义代码搜索这些组合的子集。对于本例,不要只从输入或只从输出中选择任何输入组合。

作为合理的猜测,选择具有两个输出值和一个输入值的输入组合,将产生36个可能的输入组合。定义用于选择输入索引的组:两组用于选择输出,一组用于选择输入。

Group1 = [1 2 3 4];% y(k-1) y(k-2) y(k-3) y(k-4)Group2 = [1 2 3 4];% y(k-1) y(k-2) y(k-3) y(k-4)Group3 = [5 6 7 8 9 10];% u(k-1)到u(k-6)

指定培训参数和选项。

Anfis_n = 6*length(group3);索引= 0 (anfis_n,3);Trn_error = 0 (anfis_n,1);= 0 (anfis_n,1);创建用于生成初始FIS的选项集。genOpt = genfisOptions(“GridPartition”“NumMembershipFunctions”2,...“InputMembershipFunctionType”“gbellmf”);为一个fis函数创建选项集,并设置保留的选项%常数用于不同的训练场景。anfisOpt = anfisOptions(“EpochNumber”, 1...“InitialStepSize”, 0.1,...“StepSizeDecreaseRate”, 0.5,...“StepSizeIncreaseRate”, 1.5,...“DisplayANFISInformation”0,...“DisplayErrorValues”0,...“DisplayStepSize”0,...“DisplayFinalResults”, 0);

为每个输入组合训练ANFIS模型。

模型= 1;I = 1:length(group1)J = i+1:长度(group2)K = 1:长度(group3)创建输入组合。In1 = input_name(group1(i));In2 = input_name(group2(j));In3 = input_name(group3(k));索引(模型,:)= [group1(i) group2(j) group3(k)];Trn_data =数据(1:trn_data_n,...[group1(i) group2(j) group3(k) size(data,2)];Val_data = data(trn_data_n+1:trn_data_n+300,...[group1(i) group2(j) group3(k) size(data,2)];创建初始的FIS结构。in_fis = genfis (trn_data (: 1: end-1), trn_data(:,结束),genOpt);为ANFIS培训设置初始FIS和验证数据。anfisOpt。InitialFIS = in_fis;anfisOpt。ValidationData = val_data;培训ANFIS系统。[~,t_err,~,~,c_err] = anfis(trn_data,anfisOpt);Trn_error (model) = min(t_err);Val_error (model) = min(c_err);模型=模型+1;结束结束结束

以递减的顺序绘制每个输入组合的训练和验证误差。

%根据训练误差重新排序。[~, b] = sort(trn_error);B = flipd (B);Trn_error = Trn_error (b);Val_error = Val_error (b);索引=索引(b,:);%绘图训练和验证错误。X = (1:anfis_n)';TMP = x(:, ones(1,3))';X = tmp(:);TMP = [zero (anfis_n,1) max(trn_error,val_error) nan*ones(anfis_n,1)]';Y = tmp(:);图绘制(x, trn_error“o”, x, val_error“- *”, X, Y,“g”)标题("相应输入的错误") ylabel (“RMSE”)传说(“培训”“确认”“位置”“东北”添加刻度和标签。标签=字符串(零(anfis_n,1));K = 1:anfis_n labels(K) = input_name(index(K,1))+& "+...input_name(指数(k, 2)) +& "+...input_name(指数(k, 3));结束Xticks (x) xticklabels(标签)xtickangle(90)

图中包含一个轴对象。标题为Error for相应输入的axis对象包含3个类型为line的对象。这些对象代表训练、验证。

算法选择输入 y k - 1 y k - 2 , u k - 3. 训练RMSE为0.0474,验证RMSE为0.0485。这些RMSE值在ARX模型和ANFIS模型的基础上得到了改善。

使用所选的输入组合计算和绘制训练和验证数据集的ANFIS预测。

为此,首先生成数据集。

[~,b] = min(trn_error);Input_index = index(b,:);Trn_data = data(1:trn_data_n,[input_index, size(data,2)]);Val_data = data(trn_data_n+1:60,[input_index, size(data,2)]);

创建和培训ANFIS。

in_fis = genfis (trn_data (: 1: end-1), trn_data(:,结束));anfisOpt = anfisOptions(“InitialFIS”in_fis,...“EpochNumber”, 1...“InitialStepSize”, 0.01,...“StepSizeDecreaseRate”, 0.5,...“StepSizeIncreaseRate”, 1.5,...“ValidationData”, val_data);[trn_out_fis, trn_error step_size、val_out_fis val_error] =...简称anfis (trn_data anfisOpt);
ANFIS信息:节点数量:34线性参数数量:32非线性参数数量:18总参数数量:50训练数据对数量:300检查数据对数量:300模糊规则数量:8开始训练ANFIS…1 0.0474113 0.0485325已达到指定的epoch号。ANFIS训练在第1阶段完成。最小训练RMSE = 0.0474113最小检验RMSE = 0.0485325

评估验证误差最小的FIS。

Y_hat = evalfis(val_out_fis,data(1:60,input_index));图subplot(2,1,1) index = 1:trn_data_n;情节(索引、数据(指数大小(数据,2)),“- - -”...指数,y_hat(指数),“。”) rmse = norm(y_hat(index)-data(index,size(data,2)))/sqrt(length(index));标题(训练数据(实),ANFIS预测(点)...+换行符+" rmse = "+ num2str(rmse))“时间步骤”) subplot(2,1,2) index = trn_data_n+1:60;情节(索引、数据(指数大小(数据,2)),“- - -”、索引y_hat(指数),“。”) rmse = norm(y_hat(index)-data(index,size(data,2)))/sqrt(length(index));标题(验证数据(实心),ANFIS预测(点)...+换行符+" rmse = "+ num2str(rmse))“时间步骤”

图中包含2个轴对象。轴对象1与标题训练数据(实),ANFIS预测(点)RMSE = 0.047411包含2个对象的类型线。轴对象2带有标题验证数据(实),ANFIS预测(点)RMSE = 0.048532包含2个类型为行的对象。

ANFIS模型的预测比ARX模型的预测更符合数据。

参考

[1] Ljung, Lennart。系统识别:用户的理论.普伦蒂斯-霍尔信息与系统科学系列。恩格尔伍德悬崖,新泽西州:Prentice-Hall, 1987。

另请参阅

||

相关的话题