主要内容

解非线性最小二乘问题使用Simul万博1manbetxink®模型

此示例显示了如何调整Simulink模型的参数,万博1manbetxoptsim,包括在optim/演示MATLAB®安装的文件夹。该模型包括一个建模为Simulink方框图的非线性过程设备。万博1manbetx

带有驱动器饱和的工厂

该装置为欠阻尼三阶模型,具有执行器限值。执行器限值为饱和限值和回转率限值。执行器饱和极限切断大于2个单位或小于–2个单位的输入值。致动器的回转率限制为0.8单位/秒。系统对阶跃输入的闭环响应如所示闭环响应.您可以通过打开模型(typeoptsim在命令行中单击(或单击模型名称),然后选择模拟菜单。响应根据范围绘图。

闭环响应

问题在于设计一个跟踪系统单位阶跃输入的反馈控制回路。闭环装置按照装置和执行器位于分层子系统块中的块输入。范围块显示设计过程中的输出轨迹。

闭环模型

要解决这个问题,就要尽量减小输出和输入信号之间的误差。(相反,在例子中将fminimax与Simulink®模型一万博1manbetx起使用,解决方案包括最小化输出的最大值。)变量为比例积分微分(PID)控制器的参数。如果你只需要在一个时间单位内最小化误差,你就会有一个标量目标函数。但目标是最小化从0到100的所有时间步长的误差,从而产生一个多目标函数(每个时间步的一个函数)。

使用解非线性最小二乘问题对输出跟踪执行最小二乘拟合。跟踪由函数执行tracklsq,即嵌套在runtracklsq在这个例子的最后。tracklsq返回错误信号青年,通过调用模拟,减去输入信号1。

这个函数runtracklsq设置所有必需的值,然后调用解非线性最小二乘问题具有目标函数tracklsq.变量选项传递给解非线性最小二乘问题定义条件和显示特征。选项指定不显示输出,使用“levenberg marquardt”算法,选项给出了步长和目标函数的终止公差,其阶数为0.001。

在模型中运行模拟optsim,则必须指定变量Kp,Ki,Kd,a1,a2(a1a2是Plant块中的变量)。Kp,Ki,Kd是需要优化的变量。这个函数tracklsq是嵌套在里面的runtracklsq所以变量a1a2在两个函数之间共享。变量a1a2正在初始化runtracklsq

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

模拟完成后,runtracklsq创造myobj当前工作区中的对象(即tracklsq).框图模型中的Outport块放置青年在仿真结束时,将对象的字段转换为当前工作空间。

当您运行runtracklsq,优化给出了比例、积分和导数的解(Kp,Ki,Kd)控制器的增益。

[qh
Kp=3.1330
Ki = 0.1465
Kd=14.3918

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

后闭环响应解非线性最小二乘问题

笔记:号召模拟调用Simulink常微分方程(ODE)之一的结果解算器。您需要万博1manbetx选择使用哪种类型的解算器。从优化角度来看,如果固定步长ODE解算器足以解算ODE,则它是最佳选择。但是,对于刚性系统,可能需要使用可变步长ODE方法解算ODE。

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

万博1manbetxSimulink设计优化™ 建议使用软件与Simulink可变步长解算器一起解决多目标优化问题。该软件提供了一种特殊的数值梯度计算,可与Simulink一起使用,避免了引入缺乏平滑度的问题。

辅助函数

下面的代码创建runtracklsq辅助函数。

函数(Kp、Ki Kd) = runtracklsq%RUNTRACKLSQ演示了在Simulink中使用LSQNONLIN。万博1manbetxmdl=“optsim”;open_system (mdl)%加载模型in=Si万博1manbetxmulink.SimulationInput(mdl);%创建模拟输入对象in=in.setModelParameter(“停车时间”,'100');%停止时间100pid0=[0.63 0.0504 1.9688];初始增益值a1 = 3;a2 = 43;%初始化模型设备变量options=options(@lsqnonlin,“算法”,“levenberg marquardt”,...“显示”,“关闭”,“阶跃公差”,0.001,“最佳耐受性”, 0.001);%优化收益set_param (mdl“快速重启”,“开”);%快速重启pid=lsqnonlin(@tracklsq,pid0,[],[]选项);设置参数(mdl,“快速重启”,“关闭”);%返还收益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;终止终止

版权2019-2020 MathWorks,Inc。