解非线性最小二乘问题
使用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
(a1
和a2
是Plant块中的变量)。Kp
,Ki
,Kd
是需要优化的变量。这个函数tracklsq
是嵌套在里面的runtracklsq
所以变量a1
和a2
在两个函数之间共享。变量a1
和a2
正在初始化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。