主要内容

本页采用了机器翻译。点击此处可查看英文原文。

火花塞发动机扭矩动力学的神经状态空间模型

此示例使用神经状态空间模型描述了火花点火 (SI) 发动机的非线性扭矩动力学的降阶建模 (ROM)。所确定的模型可用于硬件在环 (HIL) 测试、动力系统控制、诊断和训练算法设计。例如,您可以使用该模型进行后处理控制和诊断算法开发。有关神经状态空间模型的详细信息,请参阅神经状态空间模型

您可以使用系统输入和输出的测量来辨识模型。这些数据可以来自对真实发动机或高保真模型的测量,例如使用 Powertrain Blockset™ SI 参考应用程序创建的模型。

nlss_SI_engine.png

数据准备

加载并显示发动机数据时间表。

load SIEngineData IOData
stackedplot(IOData)
title('SI Engine Signals')

Figure contains an object of type stackedplot. The chart of type stackedplot has title SI Engine Signals.

该时间表包含以 10 Hz 测量的五个变量的十万多个观测值。

  • 节气门位置(度)

  • 废气旁通阀面积(开度百分比)

  • 发动机转速 (RPM)

  • 点火正时(度)

  • 发动机扭矩 (N m)

对数据进行归一化。

IODataN = normalize(IOData);

将数据分为估计(前 60000 个数据点)和验证(剩余数据点)部分。

eData = IODataN(1:6e4,:);     % portion used for estimation
vData = IODataN(6e4+1:end,:); % portion used for validation

将训练数据下采样 10 倍。这有助于加快模型训练过程,并将拟合的重点限制在较低的频率区域。

% Downsample datasets 10 times
eDataD = idresamp(eData,[1 10]); 
vDataD = idresamp(vData,[1 10]);
eDataD.Properties.TimeStep
ans = duration
   1 sec

height(eDataD)
ans = 
6000

模型训练目标是生成一个以发动机扭矩为输出,其他四个变量为输入的动态系统。

神经状态空间模型辨识

关于神经状态空间模型

神经状态空间模型是一种非线性状态空间模型,其中状态转换和测量函数使用神经网络建模。在 System Identification Toolbox™ 中,它们由 idNeuralStateSpace 对象表示。非线性状态空间模型具有以下形式:

x˙=f(x,u,t,θ1)y=g(x,u,t,θ2)

这里 x(t) 是状态变量,u(t) 是输入,y(t) 是输出。通常,没有明确的时间依赖性,因此方程可以简化为:

x˙=f(x,u,θ1)y=g(x,u,θ2)

此外,如果没有外生输入,方程进一步简化为:

x˙=f(x,θ1)y=g(x,θ2)

这里,f()g() 是多层前馈网络,通常由 Deep Network Toolbox™ 的 dlnetwork 对象描述。θ1θ2 是可辨识参数,由与这些网络的每一层相关的权重和偏置组成。nlssest 命令可用于训练 f()g() 网络(即估计参数 θ1θ2 的值)。训练需要直接测量模型的状态。因此,一部分输出是状态变量,函数 g() 是前 nx 个输出的恒等函数,其中 nx:=dim(x)

模型训练

训练神经状态空间模型需要通过设置输入/输出和状态维度以及网络 f()g() 的类型来配置模型结构。在此示例中,您将训练具有四个输入的单状态 (nx=1) 模型。状态变量是发动机扭矩。它是直接测量的,因此也被视为模型输出。因此,该模型有一个输出 (y(t)=x(t))。

首先从 eData 时间表中的变量列表中指定输入和输出信号。

Inputs = ["ThrottlePosition","WastegateValve","EngineSpeed","SparkTiming"];
Output = "EngineTorque";

使用 idNeuralStateSpace 构造函数创建神经状态空间模型。

rng("default");
% Define a neural state-space model
nx = 1; % number of states = number of outputs
nssModel = idNeuralStateSpace(nx,NumInputs=4); 
nssModel.InputName = Inputs;
nssModel.OutputName = Output;

% Configure the state network f()
nssModel.StateNetwork = createMLPNetwork(nssModel,"state", ...
    LayerSizes=[128 128], ...
    WeightsInitializer="glorot", ...
    BiasInitializer="zeros", ...
    Activations='tanh')
nssModel =

Continuous-time Neural ODE in 1 variables
     dx/dt = f(x(t),u(t))
      y(t) = x(t) + e(t)
 
f(.) network:
  Deep network with 2 fully connected, hidden layers
  Activation function: tanh
 
Variables: x1
 
Status:                                                         
Created by direct construction or transformation. Not estimated.

使用nssTrainingOptions指定训练选项。将训练求解器指定为 'adam'。使用相应的属性设置训练 epoch 的最大数量、学习率以及数据插值方法。要创建多个用于训练的数据试验,请使用 WindowSizeOverlap 属性将数据集 eDataD 划分为相互重叠的片段。通过将数据分割成多个片段,您实际上将预测时限从原始数据的长度缩短到了各个片段的长度。要启用小批量学习,请将 NumWindowFraction 设置为 0.16。在每次迭代中,软件会随机选取 16% 的数据作为一批,并更新网络参数。这有助于避开局部极小值,并得出普适性结论。

StateOpt = nssTrainingOptions('adam');
StateOpt.MaxEpochs = 90;
StateOpt.LearnRate = 0.005;
StateOpt.InputInterSample = 'pchip';
StateOpt.WindowSize = 20;
StateOpt.Overlap = 19;
StateOpt.NumWindowFraction = 0.16;

通过提供训练数据试验 (nssModel) 和训练选项 (nlssest),使用 Expts 命令更新神经状态空间模型 StateOpt 的可学习参数。请注意,测量函数 g(x,u,θ2)=x(t) 不包含任何可学习的参数。

UseTrainedModel = true;
if UseTrainedModel
    load modelB.mat nssModel
    nssModel
else
    % Train the neural state-space model
    nssModel = nlssest(eDataD,nssModel,StateOpt) %#ok<UNRCH>
end
nssModel =

Continuous-time Neural ODE in 1 variables
     dx/dt = f(x(t),u(t))
      y(t) = x(t) + e(t)
 
f(.) network:
  Deep network with 2 fully connected, hidden layers
  Activation function: tanh
 
Variables: x1
 
Status:                                              
Estimated using NLSSEST on time domain data "eDataD".
Fit to estimation data: 90.15%                       
MSE: 0.009031

结果验证

运行比较命令,将模型的仿真响应与估计数据集 (eDataD) 和验证数据集 (vDataD) 进行比较。请注意,虽然该模型是在 20 个采样长的片段上进行训练的(有效地将预测范围缩小到 20),但它可以通过运行完整的仿真(范围约为 6000)进行验证。

clf
subplot(211)
compare(eDataD,nssModel)  % compare against estimation data
title('Neural State-Space Model: Comparison to Estimation Data')
subplot(212)
compare(vDataD,nssModel)  % compare against validation data
title('Comparison to Validation Data (Downsampled)')

MATLAB figure

请注意,已经在下采样数据集上进行了训练和验证。您还可以使用原始采样时间为 0.1 秒的数据集来验证质量。这可以通过再次使用比较命令来完成,如下所示:

clf
compare(vData,nssModel)  % compare against original validation data (sample rate of 10 Hz)
title('Comparison to Original Validation Data (10 Hz)')

MATLAB figure

之所以能够进行比较,是因为模型 nssModel 是一个连续时间模型,可以与任何采样率的参考数据集进行比较。验证图显示辨识模型的质量良好。

您还可以使用 MATLAB® 中的 sim 命令进行纯仿真,或使用专用 Neural SS Model 模块将其放入 Simulink® 模型中来验证模型质量。

% Create an iddata representation of the data in vData to feed the signals to the Simulink
% model using an IDDATA Source block.
zsim = iddata(vData,InputName=Inputs,OutputName=Output);
zsim.Tstart = 0;

% Open the simulation model and simulate it using zsim as the source of input data. 
mdl = 'nlss_simulator';
tstop = zsim.SamplingInstants(end);
Ts = zsim.Ts;
open_system(mdl)

sim(mdl);

另请参阅

对象

函数

模块

主题