主要内容

lsqnonlin使用Simul金宝appink®模型

这个例子展示了如何调优Simulink模型的参数。金宝app模型,optsim,包括在优化/演示您的MATLAB®安装的文件夹。该模型包括一个以Simulink框图为模型的非线性过程工厂。金宝app

植物饱和子饱和度

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

闭环反应

问题是设计一个反馈控制回路来跟踪系统的单位阶跃输入。闭环装置是根据装置和执行器位于分级子系统中的块进入的。在设计过程中,Scope块显示输出轨迹。

闭环模型

要解决此问题,请尽量减少输出和输入信号之间的误差。(相比之下,在示例中使用Simulink®模型使用fminima金宝appx,解决方案涉及最小化输出的最大值。)变量是比例积分衍生物(PID)控制器的参数。如果您只需要在一个时间单位最小化错误,则您将具有标量目标函数。但目标是最小化0到100的所有时间步长的误差,从而产生多目标函数(每次步骤的一个功能)。

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

功能runtracklsq设置所有必需的值,然后调用lsqnonlin用目标函数tracklsq..的变量选项传递给lsqnonlin定义标准和显示特征。选项指定没有显示输出,要使用“levenberg-marquardt”算法,并且选项为阶梯和目标函数提供大约0.001的终止公差。

在模型中运行模拟optsim,则必须指定变量kp.ki.kd.A1, 和a2A1a2是植物块中的变量)。kp.ki., 和kd.是要优化的变量。功能tracklsq.内嵌套runtracklsq这样变量A1a2在这两种功能之间共享。的变量A1a2被初始化runtracklsq

目标函数tracklsq.仿真运行。您可以在基本工作空间或当前工作空间(即函数调用的工作空间)中运行模拟sim卡,在本例中是的工作空间tracklsq..在这个例子中,srcworkspace.选项设置为'当前的'告诉sim卡在当前工作区中运行模拟。runtracklsq将模拟运行100秒。

模拟完成后,runtracklsq创建myobj.对象的当前工作空间(即tracklsq.)。框图模型中的出口块放置了对象的字段在模拟结束时进入当前工作空间。

当你运行时runtracklsq,最优化给出比例、积分和导数的解(kp.ki.kd.)控制器增益。

[kp,ki,kd] = runtracklsq
Kp = 3.1330
ki = 0.1465.
Kd = 14.3918

该示波器显示了优化的闭环阶跃响应。

闭环响应后lsqnonlin

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

然而,由于步进尺寸控制机制,通过可变步骤求解器产生的数值溶液不是参数的平滑功能。这种缺乏光滑度可以防止优化程序会聚。当您使用固定步骤求解器时,缺乏平滑度不是问题。(有关进一步的解释,请参阅[53].)

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

Helper函数

下面的代码创建runtracklsqhelper函数。

功能[kp,ki,kd] = runtracklsq% RUNTRACKLSQ演示了在Simulink中使用LSQNONLIN。金宝appmdl ='Optsim';Open_System(MDL)加载模型在= Si金宝appmulink.SimulationInput (mdl);创建模拟输入对象在= 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,[],[],选项);set_param (mdl“FastRestart”'离开');%回报收益kp = pid(1);ki = pid(2);KD = PID(3);功能F = tracklsq (pid)%跟踪Optsim的输出到1的信号%设置模拟输入对象参数在= in.setVariable ('kp'pid (1),'工作区',mdl);在= in.setVariable (“吻”pid (2),'工作区',mdl);在= in.setVariable (“Kd”,pid(3),'工作区',mdl);%模拟= sim(中);F =重燃('你') -  1;结束结束

2019-2020 The MathWorks, Inc.版权所有