这个例子展示了如何优化设计,以满足客户的目标使用sdo.optimize
.您可以优化气缸参数,使气缸几何形状最小化,满足设计要求。
打开Simulin万博1manbetxk模型。
sys =“sdoHydraulicCylinder”;open_system(系统);
液压缸模型基于Simulink模型万博1manbetxsldemo_hydcyl
.该模型包括:
泵
和油缸总成
子系统。有关子系统的更多信息,请参见单液压缸仿真.
应用于气缸控制阀孔面积的一种阶跃变化,使气缸活塞位置发生变化。
调整气缸横截面积和活塞弹簧常数,满足以下设计要求:
确保活塞位置的阶跃响应上升时间小于0.04秒,整定时间小于0.05秒。
限制最大气缸压力为1.75e6 N/m。
尽量减少圆柱体的横截面积。
选取以下模型参数作为设计变量进行优化:
圆柱横截面积交流
活塞弹簧常数K
Ac = sdo.getParameterFromModel (“sdoHydraulicCylinder”,“交流”);K = sdo.getParameterFromModel (“sdoHydraulicCylinder”,“K”);
将圆柱体截面积限制在半径为1 ~ 2厘米的圆形区域内。
Ac.Minimum =π* 1依照^ 2;% m ^ 2Ac.Maximum =π* 2依照^ 2;% m ^ 2
将活塞弹簧常数限制在1e4 ~ 10e4 N/m范围内。
K.Minimum = 1 e4;% N / mK.Maximum = 10 e4;% N / m
设计要求记录模型信号。在优化过程中,使用设计变量的当前值对模型进行模拟,并使用记录的信号来评估设计需求。
记录以下信号:
气缸压力,可在第一个输出端口油缸总成
块
压力= Simulink万博1manbetx.SimulationData.SignalLoggingInfo;压力。BlockPath =“sdoHydraulicCylinder /缸总成”;压力。OutputPortIndex = 1;
活塞位置,可在第二个输出端口油缸总成
块
PistonPosition = 万博1manbetxSimulink.SimulationData.SignalLoggingInfo;PistonPosition。BlockPath =“sdoHydraulicCylinder /缸总成”; PistonPosition.OutputPortIndex=2;
创建一个对象来存储日志信息,并在以后用于模拟模型
模拟器= sdo。模拟(“sdoHydraulicCylinder”);simulator.LoggingInfo.Signals = (PistonPosition,压力);
指定活塞位置阶跃响应要求上升时间小于0.04秒,沉降时间小于0.05秒。
PistonResponse = sdo.requirements.StepResponseEnvelope;集(PistonResponse,...的上升时间, 0.04,...“FinalValue”, 0.04,...“SettlingTime”, 0.05,...“PercentSettling”1);
指定最大气缸压力要求小于1.75e6 N/m。
MaxPressure = sdo.requirements.SignalBound;集(MaxPressure,...“BoundTimes”, 0.1 [0],...“BoundMagnitudes”(1.75 e6 1.75 e6),...“类型”,“< =”);
为方便起见,请将性能需求收集到单个结构中,以便稍后使用。
需求=结构(...“PistonResponse”PistonResponse,...“MaxPressure”, MaxPressure);
为了优化气缸横截面积和活塞弹簧常数,创建一个函数来评估气缸的设计。在每次优化迭代时调用此函数。
在这里,使用一个带参数的匿名函数来调用sdoHydraulicCylinder_design
函数。
evalDesign = @(p) sdohydraulic cylinder (p,simulator,requirements);
功能:
具有一个指定气缸横截面积和活塞弹簧常数值的输入参数。
返回优化目标值和优化约束违背值。
优化解算器最小化目标值,并尝试将优化约束冲突值保持为负值。类型帮助sdoExampleCostFunction
有关如何编写目标/约束函数的更多细节。
的sdoHydraulicCylinder_design
函数使用模拟器
和需求
评估设计的对象。类型编辑sdoHydraulicCylinder_design
以更详细地检查函数。
类型sdoHydraulicCylinder_design
功能设计=sdoHydraulicCylinder_设计(p,模拟器,要求)%sdoHydraulicCylinder_设计%%sdoHydraulicCylinder_设计功能用于评估气缸%设计%%| p |输入参数是圆柱体设计参数的向量。%%|simulator |输入参数是一个sdo.SimulinkTest对象,用于%模拟| sdoHydraulicCylinder |模型和日志模拟信号%%The | requirements |输入参数包含用于评估圆柱体设计%%The | design |返回参数包含有关可使用的设计%评估的信息通过| sdo.optimize |函数优化%设计%%另请参见万博1manbetxsdo.optimize,sdoExampleCostFunction%版权所有2011 The MathWorks,Inc.%%Simulate The model%%使用模拟器输入参数模拟模型和日志模型%信号。%%首先确保我们使用优化器选择的参数值%模拟模型模拟器参数=p;%模拟模型和日志信号。%模拟器=模拟机(模拟器);%获取仿真信号日志,仿真日志名称由%model | SignalLoggingName |属性%logName=Get_param('sdoHydraulicCylinder','SignalLoggingName')定义;simLog=get(simulator.LoggedData,logName);%评估设计要求%%使用需求输入参数评估设计要求%%检查PistonPosition信号是否符合stepresponse要求%PistonPosition=get(simLog,'PistonPosition');cPiston=评估要求(要求.活塞响应,活塞位置.值);%根据最大要求%Pressures=find(simLog,'Pressures')检查压力信号;C压力=评估要求(要求.最大压力,压力.值);%使用PistonResponse和MaxPressure要求作为优化的非线性%约束。design.Cleq=[cPiston(:);cPressure(:)];%增加设计目标,使气缸横截面积Ac=p(1);%因为我们称之为sdo.optimize(evalDesign[Ac;K])design.F=Ac.Value;终止
用初始气缸横截面积和初始活塞弹簧常数来调用目标函数。
initDesign = evalDesign ((Ac; K));
该功能模拟模型并评估设计需求。结果表明,活塞位置阶跃响应满足最大压力要求,但不满足活塞位置阶跃响应要求。
initDesign
是一个具有以下字段的结构:
Cleq
证明了一些不等式约束是正的,表明它们不满足初始设计。
initDesign。Cleq
Ans = -0.3839 -0.1861 -0.1836 -1.0000 0.3033 0.2909 0.1671 0.2326 -0.0480 -0.0480
F
显示优化目标值(在本例中为圆柱体横截面积)。初始设计横截面积与预期的相同,与初始横截面积参数相同交流
.
initDesign。F
ans = 1.0000 e 03
通过目标函数、初始横截面积和活塞弹簧常数值sdo.optimize
.
[pOpt, optInfo] = sdo.optimize (evalDesign (Ac; K));
优化开始2021年- 2月23日19:10:06 max一阶Iter F-count f (x)约束最优步长11 0 5 0.001 0.3033 1 0.00057281 0.07293 0.48 85.4 - 2 17 0.000391755 0 0.128 28 3 22 0.000387832 0 0.00277 0.00461 - 4 27 0.000382514 0.000376867 0.00372 0.00183 5 32 0 0.00395 0.00125 6 37 0.000373784 0 0.00225 0.000908局部最小值满足约束条件。优化完成是因为目标函数在可行方向上不减小到最优性公差的值内,约束条件满足到约束公差的值内。
优化通过调整横截面积和活塞弹簧常数来反复评估气缸的设计,以满足设计要求。从范围看,最大压力和活塞响应要求是否满足。
的sdo.optimize
函数返回:
pOpt
显示优化的横截面积和活塞弹簧常数值。
pOpt
pOpt(1,1) = Name: 'Ac' Value: 3.7378e-04 Minimum: 3.1416e-04 Maximum: 0.0013 Free: 1 Scale: 0.0020 Info: [1x1 struct] pOpt(2,1) = Name: 'K' Value: 1.5665e+04 Minimum: 10000 Maximum: 100000 Free: 1 Scale: [1x1 struct] 2x1 param. pOpt(1,1) = Name: 'K' Value: 1.5665e+04 Minimum: 10000 Maximum: 100000 Free: 1 Scale: 65536 Info: [1x1 struct] 2x1连续
optInfo
是一种包含优化迭代次数和优化设计等优化终止信息的结构。
optInfo
optInfo = struct with fields: Cleq: [10x1 double] F: 3.7378e-04 Gradients: [1x1 struct] exitflag: 1 iterations: 6 SolverOutput: [1x1 struct] Stats: [1x1 struct]
例如,Cleq
现场结果表明,优化后的非线性不等式约束对内优化公差均为非正值,表明最大压力和活塞响应要求均得到满足。
optInfo。Cleq
Ans = -0.0992 -0.0156 -0.0156 -1.0000 -0.2064 -0.0024 -0.0043 -0.0003 -0.0476 -0.0476
的F
字段包含优化的横截面积。优化后的截面积值比初始值小近50%。
optInfo。F
ans = 3.7378 e-04
默认情况下,模型变量交流
和K
在优化结束时不会更新。使用setValueInModel
命令更新模型变量值。
sdo.setValueInModel (“sdoHydraulicCylinder”pOpt)
学习如何优化气缸设计使用响应优化器,请参阅优化设计以满足自定义目标(GUI).
%关闭模型bdclose (“sdoHydraulicCylinder”)