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
, 和a2
(A1
和a2
是植物块中的变量)。kp.
,ki.
, 和kd.
是要优化的变量。功能tracklsq.
内嵌套runtracklsq
这样变量A1
和a2
在这两种功能之间共享。的变量A1
和a2
被初始化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
下面的代码创建runtracklsq
helper函数。
功能[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.版权所有