Main Content

磁悬浮建模

此示例说明 NARX(具有外部输入的非线性自回归)神经网络如何对磁悬浮动态系统建模。

问题:对磁悬浮系统进行建模

在此示例中,我们尝试构建一个可以对使用控制电流悬浮的磁体的动态行为进行预测的神经网络。

该系统的特点是磁体的位置和控制电流共同决定了磁体在片刻之后的位置。

这是一个时间序列问题示例,它使用反馈时间序列的过去值(磁体位置)和外部输入序列(控制电流)来预测反馈序列的将来值。

为什么使用神经网络?

神经网络非常擅长处理时间序列问题。具有足够元素(称为神经元)的神经网络可以以任意准确度对动态系统进行建模。它们特别适合处理非线性动态问题。因此,神经网络是处理此问题的优选方案。

通过使用响应控制电流的实际悬浮磁体位置的记录来设计网络。

准备数据

通过将数据组织成两个矩阵(输入时间序列 X 和目标时间序列 T)来为神经网络设置函数拟合问题数据。

输入时间序列 X 是一个行元胞数组,其中每个元素是控制电流的相关时间步。

目标时间序列 T 也是一个行元胞数组,其中每个元素是悬浮磁体位置的相关时间步。

使用以下命令加载一个这样的数据集。

[x,t] = maglev_dataset;

我们可以查看输入 X 和目标 T 的大小。

请注意,X 和 T 都有 4001 列。这些列表示控制电流和磁体位置的 4001 个时间步。

size(x)
ans = 1×2

           1        4001

size(t)
ans = 1×2

           1        4001

使用神经网络进行时间序列建模

下一步是创建一个学习对磁体位置变化方式进行建模的神经网络。

由于神经网络以随机初始权重开始,因此该示例的结果在每次运行时都会略有不同。我们设置了随机种子来避免这种随机性。但这对于您自己的应用情形并不是必需的。

setdemorandstream(491218381)

双层(即,一个隐藏层)NARX 神经网络可以拟合任何动态输入-输出关系,前提是隐藏层中有足够的神经元。非输出层称为隐含层。

对于此示例,我们将尝试具有 10 个神经元的单隐藏层。一般情况下,问题越困难,需要的神经元和层就越多。问题越简单,需要的神经元就越少。

我们还会尝试将具有两个延迟的抽头延迟用于外部输入(控制电流)和反馈(磁体位置)。延迟越多,网络便能对越复杂的动态系统进行建模。

输入和输出的大小为 0,因为网络尚未配置成与我们的输入数据和目标数据相匹配。这将在训练网络时进行。

输出 y(t) 也是输入,其延迟版本反馈到网络中。

net = narxnet(1:2,1:2,10);
view(net)

训练网络之前,我们必须先使用外部输入和反馈时间序列的前两个时间步来填充网络的两个抽头延迟状态。

此外,我们需要将两个反馈时间序列同时用作输入时间序列和目标时间序列。

函数 PREPARETS 帮我们准备用于仿真和训练的时间序列数据。Xs 将包含要提交到网络的移位输入时间序列和目标时间序列。Xi 是初始输入延迟状态。Ai 是层延迟状态(在这种情况下为空,因为没有层到层的延迟),Ts 是移位反馈时间序列。

[Xs,Xi,Ai,Ts] = preparets(net,x,{},t);

现在网络已准备就绪,可以开始训练。时间步自动分为训练集、验证集和测试集。训练集用于对网络进行训练。只要网络针对验证集持续改进,训练就会继续。测试集提供完全独立的网络准确度测量。

神经网络训练工具显示正在接受训练的网络和用于训练该网络的算法。它还显示训练过程中的训练状态以及停止训练的条件(以绿色突出显示)。

底部的按钮用于打开有用的绘图,这些图可以在训练期间和训练后打开。算法名称和绘图按钮旁边的链接可打开有关这些主题的文档。

[net,tr] = train(net,Xs,Ts,Xi,Ai);

要查看在训练过程中网络性能的改善情况,请点击训练工具中的 Performance 按钮,或调用 PLOTPERFORM。

性能以均方误差衡量,并以对数刻度显示。随着网络训练的加深,均方误差迅速降低。

绘图会显示训练集、验证集和测试集的性能。

plotperform(tr)

测试神经网络

现在可以测量经过训练的神经网络在所有时间步的均方误差。

Y = net(Xs,Xi,Ai);

perf = mse(net,Ts,Y)
perf = 2.9245e-06

PLOTRESPONSE 将显示网络的响应与实际磁体位置的比较。如果模型准确,“+”点将跟随菱形点,底轴的误差将非常小。

plotresponse(Ts,Y)

PLOTERRCORR 显示时间 t 处的误差 e(t) 与基于不同滞后的误差 e(t+lag) 之间的相关性。中心线显示均方误差。如果网络训练良好,所有其他线将短得多,并且大多数(如果不是全部)将在红色置信界限范围内。

函数 GSUBTRACT 用于计算误差。该函数对减法进行泛化,以支持求元胞数组数据之间的差。

E = gsubtract(Ts,Y);

ploterrcorr(E)

类似地,PLOTINERRCORR 显示误差与具有不同程度滞后的输入的相关性。在这种情况下,大多数或所有线都应在置信界限范围内,包括中心线。

plotinerrcorr(Xs,E)

网络以开环形式进行训练,其中目标被用作反馈输入。也可以将网络转换为闭环形式,其中,其自身预测成为反馈输入。

net2 = closeloop(net);
view(net2)

我们可以以闭环形式仿真网络。在这种情况下,仅为网络提供初始磁体位置,然后,网络必须递归使用其自己的预测位置来预测新位置。

这会迅速导致预测响应与实际响应之间的拟合变差。即使模型非常好,也会发生这种情况。但了解它们在分离之前匹配了多少步也是很有趣的。

PREPARETS 会再次准备时间序列数据,同时会考虑更改后的网络。

[Xs,Xi,Ai,Ts] = preparets(net2,x,{},t);
Y = net2(Xs,Xi,Ai);
plotresponse(Ts,Y)

如果应用程序要求我们提前实际磁体位置一个时间步访问预测磁体位置,我们可以从网络中删除一个延迟,以便在任何给定时间 t,输出均为时间 t+1 处的位置的估计值。

net3 = removedelay(net);
view(net3)

我们再次使用 PREPARETS 准备用于仿真的时间序列。这次网络又是非常准确,因为它进行的是开环预测,但输出移位一个时间步。

[Xs,Xi,Ai,Ts] = preparets(net3,x,{},t);
Y = net3(Xs,Xi,Ai);
plotresponse(Ts,Y)

此示例说明了如何设计一个对动态磁悬浮系统的行为进行建模的神经网络。

请浏览其他示例和文档,以便更深入地了解神经网络及其应用。