估计模拟已识别模型的初始条件
当您模拟一个不是从静止开始的动态系统时,您必须初始化该模拟以匹配启动条件。例如,您可以将您的模拟响应与实测数据或先前的模拟或计算进行比较。您可能希望在稳态条件下开始模拟,或者继续前一个模拟中的模拟。
初始条件估计方法综述
系统识别工具箱™为确定要使用的初始条件(ICs)提供了多种技术。这些技巧包括:
模型识别结果
当前或过去的输入/输出数据测量
来自先前模拟的状态信息
下表总结了可用的方法以及何时使用它们。为了简洁起见,本表将术语“模拟”泛指“模拟或预测”。有关更多信息,请参见模拟和预测已识别的模型输出.
估计初始条件的方法
什么时候使用 | 方法 | 方法总结 |
---|---|---|
你在模拟一个中的难点 ,idtf ,idproc ,idpoly ,或idgrey 使用您用来标识模型的相同输入数据对响应建模。 |
从模型识别结果(返回值或估计报告)中提取ic。估计以下列形式之一返回IC信息。
看到根据实测数据估计初始条件. |
例子: |
您希望重新生成由比较 (或由模型输出在应用程序中绘图)。 |
使用从 看到根据实测数据估计初始条件. |
例子: |
您正在模拟模型对给定输入信号的响应,并希望从导致与给定输出信号最接近匹配的点开始模拟。 | 使用 使用 如果原始模型是 看到根据实测数据估计初始条件. |
例子: |
您正在继续模拟,例如在线处理。 您正在使用分割数据集,例如for nlarx 模型时findstates 在计算上太昂贵了。 |
data2state 如果原始型号是 idtf ,idproc ,或idpoly ,转换为状态空间形式首先使用中的难点 .你也可以用 data2state 隐式地通过指定您的过去数据作为初始条件的代理sim卡 或预测 任何动态模型。有关更多信息,请参见根据实测数据估计初始条件. |
sys_ss = ids(系统) x0 = data2state (sys z_p) 或 IO =结构 或opt = predictOptions ('InitialCondition',IO) .例子:一类非线性ARX模型的初始条件估计, 理解模型仿真中历史数据的使用 |
您正在处理一个持续的模拟,并希望将当前模拟段的初始条件建立在前一段的基础上。 你打算在稳定状态下开始你的主模拟,你想要有一个模拟从休息到稳定状态的过程的前传。 |
使用来自以前模拟或预模拟的状态信息。 如果原始型号是 idtf ,idproc ,或idpoly ,转换为状态空间形式首先使用中的难点 .有关更多信息,请参见从过去状态信息中使用初始条件. |
sys_ss = ids(系统) x0 = x(结束) 从(y y_sd x) = sim (sys_ss z_p) 例子:使用过去状态继续模拟已识别模型 |
至今评估技术
上表调用了初始条件估计的各种技术。下面几节根据估算数据源总结这些技术。
根据实测数据估计初始条件
从获取模拟输入的测量数据中估计初始条件。技术包括以下内容。
从模型识别结果中提取初始条件,例如从模型的识别报告中提取初始条件,或者作为返回值
比较
.X0表示初始状态向量和集成电路代表一个initialCondition
对象。有关示例,请参见解决模型识别与比较命令之间的拟合值差异,比较命令与非线性ARX模型块的匹配输出,在模拟确定的线性模型时应用初始条件.利用测量的输入/输出数据,利用函数估计初始条件
findstates
估计与数据集一致的初始状态。示例请参见利用实测数据估计线性模型初始条件.
从过去的测量数据估计初始条件
根据模拟开始前的测量数据估计初始条件。技术包括以下内容。
使用函数
data2state
来估计数据集的结束状态。过去的结束状态成为后续模拟的初始状态。示例请参见一类非线性ARX模型的初始条件估计.使用以前的数据作为初始条件的代理
sim卡
或预测
.当您运行模拟时,模型内部调用data2state
给你。示例请参见理解模型仿真中历史数据的使用.将使用的数据集分成两部分。让第一部分足够大
data2state
计算精确的结束状态。这种分割数据方法的计算强度比使用方法要小得多findstates
对完整数据集,特别是非线性ARX模型。示例请参见一类非线性ARX模型的初始条件估计.
从过去状态信息中使用初始条件
使用来自先前模拟或预模拟的状态信息。如果没有以前的模拟可用,您可以从休息或已知的初始条件到模拟开始点进行预模拟。过去模拟或预模拟的结束状态是要执行的模拟的开始状态。示例请参见使用过去状态继续模拟已识别模型.
线性模型模拟初始条件的估计
的findstates
而且data2state
函数是用于从输入/输出数据的任何测量中确定初始或结束状态的最通用工具。但是,要使用这些函数,必须有一个包含显式状态表示的模型结构。除线性模型外中的难点
而且idgrey
不要使用显式状态。为了找到等价的初始状态,您可以将这些模型转换为中的难点
模型,并从中找到初始状态中的难点
版本。作为替代方案findstates
,你也可以用比较
在不将模型转换为状态空间形式的情况下获得初始条件。对于这些模型,比较
返回一个initialCondition
对象,该对象包含关于无模型响应(以状态空间形式)和相应初始状态的信息。
在您估计初始条件之后,您可以将它们合并到您的命令行模拟语法,即您的Simulink中®模型中,或系统识别应用程序。
下面的例子说明了线性模型的初始条件估计。第一个示例使用findstates
而且比较
.第二个和第三个例子使用历史数据。也就是说,示例从模拟开始时间之前的数据确定初始条件。
利用实测数据估计线性模型初始条件
用不同的方法求得线性模型的初始条件,并对结果进行比较。
估计测量数据的传递函数。返回初始条件集成电路
.
负载iddata1z1;(sys, ic) =特遣部队(z1, 3);集成电路
ic = initialCondition属性:A: [3x3 double] X0: [3x1 double] C: [0.2303 5.9117 2.2283] Ts: 0
ic.X0
ans =3×1-1.7569 2.6195 -6.5177
sys
为连续时间识别传递函数(idtf
)模型。集成电路
是一个initialCondition
对象。一个initialCondition
对象以状态空间形式表示系统的自由响应。对象包括转换后的一个
而且C
状态空间矩阵对应于sys
和估计的初始状态向量X0
.
你也可以用findstates
寻找线性模型的初始条件,但前提是中的难点
或idgrey
的形式。
转换sys
状态方程形式。
sys_ss = ids(系统);
使用findstates
来估计初始状态。
X0 = findstates (sys_ss z1)
X0 =3×1-1.7569 2.6195 -6.5177
现在使用比较
利用原始传递函数模型估计初始状态。
[y_tf,适合,ic2] =比较(z1, sys);ic2
ic2 = initialCondition属性:A: [3x3 double] X0: [3x1 double] C: [0.2303 5.9117 2.2283] Ts: 0
ic2。X0
ans =3×1-1.7569 2.6195 -6.5177
初始状态向量在三种情况下都是相同的。
理解模型仿真中历史数据的使用
在模拟模型时,使用历史输入输出数据作为初始条件的代理。首先使用sim卡
命令并指定历史数据simOptions
选项设置。然后通过手动将历史数据映射到初始状态来再现模拟输出。
加载一个两输入一输出的数据集。
负载iddata7z7
使用这些数据确定一个五阶状态空间模型。
sys = n4sid (z7 5);
将数据集分成两部分。
咱= z7 (1:15);zB = z7(16:结束);
用输入信号对模型进行仿真zB
.
uSim = zB;
模拟需要初始条件。的信号值咱
历史数据,也就是说,它们是紧接数据之前的时间的输入和输出值吗zB
.使用咱
作为所需初始条件的代理。
IO =结构(“输入”,咱。InputData,“输出”, zA.OutputData);选择= simOptions (“InitialCondition”IO);
模拟模型。
ysim = sim (sys、uSim选择);
的初始状态手动映射历史数据,从而重新生成输出sys
.要做到这一点,请使用data2state
命令。
xf = data2state (sys,咱);
xf
的状态值sys
在时间瞬间后立即将最近的数据抽样了进去咱
.
使用以下命令模拟系统xf
作为初始状态。
opt2 = simOptions (“InitialCondition”、xf);ysim2 = sim (sys、uSim opt2);
的输出sim卡
命令ysim
以及手工计算的结果ysim
2.
情节(ysim“b”ysim2,“——r”)
ysim2
和ysim
.
使用过去状态继续模拟已识别模型
通过使用前一个仿真段的结束状态,估计已识别模型的一个仿真段的初始条件。
加载数据z1,这是一个iddata
对象,它包含输入和输出数据。根据数据估计一个五阶线性模型。
负载iddata1z1情节(z1)
sys = n4sid (z1, 5);
把数据分成两部分。一个段z1past
表示过去模拟的数据,并从静止状态开始。第二段z1next
表示后续模拟的数据。
z1past = z1 (1:15);z1next = z1 (150:300);
中的输入数据的响应z1next
不指定初始条件。
ynext_no_ic = sim (z1next sys);情节(ynext_no_ic z1next)传说标题(“不设置ic的模拟继续”)
现在确定最终状态,x0
的响应z1past
输入.
[ypast, y_sd xpast] = sim (z1past sys);x0 = xpast(最终:)”;
使用结束状态指定后续响应的初始状态z1next
.
选择= simOptions (“InitialCondition”, x0);ynext_ic = sim (sys, z1next选择);图图(ynext_ic,z1next)传说标题(“用同步ic继续模拟”)
模拟Hammerstein-Wiener和非线性灰盒模型的初始条件估计
当您在模拟Hammerstein-Wiener或非线性灰盒模型并希望使用与测量数据集一致的初始条件时z
,使用findstates
.
在Simulink中模拟Hammerstein-Wiener模型
将Hammerstein-Wiener模型块的模拟输出与系统的实测输出进行比较。通过估计初始状态值,可以改进测量响应和模拟响应之间的一致性。
加载样例数据。
负载twotankdata
创建一个iddata
对象从示例数据中获取。集“Tstart”
0,使数据开始时间与Simulink开始时间0f 0 s相匹配。
z1 = iddata (y, u, 0.2,“Tstart”0,“名字”,“两舱系统”);
使用数据估计Hammerstein-Wiener模型。
mw1 = nlhw(z1,[1 5 3], idpiecewislinear, idpiecewislinear);
的输入数据,您现在可以在Simulink中模拟估计模型的输出z1
.为此,打开一个预先配置的Simulink模型。
模型=“ex_idnlhw_block”;open_system(模型);
该模型使用Iddata Source、Hammerstein-Wiener模型和Scope块。以下块参数已预先配置,以指定估计数据、估计模型和初始条件:
Iddata源块参数:
IDDATA对象-
z1
Hammerstein-Wiener模型块参数:
模型-
mw1
初始条件-
零
(默认)
运行仿真。
通过使用Scope块查看测量输出和模型输出之间的差异。
simOut = sim(模型);open_system([模型/范围的])
为了提高测量响应与模拟响应之间的一致性,从估计数据中估计模型的初始状态向量z1
,使用findstates
.指定估计的最大迭代次数为100。将预测水平指定为正
,使算法计算出仿真误差最小的初始状态。
选择= findstatesOptions;opt.SearchOptions.MaxIterations = 100;x0 = findstates (mw1 z1,正无穷,选择);
设置初始条件块参数的值状态值
.默认的初始状态是x0
.
set_param([模型“/ Hammerstein-Wiener模型”),“集成电路”,“国家价值观”);
再次运行模拟,并在Scope块中查看测量输出和模型输出之间的差异。测量的响应和模拟的响应之间的差异现在减小了。
simOut = sim(模型);
非线性ARX模型的初始条件估计
当您在模拟一个非线性ARX模型并希望使用与测量数据集一致的初始条件时z
,你可以选择采取哪种方法。
您可以使用
findstates
.然而,对于非线性ARX模型,如果数据集很大,这种方法有计算成本高的代价。X0 = findstates (m, z,正);
您可以将数据集分成两部分。使用第一个
nx
输入/输出数据的样本作为过去的数据,其中nx
是模型中最大的回归延迟。然后使用data2state
计算“过去数据”的结束状态。然后,您就可以为剩下的部分模拟模型nx + 1:结束
用您选择的任何模拟方法输入数据。这两个比较
和系统识别app使用这种方法自动为非线性ARX模型。nx = max (getDelayInfo (m));找出最大的回归滞后past_data = z1 (1: nx);X0 = data2state (mw1 z1 (1: nx));
下面的例子说明了在一个非线性ARX模型中使用分割数据技术。
一类非线性ARX模型的初始条件估计
使用两种不同的技术来估计非线性ARX模型的初始条件。模拟每个测量数据,并与静止时初始化的模拟进行比较。
加载输入/输出数据z
和情节。的前1000点z
估计一个非线性ARX模型。
负载twotankdataz = iddata (y、u, 0.2);z1 = z (1:1000);情节(z1)标题(“估计数据”)
mdlnlarx = nlarx(z1,[5 1 3],idWaveletNetwork);
提取z1的前250点(50秒)作为z1sim
比较模拟。模拟mdlarx
在不设置初始条件的情况下,将响应与实测输出绘制在z1sim
.
z1sim = z1(摘要);data_no_ic = sim (mdlnlarx z1sim);情节(data_no_ic z1sim)标题(“无初始条件设置的非线性ARX模型”网格)在传奇(“位置”,“本身”)
使用findstates
来估计初始条件。为了使模拟误差最小化,指定正
对于预测视界。然后设置sim卡
选择InitialCondition
到findstates
结果。将响应与测量输出绘制在一起。
x0f = findstates (mdlnlarx z1sim,正无穷);选择= simOptions (“InitialCondition”, x0f);data_fs = sim (mdlnlarx z1sim,选择);图绘制(data_fs z1sim)标题(“利用findstates进行IC估计的非线性ARX模型”网格)在传奇(“位置”,“本身”)
现在,响应和测量输出的起点大致相同。
现在使用的data2states
初始条件的估计方法。首先,将数据集分成两部分。使用第一个nx
的样本z1sim
作为“过去的数据”,其中nx
是模型中最大的回归延迟。
nx = max (getDelayInfo (mdlnlarx))
nx = 5
z1past = z1sim (1: nx);z1sim2 = z1sim (nx + 1:结束);
使用data2state
计算“过去数据”的结束状态。使用从处开始的输入模拟响应z1sim (nx + 1)
.把回答和全文画在一起z1sim
测量数据,使您可以与findstates
情节。
x0d2s = data2state (mdlnlarx z1past);选择= simOptions (“InitialCondition”, x0d2s);data_d2s = sim (mdlnlarx z1sim2,选择);图绘制(data_d2s z1sim)标题(“利用data2state进行IC估计的非线性ARX模型”网格)在传奇(“位置”,“本身”)
如果您分别执行每个部分,您可能会发现data2states
方法完成的速度比findstates
方法。
现在比较所有三种初始条件的响应。
情节(data_fs data_d2s data_no_ic)标题(“比较三种集成电路方法的非线性ARX模型响应”)传说(“位置”,“本身”)
使用案例的响应findstates
而且data2state
几乎是一样的。对于初始条件未设置的情况,响应最终会收敛,但直到30秒后才会收敛。
另请参阅
比较
|compareOptions
|sim卡
|simOptions
|预测
|predictOptions
|findstates
|data2state