主要内容

优化设计以满足定制目标(代码)

这个例子展示了如何优化设计,以满足客户的目标使用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”