Main Content

Estimate Model Parameters of a Symbolically Derived Plant Model in Simulink

这个例子用途Simulink Design Optimization™估计简单电阻电容器(RC)电路的象征性地导出的代数模型的未知电容和初始电压。该示例解决了同样的问题,并使用与其相同的实验数据估算模型参数和初始状态,但使用RC电路的封闭式解决方案而不是差别形式。

这个例子用途Symbolic Math Toolbox™ capabilities to:

You perform design optimization to estimate the capacitance and initial voltage values of the analytical RC circuit. In particular, you match the experimental output voltage values with the simulated values.

解决RC电路方程

Define and solve the following differential equation for the RC circuit.

这里,V.2(t)是电容器上的输出电压C1.v1.电阻恒压是恒定的电压R1.那andV.20.is the initial voltage across the capacitor. UsedsolveT.o solve the equation.

Syms.C1.R1.v1.V.20.realSyms.V.2(t)deq = (v1 - v2)/R1 - C1*diff(v2,t); v2sol = dsolve(deq, v2(0) == v20)
V.2sol =

V. 1 - E. - T. C 1 R. 1 V. 1 - V. 20. v1 - exp(( - t /(c1 * r1)))*(v1 - v20)

Usesubs评估的解决方案R1.V.alue of 10 kOhm andv1.V.alue of 5 V.

V2SOL = VPA(液移(V2SOL,[R1,V1],[10e3,5])))
V.2sol =

E. - 0.0001 T. C 1 V. 20. - 5.0 + 5.0 E.xp((-(vpa('0.0001')*t)/C1))*(v20 - vpa('5.0')) + vpa('5.0')

使用表示RC电路的块创建模型

First, create a new Simulink model.

myModel ='rcsymbolic';new_system(myModel); load_system(myModel);

Usematlabfunclectionblock.T.o convert the symbolic result for the output voltage to a Simulink block representing the RC plant model.matlabfunclectionblock.adds this new block to the model.

blockName ='closedFormRC_block';rcBlock = strcat(myModel,'/'那blockName); myVars = [C1,v20,t]; matlabFunctionBlock(rcBlock,v2sol,......'vars'那myVars,......'functionName''myRC'......'outputs'那{'v2'});

添加更多块

添加和安排具有相对于RC块的位置和尺寸的其他块。

rcBlockPosition = get_param(rcBlock,'position');rcblockwidth = rcblockposition(3)-rcblockposition(1);rcblockheight = rcblockposition(4)-rcblockposition(2);constantblock ='内置/常数';TimeBlock =.'金宝appSimulink / Sources / RAMP';outputBlock ='built-in/Outport';

C1.andV.20.是估计的参数。首先,使用460的初始值介绍并初始化这些参数。 μ F and 1 V, respectively. Then create constant blocks for both parameters.

c1val = 460e-6;v20val = 1.0;posx = rcblockposition(1)-rcblockwidth * 2;posy = rcblockposition(2)-rcblockheight * 3/4;pos = [posx,posy,posx + rcblockwidth / 2,posy + rcblockheight / 2];add_block(contactblock,strcat(mymodel,'/C1')那'值''C1val'......'Position',pos);pos = pos + [0 rcblockheight 0 rcblockheight];add_block(contactblock,strcat(mymodel,'/v20')那'值''v20val'......'Position',pos);

Add a ramp for time.

pos = pos + [0 rcblockheight 0 rcblockheight];add_block(timeblock,strcat(mymodel,'/t')那'坡''1''Position',pos);

Add an output port.

pos = [rcblockposition(1)+ 2 * rcblockwidth,......rcblockposition(2)+ rcblockheight / 4,......rcBlockPosition(1)+2*rcBlockWidth+rcBlockWidth/2,......rcblockposition(2)+ rcblockheight / 4 + rcblockheight / 2];add_block(OutputBlock,Strcat(MyModel,'/v2')那'Port''1''Position',pos);

Now, wire blocks in the model. The model is ready for Simulink Design Optimization.

myAddLine = @(k) add_line(myModel,......Strcat(Char(MyVars(k)),'/1')那......strcat(blockName,'/'那num2str(k)),......'autorouting''上');Arrayfun(Myaddline,(1:Numel(MyVars))));add_line(mymodel,strcat(blockname,'/1')那'v2/1''autorouting''上');Open_System(MyModel);

Estimate Parameters

Get the measured data.

加载sdoRCCircuit_ExperimentData

The variablesT.imeanddata已加载到工作区中。data是时间的电容电压T.ime

创建一个sdo.Experimentobject to store the experimental voltage data.

Exp = sdo.Experiment(myModel);

创建一个物体以存储测量的电容电压输出。

Voltage = Simulink.SimulationData.Signal; Voltage.Name ='Voltage';电压.BlockPath = rcblock;电压.PortType =.'外港';Voltage.PortIndex = 1; Voltage.Values = timeseries(data,time);

将测量的电容数据添加到实验中作为预期输出数据。

Exp.Outputdata =电压;

得到的参数。Set a minimum value forC1.。请注意,您已经指定了最初的猜测。

c1param = sdo.getparameterfrommodel(mymodel,'C1val');c1param.Minimum = 0; v20param = sdo.getParameterFromModel(myModel,'v20val');

定义目标函数以进行估计。代码sdorcsymbolic_objective.在该示例中使用在示例末尾的帮助函数部分中给出。

estfcn = @(v)sdorcsymbolic_objective(v,exp,mymodel);

Collect the model parameters to be estimated.

v = [C1PARAM; V20PARAM];

因为该模型完全是代数,所以关闭警告消息,指示您选择离散求解器。

set_param(mymodel,'solverprmcheckmsg''没有');

估计参数。

opt = sdo.OptimizeOptions; opt.Method ='lsqnonlin';V.Opt = sdo.optimize(estFcn,v,opt);
优化开始于03-OCT-2020 19:32:14一阶磨练F(x)梯级最优态0 5 27.7093 1.919 2.94 2 15 1.53851 0.3832 0.523 3 20 1.35137 0.3347 0.505 4 25 1.34473 0.013740.00842 5 30 1.34472 0.002686 0.00141局部最低。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。

Show the estimated values.

fprintf('C1 =%e v20 =%e \ n'那V.Opt(1).Value, vOpt(2).Value);
C1.= 2.261442e-04 v20 = 2.359446e+00

Compare Simulated and Experimental Data

Update the experiment with the estimated capacitance and capacitor initial voltage values.

Exp = setEstimatedValues(Exp,vOpt);

Simulate the model with the estimated parameter values and compare the simulated output with the experimental data.

模拟器= CreateSimulator(Exp);Simulator = SIM(模拟器);simlog = find(simulator.loggeddata,get_param(mymodel,'SignalLoggingName'));Voltage = find(SimLog,'Voltage');plot(time,data,'ro',电压。values.time,clift.values.data,'B')T.itle('模拟和测量响应')传奇('测量电压''Simulated Voltage''Location''最好'

close_system(myModel,0);

Helper Functions

functionV.als = sdoRCSymbolic_Objective(v,Exp,myModel) r = sdo.requirements.SignalTracking; r.Type ='==';r.Method ='Residuals';r.normalize ='off';exp = setestimatedValues(exp,v);模拟器= CreateSimulator(Exp);Simulator = SIM(模拟器);simlog = find(simulator.loggeddata,get_param(mymodel,'SignalLoggingName'));Voltage = find(SimLog,'Voltage');uchignerRor =评估(R,电压.Values,Exp.Outputdata(1).values);vals.f = viectionError(:);结束