主要内容

优化设计来满足一个定制的目标(代码)

这个例子展示了如何优化设计满足使用一个自定义的目标sdo.optimize。你优化缸参数以减少汽缸几何和满足设计要求。

液压缸模型

打开模型®模型。金宝app

sys =“sdoHydraulicCylinder”;open_system(系统);

液压缸模型是基于仿真软件模型金宝appsldemo_hydcyl。该模型包括:

  • 阶跃变化应用到气缸控制导致缸活塞阀孔的位置,将改变。

液压缸设计问题

你调整气缸横截面积和活塞弹簧常数满足以下设计要求:

  • 确保活塞位置的阶跃响应上升时间小于0.04秒,凝结时间小于0.05秒。

  • 限制最高气缸压力1.75 e6 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

限制活塞弹簧常数一系列1 e4 10 e4 N / m。

K。最小值= 1 e4;% N / mK。最大= 10 e4;% N / m

指定设计要求

设计要求需要记录模型的信号。在优化过程中,模型是模拟使用的当前值的设计变量和记录的信号是用来评估设计要求。

日志以下信号:

  • 气缸压力,可以在第一输出端口油缸总成

压力= Simulink金宝app.SimulationData.SignalLoggingInfo;压力。BlockPath =“sdoHydraulicCylinder /缸总成”;压力。OutputPortIndex = 1;
  • 活塞的位置,可以在第二个输出端口油缸总成

PistonPosition = 金宝appSimulink.SimulationData.SignalLoggingInfo;PistonPosition。BlockPath =“sdoHydraulicCylinder /缸总成”;PistonPosition。OutputPortIndex = 2;

创建一个对象存储日志信息和使用后模拟模型

模拟器= sdo.SimulationTest (“sdoHydraulicCylinder”);simulator.LoggingInfo。信号= (PistonPosition,压力);

指定活塞位置的阶跃响应要求上升时间小于0.04秒,沉降时间小于0.05秒。

PistonResponse = sdo.requirements.StepResponseEnvelope;集(PistonResponse,的上升时间,0.04,“FinalValue”,0.04,“SettlingTime”,0.05,“PercentSettling”1);

指定的最高气缸压力要求小于1.75 e6 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) sdoHydraulicCylinder_design (p、模拟器、需求);

功能:

  • 有一个输入参数,用于指定气缸横截面积和活塞弹簧常数的值。

  • 返回优化客观价值和优化约束违反价值观。

优化求解最小化的目标价值和试图保持优化约束违反价值观负面。类型帮助sdoExampleCostFunction更多细节关于如何写目标/约束函数。

sdoHydraulicCylinder_design函数使用模拟器需求评估对象的设计。类型编辑sdoHydraulicCylinder_design更详细地检查功能。

类型sdoHydraulicCylinder_design
功能设计= sdoHydraulicCylinder_design (p模拟器需求)% sdoHydraulicCylinder_design % % sdoHydraulicCylinder_design函数是用来评估一个圆柱体%设计。% % | |页输入参数是向量汽缸的设计参数。% % | |模拟器的输入参数是一个sdo。金宝appSimulinkTest对象用于%模拟| sdoHydraulicCylinder |模型和测井模拟信号% % | |要求输入参数包含设计要求使用%评价缸设计% % |设计|返回包含的信息设计的论证% | sdo的评价,可以使用。优化| %设计优化函数。% %也看到sdo。优化,sdoExampleCostFunction % 2011年版权MathWorks公司。% % % %使用模拟模型模拟器模拟模型和对数模型输入参数%的信号。% %首先确保我们模拟模型与优化器选择的参数值%。%模拟器。参数= p;%模拟模型和测井信号。 % simulator = sim(simulator); % Get the simulation signal log, the simulation log name is defined by the % model |SignalLoggingName| property % logName = get_param('sdoHydraulicCylinder','SignalLoggingName'); simLog = get(simulator.LoggedData,logName); %% Evaluate the design requirements % % Use the requirements input argument to evaluate the design requirements % % Check the PistonPosition signal against the stepresponse requirement % PistonPosition = get(simLog,'PistonPosition'); cPiston = evalRequirement(requirements.PistonResponse,PistonPosition.Values); % Check the Pressure signals against the maximum requirement % Pressures = find(simLog,'Pressures'); cPressure = evalRequirement(requirements.MaxPressure,Pressures.Values); % Use the PistonResponse and MaxPressure requirements as non-linear % constraints for optimization. design.Cleq = [cPiston(:);cPressure(:)]; % Add design objective to minimize the Cylinder cross-sectional area Ac = p(1); %Since we called sdo.optimize(evalDesign,[Ac;K]) design.F = Ac.Value; end

评估的初步设计

调用目标函数与初始圆柱横截面积和初始活塞弹簧常数。

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));
优化01 - 9月- 2021年开始17:04:34 max一阶Iter F-count f (x)约束最优步长11 0 5 0.001 0.3033 1 0.00057281 0.07293 0.48 85.4 - 2 15 29 0.000314159 0.03972 0.00107 0.000314159 0.03972 0.183 0.861 3 0.861聚合到一个不可行点。fmincon停止因为当前步骤的大小小于一步尺寸公差但约束的值不满足约束的值公差内。

优化反复评估缸设计通过调整横截面积和活塞弹簧常数,以满足设计要求。从范围、看到最大压力和活塞响应需求得到满足。

sdo.optimize函数返回:

  • pOpt显示了优化的横截面积和活塞弹簧常数的值。

pOpt
pOpt(1, - 1) =名字:‘交流’值:3.1416 e-04最低:3.1416 e-04最大:0.0013自由:1比例:0.0020信息:[1 x1 struct] pOpt(2, 1) =名字:“K”值:1.3767 e + 04最低:10000最大:100000免费:1规模:65536信息:[1 x1 struct] 2 x1 param.Continuous
  • optInfo是一个结构,包含优化终止等信息的优化迭代次数和优化设计。

optInfo
optInfo =结构体字段:Cleq: x1双[10]F: 3.1416 e-04梯度:[1 x1 struct] exitflag: 2次迭代:3 SolverOutput: [1 x1 struct]统计:[1 x1 struct]

例如,Cleq字段显示了优化非线性不等式约束优化中所有非容积公差,表明最大压力和活塞响应需求得到满足。

optInfo.Cleq
ans = -0.1359 -0.0586 -0.0586 -1.0000 -0.1814 0.0397 0.0396 0.0121 -0.0476 -0.0476

F字段包含优化的横截面积。优化的横截面积值初始值低近50%。

optInfo.F
ans = 3.1416 e-04

更新模型变量值

默认情况下,模型的变量交流K没有更新的优化。使用setValueInModel命令来更新模型变量值。

sdo.setValueInModel (“sdoHydraulicCylinder”pOpt)

相关的例子

学习如何优化缸设计使用响应优化器,请参阅优化设计来满足一个定制的目标(GUI)

%关闭模式bdclose (“sdoHydraulicCylinder”)