主要内容

lsqnonlin使用Simul金宝appink模型

这个例子展示了如何调优Simulink®模型的参数。金宝app模型,optsim,在运行此示例时包含。该模型包括一个以Simulink框图为模型的非线性工艺装置。金宝app

执行器饱和装置

该装置是一个欠阻尼的三阶模型与执行器限制。执行器的限制是饱和限制和回转速率限制。执行器饱和限制切断输入值大于2个单位或小于-2个单位。执行器的回转速率限制为0.8单位/秒。系统对阶跃输入的闭环响应如图所示闭环反应.您可以通过打开模型(类型optsim在命令行或单击模型名称),并选择运行模拟菜单。响应与范围相对应。

闭环反应

问题是设计一个反馈控制回路来跟踪系统的单位步长输入。闭环工厂是根据工厂和执行器位于分层子系统块中的块进入的。Scope块显示设计过程中的输出轨迹。

闭环模型

为了解决这个问题,尽量减小输出和输入信号之间的误差。(相反,在这个例子中在Simulink模型中使用fminimax金宝app时,解决方案涉及使输出的最大值最小化。)这些变量是比例积分导数(PID)控制器的参数。如果你只需要最小化一个时间单位的误差,你就会有一个标量目标函数。但目标是最小化从0到100的所有时间步骤的误差,从而产生一个多目标函数(每个时间步骤一个函数)。

使用lsqnonlin对输出的跟踪执行最小二乘拟合。跟踪由函数执行tracklsq,即嵌套在runtracklsq在这个例子的最后。tracklsq返回错误信号,通过调用计算的输出sim卡,减去输入信号1。

这个函数runtracklsq设置所有需要的值,然后调用lsqnonlin用目标函数tracklsq.的变量选项传递给lsqnonlin定义标准和显示特征。选项指定不显示输出,以使用“levenberg-marquardt”算法,选项给出步长和目标函数的终止公差,阶数为0.001。

在模型中运行仿真optsim,则必须指定变量KpKiKda1,a2a1a2是Plant块中的变量)。KpKi,Kd是要优化的变量。这个函数tracklsq嵌套在内部runtracklsq所以变量a1a2在两个函数之间共享。的变量a1a2初始化为runtracklsq

目标函数tracklsq运行模拟。您可以在基本工作空间或当前工作空间(即调用函数的工作空间)中运行模拟sim卡,在本例中是的工作空间tracklsq.在本例中,SrcWorkspace选项设置为“当前”告诉sim卡在当前工作空间中运行模拟。runtracklsq将模拟运行到100秒。

模拟完成后,runtracklsq创建myobj对象的当前工作空间(即tracklsq)。框图模型中的Outport块将字段的对象在模拟结束时导入当前工作空间。

当你奔跑runtracklsq,优化得到比例、积分和导数的解(KpKiKd)控制器增益。

[Kp, Ki, Kd] = runtracklsq
Kp = 3.1330
Ki = 0.1465
Kd = 14.3918

范围显示优化后的闭环阶跃响应。

之后的闭环响应lsqnonlin

请注意:呼叫sim卡结果是调用一个Simulink常微分方程(ODE)求解器。金宝app您需要选择使用哪种类型的求解器。从优化的角度来看,如果固定步长ODE求解器足以求解ODE,那么它是最好的选择。然而,在刚性系统的情况下,可能需要一种变步长ODE方法来求解ODE。

然而,由于步长控制机制,变步长求解器产生的数值解不是参数的平滑函数。这种缺乏平滑性会阻止优化例程收敛。当您使用固定步骤求解器时,缺乏平滑性不是问题。(有关进一步解释,请参见[53].)

金宝app推荐使用Simulink设计优化™软件与Simulink变步求解器一起解决多目标优化问题。该软件提供了一种特殊的数值梯度计算,与Simulink一起工作,避免了引入缺乏平滑性的问题。金宝app

Helper函数

下面的代码创建runtracklsqhelper函数。

函数[Kp,Ki,Kd] = runtracklsq% RUNTRACKLSQ演示在Simulink中使用LSQNONLIN。金宝appmdl =“optsim”;open_system (mdl)加载模型in = 金宝appSimulink.SimulationInput(mdl);创建模拟输入对象in = in. setmodelparameter (“StopTime”“100”);%停止时间100Pid0 = [0.63 0.0504 1.9688];初始增益值%A1 = 3;A2 = 43;初始化模型植物变量选项= optimoptions(@lsqnonlin,“算法”“levenberg-marquardt”...“显示”“关闭”“StepTolerance”, 0.001,“OptimalityTolerance”, 0.001);优化增益set_param (mdl“FastRestart”“上”);%快速重启Pid = lsqnonlin(@tracklsq,pid0,[],[],options);set_param (mdl“FastRestart”“关闭”);%返还收益Kp = pid(1);Ki = pid(2);Kd = pid(3);函数F = tracklsq(pid)跟踪optsim的输出到1的信号设置模拟输入对象参数in = in. setvariable (“金伯利进程”pid (1),“工作区”、mdl);in = in. setvariable (“吻”pid (2),“工作区”、mdl);in = in. setvariable (“Kd”pid (3),“工作区”、mdl);%模拟Out = sim(in);F = out.get(“你”) - 1;结束结束

版权所有The MathWorks, Inc.