主要内容

信号传输系统:C MEX-File建模使用可选的输入参数

这个例子展示了如何为IDNLGREY模型提供可选的输入参数。的讨论集中于如何做到这一点对于C-MEX类型的模型文件,但在一些小的程度上我们还将MATLAB建模文件地址最相关的相似之处。

依据我们的讨论将信号传输系统(电报线)示意图描述如下图所示。

图1:信号传输系统的示意图。

信号传输建模

在远处x(从输入电压)计算的电报线流在时间t当前我(t, x)相应的电压u (t, x)和电流和电压之间的关系可以被描述为两个耦合的偏微分方程(pde):

$ $ - \压裂{\偏u (t, x)} {x} \部分= L \压裂{\部分我(t, x)}{\部分t} $ $

$ $ - \压裂{\部分我(t, x)} {x} \部分= C \压裂{\偏u (t, x)}{\部分t} $ $

上面的方程通常被称为(的一个变体)所谓的“电报方程”,与L和C单位长度电感和电容,分别。

电报方程可以用一个常微分方程组近似只考虑到电流和电压在离散距离点0,h, 2 h,…Nh, h是离散化的距离和N总数的距离。这个近似后,线可以被认为是由许多结构相同的链段彼此连接。在文献中这种类型的近似通常称为聚合。

让距离x = kh的电压和电流,k = 0, 1,…在时间t、N、用u_k (t)和i_k (t)。近似d / dx u (t, x)和d / dx我(t, x)通过以下简单的差分近似:

d u (t, x) u_ {k + 1} (t) - u_k (t) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -提出近似。dx h
我(t, x) i_k d (t)——i_ {k - 1} (t) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -向后近似。dx h

x = kh。

的原因使用向前逼近d / dx u (t, x)是i_N (t) = 0(明线),这样剩下的N离散电流可以通过以下建模微分方程:

d i_k (t) 1 - - - - - - - = - - (u_ {k + 1} (t) - u_k (t) k = 0, 1, 2,…,n - 1 dt Lh

同样,作为u_0 (t)是一个已知的输入信号,不需要微分方程来描述,方便使用落后的近似方案模型d / dx我在点(t, x) h, 2 h,…N:

d u_k (t) 1 - - - - - - - = - - (i_k (t) - i_ {k - 1} (t) k = 1, 2,…,n - 1 dt Ch
d u_N (t) 1 1 - - - - - - - - - - = -——(i_N (t) - i_ {n} (t) =——i_ {n} (t) dt Ch Ch

这个我们已经到达模型近似如图1所示,在方程已经表达了许多相互连接的线圈和电容器。

现在让我们介绍2 * N州x1 (t) = i_0 (t) x2 (t) = u_1 (t) x3 (t) = i_1 (t) x4 (t) = u_2 (t)……x2N-1 (t) = i_ {n} (t) x2N (t) = u_N (t)。此外,表示输入u (t) = u_0 (t),让输出电压的线,即。y (t) = x2N (t) = u_N (t)。明显的替换最后导致下面的状态空间模型的结构。

x1 (t) = 1 / (Lh) * (x2 (t) - u (t)) x2 (t) = 1 / (Ch) * (x3 (t) - x1 (t)) x3 (t) = 1 / (Lh) * (x4 (t) - x2 (t)) x4 (t) = 1 / (Ch) * (x5 (t) - x3 (t))…x2N-1 (t) = 1 / (Lh) * (x2N (t) - x2N-2 (t) x2N (t) = 1 / (Ch) * x2N-1 (t)
y (t) = x2N (t)

总之,上面的数学操作了我们一个标准的线性状态空间模型结构,可以由IDGREY很好——IDNLGREY的线性对应。我们将不会执行任何IDGREY建模,而是显示可选的输入参数可能被IDNLGREY用来增强其建模的灵活性。

IDNLGREY信号传输模型对象

获得灵活性在这里需要有一个IDNLGREY模型对象,能够立即处理线的长度l .建模质量的目的,还应该简单改变聚合块N可以获得这样一个足够好的系统近似。这些需求可以通过传递的N和L FileArgument IDNLGREY对象的属性。FileArgument属性必须是一个单元阵列,但这个数组可以保存任何类型的数据。在这个应用程序中,我们选择提供N和L的结构,和电线的长度1000米,我们将尝试三个不同的N值:10、30和100年。以下三个FileArguments随后将使用在执行IDNLGREY建模:

FileArgument10 ={结构(“N”10“L”,1000)};% N = 10 - - > 20个州。FileArgument30 ={结构(“N”30岁的“L”,1000)};% N = 30 - - > 60。FileArgument100 ={结构(“N”,100,“L”,1000)};% N = 100 - > 200。

FileArgument中包含的数据的解析和检查必须进行IDNLGREY模型文件,它的模型文件设计师来实现这个功能。为了获得h和N的函数没有任何错误检查可以使用以下命令:

N =变长度输入宗量{1}{1}.;h =变长度输入宗量{1}{1}.L / N;

注意,这里FileArgument对应变长度输入宗量{1},这是最后一个参数传递给模型文件。文件signaltransmission_m。实现了信号传输模型。signaltransmission_m类型”类型。m”查看整个文件。

所涉及的情况更当使用C-MEX模型文件作为将进一步完成。在这种情况下我们事先不知道州Nx的数量,但它计算在主界面功能,因此可以作为输入参数传递compute_dx compute_y。这些函数的声明:

无效compute_dx(双* dx, int nx、双* x,双* u,双* * p,常量mxArray* auxvar)无效compute_y(双* y, int nx、双* x)

我们已取走了t变量(不用于方程),而是包括整数nx这些函数作为第二个参数。此外,我们也删除的标准落后于三个参数compute_y这些不是用于计算输出。这些变化,compute_dx和compute_y称为从主界面功能如下。

/ *调用函数导数状态更新。* / compute_dx (dx, nx x, u, p, auxvar);
/ *调用函数输出更新。* / compute_y (y nx x);

的第一部分compute_dx如下所示。(“signaltransmission_c类型。c”在MATLAB®命令窗口中显示整个文件)。

/ *状态方程。* /空白compute_dx(双* dx, int nx、双* x,双* u,双* * p, const mxArray * auxvar){/ *模型参数和中间变量的声明。* /双* L * C;/ *模型参数。* /双h, Lh, Ch;/ / *中间变量参数。* / int j;/ *方程计数器。* /
/ *获取模型参数。* / L = p [0];/ *每单位长度电感。* / C = p [1];/ *每单位长度电容。* /
/ *获取并检查FileArgument (auxvar)。* /如果(mxGetNumberOfElements (auxvar) < 1) {mexErrMsgIdAndTxt (“IDNLGREY: ODE_FILE: InvalidFileArgument”、“FileArgument应该至少有一个元素。”);}else if (mxIsStruct (mxGetCell (auxvar, 0)) = = false) {mexErrMsgIdAndTxt (“IDNLGREY: ODE_FILE: InvalidFileArgument”、“FileArgument应该包含结构。”);}else if ((mxGetFieldNumber (mxGetCell (auxvar, 0),“N”) < 0) | | (mxGetFieldNumber (mxGetCell (auxvar, 0)、“L”) < 0)) {mexErrMsgIdAndTxt (“IDNLGREY: ODE_FILE: InvalidFileArgument”、“FileArgument应该包含一个结构字段' N '和‘L’。”);}{/ *跳过其他进一步的错误检查获得执行速度。* / h = * mxGetPr (mxGetFieldByNumber (mxGetCell auxvar, 0, 0, mxGetFieldNumber (mxGetCell (auxvar, 0)、“L”))) /(0.5 *((双)nx));}Lh = -1.0 / (L [0] * h);Ch = -1.0 / (C [0] * h);…

值得强调的是,FileArgument传递给变量auxvar compute_dx。在声明和检索模型参数(也宣布中间变量,像h, auxvar检查的一致性通过外部接口的例程(所谓mx-routines)。这些MATLAB程序允许您创建、访问操作和破坏mxArray变量。查阅MATLAB文档外部接口的更多信息。最后执行else子句如果所有检查都通过,在这种情况下auxvar字段的值N的值用于确定h。它和模型参数L和C最终用于计算所需的参数数量Lh = 1 / (L * h)和Ch = 1 / (C * h)。看到“教程在非线性灰色框模型标识:创建IDNLGREY模型文件“关于FileArgument的免费信息。

Lh和Ch计算,第二部分compute_dx如下。特别注意如何使用nx compute_dx for循环的定义的状态数的模型。

…/ * x[0]:当前i_0 (t)。* / / * x[1]:电压u_1 (t)。* / / * x[2]:当前i_1 (t)。* / / * x[3]:电压u_1 (t)。* / / *……* / / * x [Nx-2]:当前i_Nx-1 (t)。* / / * x [Nx-1]:电压u_Nx (t)。* / (j = 0;j < nx; j = j+2) { if (j == 0) { /* First transmitter section. */ dx[j] = Lh*(x[j+1]-u[0]); dx[j+1] = Ch*(x[j+2]-x[j]); } else if (j < nx-3) { /* Intermediate transmitter sections. */ dx[j] = Lh*(x[j+1]-x[j-1]); dx[j+1] = Ch*(x[j+2]-x[j]); } else { /* Last transmitter section. */ dx[j] = Lh*(x[j+1]-x[j-1]); dx[j+1] = -Ch*x[j]; } } }

输出更新函数compute_dy比国家更简单更新功能:

/ *输出方程。* /空白compute_y(双* y, int nx、双* x) {/ * y[0]:电压的发射机。* x / y [0] = [nx-1];}

我们现在在一个位置我们直接可以进入以上资料分成三个不同的IDNLGREY对象,一个用于N = 10,一个用于N = 30,另一个用于N = 100。注意,在创建这些模型的差异订单,初始状态向量和使用可选的输入参数,但这是它。

文件名=“signaltransmission_c”;%文件描述模型结构。参数=结构(“名字”,{单位长度电感的%初始参数。“单位长度电容”},“单位”,{“H / m”“F / m”},“价值”{0.99 e - 3 0.99 e - 3},“最低”,{eps(0)每股收益(0)},% L, C > 0 !“最大”{正正无穷},“固定”,{假假});% a信号传输模型与N = 10;Order10 = [1 1 2 * FileArgument10 {1} . ncn];%模型[纽约νnx]命令。InitialStates10 = 0 (2 * FileArgument10 {1}。N, 1);%初始point。nlgr10 = idnlgrey(文件名,Order10、参数InitialStates10 0“FileArgument”FileArgument10,“名字”,“十块”,“TimeUnit”,“年代”);% b信号传输模型与N = 30;Order30 = [1 1 2 * FileArgument30 {1} . ncn];%模型[纽约νnx]命令。InitialStates30 = 0 (2 * FileArgument30 {1}。N, 1);% point状态的初始值。nlgr30 = idnlgrey(文件名,Order30、参数InitialStates30 0“FileArgument”FileArgument30,“名字”,“30块”,“TimeUnit”,“年代”);% c信号传输模型与N = 100;Order100 = [1 1 2 * FileArgument100 {1} . ncn];%模型[纽约νnx]命令。InitialStates100 = 0 (2 * FileArgument100 {1}。N, 1);% point状态的初始值。nlgr100 = idnlgrey(文件名,Order100、参数InitialStates100 0“FileArgument”FileArgument100,“名字”,“100块”,“TimeUnit”,“年代”);

三种信号传输模型的名称和单位也设置,因此模型是文本的大小确认。输入线和输出的电压是电压的电线。

集(nlgr10,“InputName”,“文”,“InputUnit”,“V”,“OutputName”,输出电压的,“OutputUnit”,“V”);集(nlgr30,“InputName”nlgr10.InputName,“InputUnit”nlgr10.InputUnit,“OutputName”nlgr10.OutputName,“OutputUnit”,nlgr10.OutputUnit);集(nlgr100,“InputName”nlgr10.InputName,“InputUnit”nlgr10.InputUnit,“OutputName”nlgr10.OutputName,“OutputUnit”,nlgr10.OutputUnit);nlgr10 nlgr30 nlgr100
nlgr10 =连续时间非线性灰色矩形模型定义为“signaltransmission_c”(MEX-file): dx / dt = F (t, u (t) x (t) p1, p2, FileArgument) y (t) = H (t, u (t) x (t) p1, p2, FileArgument) + e (t)与1输入(s), 20 (s), 1个输出(s),和2自由参数(s)(2)。名称:10块状态:由直接建设或转换。不估计。nlgr30 =连续时间非线性灰色矩形模型定义为“signaltransmission_c”(MEX-file): dx / dt = F (t, u (t) x (t) p1, p2, FileArgument) y (t) = H (t, u (t) x (t) p1, p2, FileArgument) + e (t)与1输入(s), 60个国家(s), 1个输出(s),和2自由参数(s)(2)。名称:30块状态:由直接建设或转换。不估计。nlgr100 =连续时间非线性灰色矩形模型定义为“signaltransmission_c”(MEX-file): dx / dt = F (t, u (t) x (t) p1, p2, FileArgument) y (t) = H (t, u (t) x (t) p1, p2, FileArgument) + e (t)与1输入(s)、200 (s), 1个输出(s),和2自由参数(s)(2)。名字:100块状态:由直接建设或转换。不估计。

输入输出数据

是模拟的输入-输出数据信号传输导线的长度1000米。这个数据是模拟使用上面的聚合模型结构,但更大的N(1500)采用。仿真是在20秒,使用0.1秒的采样率。使用的模型参数L = C = 1 e - 3,起点是零线电压(初始状态都是零)。模型参数都公认远远高于对一个典型信号传输导线,但如此选择更好的说明这种类型的系统涉及的运输延迟。我们这些数据并把它加载到一个IDDATA对象z:

负载(fullfile (matlabroot“工具箱”,“识别”,“iddemos”,“数据”,“signaltransmissiondata”));z = iddata(输出电压,vin, 0.1,“名字”,信号传输的,“InputName”,“文”,“InputUnit”,“V”,“OutputName”,输出电压的,“OutputUnit”,“V”,“Tstart”0,“TimeUnit”,“年代”);

阴谋的输入-输出数据清楚地揭示传输延迟应用电压到输出电压的电线。第一个输入电压脉冲在1.4秒左右出现在大约一秒之后的输出。

图(“名字”,(z.Name:输入输出数据的]);情节(z);

图2:输入-输出数据信号传输系统。

初始信号传输模型的性能

这三个初始模型的执行程度如何?让我们调查这个进行模型模拟使用进行比较。从执行的角度来看,它是至关重要的,初始状态估计,因此零初始状态向量的选择。的状态数的原因是非常高,特别是对于nlgr100(= 200),初始状态向量的估计真的会导致冗长的计算。

比较(z, nlgr100 nlgr30、nlgr10 compareOptions (“InitialCondition”,“零”));

图3:比较真实的输出和模拟输出三个初始信号传输模型。

在健康方面,有三个模型之间的显著差异,正如预期的那样,最复杂的模型优于其他两个。建模能力的差异可能是最被看每个模型的预测误差。

peOpt = peOptions (“InitialCondition”,“零”);e = {pe (z, nlgr100 peOpt) pe (z, nlgr30 peOpt) pe (z, nlgr10 peOpt)};figtitle = {“nlgr100: e@”“nlgr30: e@”“nlgr10: e@”};图(“名字”,(z.Name:预测错误的]);i = 1:3次要情节(3 1我);情节(e{我}。SamplingInstants e{我}.OutputData,“r”);标题([“初始”figtitle{我}z.OutputName {1}));轴(“紧”);结束

图4:预测错误获得三个初始IDNLGREY信号传输模型。

参数估计

虽然我们在这里开始几乎正确的真正系统的参数值,这并不一定意味着这些值的生产最好的模型。让我们调查这两模型参数估计的使用NLGREYEST三种信号传输模型。这些计算可能需要一些时间。

选择= nlgreyestOptions (“显示”,“上”,“EstimateCovariance”、假);nlgr100 = nlgreyest (z, nlgr100,选择);nlgr30 = nlgreyest (z, nlgr30,选择);nlgr10 = nlgreyest (z, nlgr10,选择);

估计信号传输模型的性能

最后预测误差(消防工程)标准应用于估计模型继续表明,最复杂的模型优越:

消防工程(nlgr100 nlgr30 nlgr10)
0.5307 0.6771 4.7749

估计的参数值不改变初始值相比。下面,我们可以看到一个有趣的一点是,至少涉及两个模型的参数值实际上进一步远离真正的参数值,而最复杂的模型的产生相反的效果。有几个原因为什么这可能发生,例如,太粗的聚合或最小化过程最终参数值对应于一个局部最小值。

disp (“真正nlgr100 nlgr30 nlgr10”);ptrue = [1 e - 3;1 e - 3);流(' % 1.7 f % 1.7 f % 1.7 f % 1.7 f \ n ',[ptrue ';getpvec (nlgr100)”;getpvec (nlgr30)”;getpvec (nlgr10) '));
真正nlgr100 nlgr30 nlgr10 0.0010000 0.0009949 0.0009759 0.0009879 0.0010000 0.0009949 0.0009759 0.0009879

接下来,我们又利用比较执行模拟三种估计信号传输模型。

图比较(z, nlgr100, nlgr30、nlgr10 compareOptions (“InitialCondition”,“零”));

图5:比较真实的输出和模拟输出的三个估计信号传输模型。

在所有三个案例中我们得到一个稍微改善健康。虽然小,但可以被改进比较后获得的预测误差和参数估计。

peOpt = peOptions (“InitialCondition”,“零”);e = {pe (z, nlgr100 peOpt) pe (z, nlgr30 peOpt) pe (z, nlgr10 peOpt)};figtitle = {“nlgr100: e@”“nlgr30: e@”“nlgr10: e@”};图(“名字”,(z.Name:预测错误的]);i = 1:3次要情节(3 1我);情节(e{我}。SamplingInstants e{我}.OutputData,“r”);标题([“估计”figtitle{我}z.OutputName {1}));轴(“紧”);结束

图6:预测错误获得三个估计IDNLGREY信号传输模型。

我们结束本教程看估计信号传输的单位阶跃响应模型。可以看到,所有这些模型似乎能够拿起传输延迟。然而,这些线性模型的极点都位于虚轴,即。在稳定边界。众所周知,模拟的模型是一个精致的执行,可能导致振荡一步反应的这个图所示。

这里的主要问题是,这种变体的电报方程模型没有任何损失;这种效应可以包括通过添加“电阻”(与线圈系列)和“导电阻”(并联电容器)每个Lh-Ch图1的子块。,该模型将变得更加“稳定”和模拟“容易”。

图(“名字”,(z.Name:一步反应的]);步骤(nlgr100、nlgr30 nlgr10);网格;传奇(“nlgr100”,“nlgr30”,“nlgr10”,“位置”,“西北”);

图7:一步反应的三个估计IDNLGREY信号传输模型。

结论

本教程首先解决如何使用可选的输入文件参数时IDNLGREY建模。我们专注于C-MEX类型的建模,但与MATLAB文件显示如何做到这一点。对于某些类型的系统,它是有益的(模型重用)设计一个模型文件,比正常情况下更多的灵活性,例如,使用的状态数。本教程中的信号传输系统治疗这类就是一个例子。