主要内容

使用查找表要求增益调度优化设计(代码)

这个例子展示了如何调优参数在一个查找表模型,使用增益调度调整控制器的响应不同的植物。模型优化使用sdo.optimize命令。

船舶操舵模型

打开模型®模型。金宝app

mdl =“sdoShipSteering”;open_system (mdl)

该模型实现了野本模型常用的船舶操舵。船的动态特性变化明显与船的速度等因素。因此舵控制器还应随速度,以满足要求驾驶这艘船。

把船,控制回路比较船舶的航向角与参考航向角、舵和PD控制器发送命令信号。野本船植物块实现了模型中,二阶系统的参数随船的速度。船最初以其最大15 m / s的速度,但它会慢下来当参考轨迹指定一个在水里。这个转变,随着引擎的力量,力量使用动态块计算船的速度。运动学块计算船的轨迹。

打开控制器。

open_system ([mdl“/控制器”])

当速度变化时,这艘船也在改变。因此PD控制器需要改变,和速度作为调度变量。控制器形式K (1 + sTd)在哪里K整体增益和吗道明是时间常数与导数有关的术语。增益调度是实现通过查找表,指定表数据K道明。这些向量指定不同的值不同的速度。不同的速度是在查找表中指定断点向量bpKbpTd

设计问题

引用指定在200秒,船应该转180度和扭转。一个要求是船航向角需要匹配一个信封内参考航向角。乘客的安全和舒适,第二个要求是船的总加速度需要保持在0.25 g的束缚,1 g在哪里在地球表面的重力加速度,9.8 m / s / s。

控制器参数向量K道明将设计变量,将调整来满足要求。如果不能满足要求,然后查找表断点bpKbpTd也将作为设计变量。在这种情况下,我们需要指定一个额外的要求bpKbpTd必须严格单调增加,因为这需要断点向量模型查找表。金宝app

指定设计要求

指定必须满足的需求。首先,船应该遵循的参考轨迹。自引用本质上是一个阶跃变化从0到180度,你指定船航向角阶跃响应信封。

需求=结构;要求。StepResponseEnvelope = sdo.requirements.StepResponseEnvelope (“StepTime”,200,(秒)的上升时间,75,“SettlingTime”,200,“PercentRise”,85,(%)“PercentOvershoot”5,“PercentSettling”,1“FinalValue”π(弧度));

第二个要求是,对乘客的安全和舒适,总不应超过0.25 g加速度的在任何时间。总加速度是由两部分组成,一个切向分量在船舶运动的方向,和一个正常(水平)组件。要求总加速度不超过0.25克的对应要求的相平面切向和法向加速度,这艘船的轨迹保持在一个半径为0.25 * 9.8的圆。

accelGravity = 9.8;要求。安慰= sdo.requirements.PhasePlaneEllipse (“半径”,0.25 * [1]* accelGravity);

与最初的检查船的行为,未优化控制器参数,看是否满足要求。使用的函数sdoShipSteeringPlots画船的行为。下面第一个情节展示了这艘船的航向角保持在公差范围内的阶跃响应信封,满足第一个要求。第二个图显示的轨迹船在水里。黑色箭头表示运动的起始位置和方向。这艘船转180度,直径大约是415米。第三个情节展示了船在相平面的切向加速度和法向加速度。黑色箭头表示随时间演化的起点和方向。总加速度超过208秒附近的束缚,所以要求乘客的安全和舒适是不满足。

hPlots = sdoShipSteeringPlots (mdl、需求);

指定设计变量

指定设计变量来调整优化程序,以满足需求。指定PD控制器的增益,K道明,如设计变量。对于初始值,使用-0.1的所有条目K向量,50的所有条目道明向量。如果需求都不能满足,随后断点向量bpKbpTd也可以设计变量。

DesignVars = sdo。getParameterFromModel (mdl, {“K”,“Td”});DesignVars (1)。值= -0.1 * (1 1 1);DesignVars (2)。值= 50 * [1 1 1 1];sdo。setValueInModel (mdl DesignVars);

建立优化目标函数

创建一个目标函数,它将在每次优化迭代评估被称为设计变量优化设计要求。这个成本函数为模型输入参数,设计变量,模拟器(下面定义),和设计要求。函数使用的舒适需求的最大成本计算时,为了巩固需求评估结果这样一个标量元素的数量都是一样的,不管时间模型解算器采取的步骤。金宝app

类型sdoShipSteering_Design
函数Vals = sdoShipSteering_Design (mdl P模拟器,需求)为船舶操舵% % % sdoShipSteering_Design目标函数在每个迭代函数的优化问题。% %的函数名为mdl模型,一组参数%值,P,模拟器,评估的设计要求。%返回客观价值和约束违反,瓦尔斯,%优化解算器。% %看到sdoExampleCostFunction函数和sdo。优化更%详细描述函数的签名。% %参见sdoShipSteering_cmddemo % 2016年版权MathWorks, Inc . % % %模拟模型评价模型。模拟器。参数= P;模拟器= sim(模拟器);%检索记录信号数据。 SimLog = find(Simulator.LoggedData,get_param(mdl, 'SignalLoggingName')); Heading = find(SimLog, 'Heading'); NormalAccel = find(SimLog, 'NormalAccel'); TangenAccel = find(SimLog, 'TangenAccel'); % Evaluate the step response envelope requirement Cleq_StepResponseEnvelope = evalRequirement(Requirements.StepResponseEnvelope, Heading.Values); % Evaluate the safety/comfort requirement on total acceleration. Cleq_Comfort = evalRequirement(Requirements.Comfort, NormalAccel.Values, TangenAccel.Values); %% Return Values. % Collect the evaluated design requirement values in a structure to return % to the optimization solver. Vals.Cleq = Cleq_StepResponseEnvelope(:); Vals.Cleq = [Vals.Cleq ; Cleq_Comfort]; % Evaluate monotonic variable requirement if isfield(Requirements, 'Monotonic') Cleq_bpK = evalRequirement(Requirements.Monotonic, P(3).Value); Cleq_bpTd = evalRequirement(Requirements.Monotonic, P(4).Value); Vals.Cleq = [Vals.Cleq ; Cleq_bpK ; Cleq_bpTd]; end end

成本函数需要一个模拟器运行模型。创建模拟器并添加模型信号记录,所以他们的成本函数可用值。

模拟器= sdo.SimulationTest (mdl);%船航向角标题= Simuli金宝appnk.SimulationData.SignalLoggingInfo;标题。BlockPath =“sdoShipSteering /船工厂”;Heading.LoggingInfo。LoggingName =“标题”;Heading.LoggingInfo。NameMode = 1;标题。OutputPortIndex = 1;%法向加速度NormalAccel = 金宝appSimulink.SimulationData.SignalLoggingInfo;NormalAccel。BlockPath =“sdoShipSteering /运动学”;NormalAccel.LoggingInfo。LoggingName =“NormalAccel”;NormalAccel.LoggingInfo。NameMode = 1;NormalAccel。OutputPortIndex = 4;%切向加速度TangenAccel = 金宝appSimulink.SimulationData.SignalLoggingInfo;TangenAccel。BlockPath =“sdoShipSteering /运动学”;TangenAccel.LoggingInfo。LoggingName =“TangenAccel”;TangenAccel.LoggingInfo。NameMode = 1;TangenAccel。OutputPortIndex = 5;%收集记录信号Simulator.LoggingInfo。信号= [标题;NormalAccel;TangenAccel];

优化查找表数据

优化之前,为快速评估通过启用设置模拟器仿真软件快速重启。金宝app

模拟器= fastRestart(模拟器,“上”);

在优化过程中,模型解算器可能会产生一个警告如果时间金宝app步的大小变得太小了。暂时抑制这个警告。

warnState =警告(“查询”,“金宝app模型:引擎:SolverMinStepSizeWarn”);warnState1 =警告(“查询”,模金宝app型解算器:警告的);warnState2 =警告(“查询”,“金宝appSimulinkExecution:德:MinStepSizeWarning”);警告(“关闭”,“金宝app模型:引擎:SolverMinStepSizeWarn”);警告(“关闭”,模金宝app型解算器:警告的);警告(“关闭”,“金宝appSimulinkExecution:德:MinStepSizeWarning”);

成本优化,定义一个处理函数,使用上面定义的模拟器和需求。使用一个匿名函数,它接受一个参数(设计变量)并调用目标函数。最后,调用sdo.optimize优化设计变量来满足要求。

optimfcn = @ (P) sdoShipSteering_Design (mdl P、模拟器、需求);[Optimized_DesignVars,信息]= sdo。优化(optimfcn DesignVars);
优化开始2023 - 3月- 03,09:09:04 max一阶Iter F-count f (x)约束步长最优17 0 34 0 0.3215 0.865 0.321 0.6127 - 1 2 57 0 0.3079 0.174 0.308 103 0 0.3079 0.00127 0.308聚集到一个不可行点。fmincon停止因为当前步骤的大小小于一步尺寸公差但约束的值不满足约束的值公差内。

显示表明,优化器无法满足所有需求。尝试优化设计变量模型和阴谋的结果。航向角不是所需的阶跃响应信封内,和总加速期间仍然超过允许水平的一部分。此外,转弯直径增加到660米,因此,把没有紧张与不调谐的收益。

sdo。setValueInModel (mdl Optimized_DesignVars);hPlots = sdoShipSteeringPlots (mdl、需求hPlots);

优化查找表数据和断点

来满足设计要求,使用上面的优化结果作为起点,和优化额外变量。添加断点bpKbpTd作为设计变量。该船的最大速度是15米/秒,在将其最大速度可能放缓至60%,或9 m / s。初始值设置的断点之间等距的9和15米/秒。限制断点最小值9 m / s,并限制断点最大值15米/秒。

DesignVars = Optimized_DesignVars;DesignVars (3:4) = sdo。getParameterFromModel (mdl, {“bpK”,“bpTd”});%设置初始值DesignVars (3)。值= (9 11 13 15);DesignVars (4)。值= (9 11 13 15);%约束最小和最大的价值DesignVars (3)。最小= 9;DesignVars (3)。最大= 15;DesignVars (4)。最小= 9;DesignVars (4)。最大= 15;%在模型中设置值sdo。setValueInModel (mdl DesignVars);

断点在仿真软件查找表块必须严格单调递增金宝app。这个添加到设计要求。

要求。单调= sdo.requirements.MonotonicVariable;optimfcn = @ (P) sdoShipSteering_Design (mdl P、模拟器、需求);

优化模型通过调整四个设计变量,看看所有的要求都可以满足。

[Optimized_DesignVars,信息]= sdo。优化(optimfcn DesignVars);
优化开始2023 - 3月- 03,09:09:21 max一阶Iter F-count 29 f (x)约束最优步长0 0 0.3079 1 61 0 0 0.03626 0.0858 0.597 0.1432 0.148 1.01 94 3 123 0 0 0.007837 0.0341 0.00627 0.01911 0.0548 0.0859 - 4 153 5 183 0 0 0.0256 0.000903局部最小值发现,满足约束。优化完成,因为目标函数中引入可行的方向,在最优值的宽容,和约束满足约束的值公差内。

显示表明,优化器能够满足所有的需求。尝试优化设计变量模型和阴谋的结果。在下面的图中,航向角阶跃响应信封内,和总0.25 g加速度是在允许范围内的。此外,转弯直径有615米,比当收紧断点没有调整。

sdo。setValueInModel (mdl Optimized_DesignVars);hPlots = sdoShipSteeringPlots (mdl、需求hPlots);

在这个例子中,这艘船植物随这艘船的速度,所以控制器收益还需要有所不同。增益调度使用查找表实现。通过调优的收益和断点值控制器,这艘船能够跟随参考航向角,同时总加速度约束以确保乘客的安全舒适的乘坐。

相关的例子

学习如何优化增益调度控制器使用查找表响应优化器,请参阅优化设计使用查找表要求增益调度(GUI)

%关闭模型和数据,和恢复状态的警告。fastRestart(模拟器,“关闭”);%恢复快速重新启动设置bdclose (mdl)关闭(hPlots)警告(warnState);%的恢复状态的警告警告(warnState1);%的恢复状态的警告警告(warnState2);%的恢复状态的警告

另请参阅

|||||

相关的话题