主要内容

响应优化中的离散值变量(代码)

这个例子展示了如何使用响应优化来调优离散值变量。离散值变量表示模型参数,这些参数被限制在一个有限的值集,而不是连续变化的。若要使用离散值变量进行响应优化或参数估计,必须使用surrogateopt混合整数优化求解器。

打开模型

sdoMotorPosition模型中,PI控制器使直流电机的角位置匹配所需的参考值。电机上的负载受到干扰,控制器必须排除这些干扰。

open_system (“sdoMotorPosition”

sdoMotorPosition_model.png

控制器子系统,PI增益设置由一个12 V源分为电阻R1R2R3,R4,如下图所示。

Controller_GainSet_Circuit.png

比例增益,Kp,由12 * R2 / (R1 + R2)积分增益,Ki,由12 * R4 / (R3和R4).电阻的初值为R1= 47 kΩ,R2= 180 kΩ,R3= 10 kΩ,和R4= 10 kΩ。

指定离散设计变量

这四个电阻器值是为优化而调整的模型参数。因为电阻只有离散值,所以使用离散参数来表示它们。为此,使用第三个输入参数Tosdo.getParameterFromModel指定离散参数。

DesignVars = sdo.getParameterFromModel(“sdoMotorPosition”[], {R1的R2的R3的“R4”});

sdo.getParameterFromModel返回一个数组。参数。离散参数对象,该对象按照指定的顺序与模型参数对应。设置ValueSet属性设置为该参数允许的一组离散值。设置价值属性设置为当前值,该值必须在ValueSet

% R1值DesignVars(1)。ValueSet= [39 43 47 51 56] * 1e3; DesignVars(1).Value = 47*1e3;% R2值DesignVars(2)。ValueSet= [150 160 180 200 220] * 1e3; DesignVars(2).Value = 180*1e3;% R3值DesignVars(3)。ValueSet= [8.2 9.1 10 11 12] * 1e3; DesignVars(3).Value = 10*1e3;% R4值DesignVars(4)。ValueSet= [8.2 9.1 10 11 12] * 1e3; DesignVars(4).Value = 10*1e3;

说明设计要求和信号

该模型在1秒内施加阶跃扰动。在模型中指定的初始电阻值下,扰动使电机偏离约20°。然后在扰动发生后4秒,响应恢复到与参考位置±5°的范围内。对于本例,寻找新的电阻值以将该规格提高10%,使电机偏离不超过18°,并在扰动后4秒恢复到与参考位置±4.5°的范围内。首先,使用指定这些新的设计需求sdo.requirements.SignalBound

需求= struct;要求。上限值= sdo.requirements.SignalBound(...“BoundMagnitudes”, [18 18;4.5 - 4.5),...“BoundTimes”, [15 5;5) 15日);要求。LowerBound = sdo.requirements.SignalBound(...“BoundMagnitudes”, [-4.5 -4.5],...“BoundTimes”, [5 15],...“类型”“> =”);

为了根据需求可视化初始性能,首先在模拟过程中指定要记录的信号。特别是,记录Integrator块的输出,这是模型的角度位置,您想要优化的信号。为此,使用sdo。模拟并配置LoggingInfo财产。另外,要为以后在优化中使用的场景做好准备,请将您创建的设计变量分配为它参数财产。

模拟器= sdo。模拟(“sdoMotorPosition”);Sig_Info = 万博1manbetxSimulink.SimulationData.SignalLoggingInfo;Sig_Info。BlockPath =“sdoMotorPosition /集成商”;Sig_Info.LoggingInfo。LoggingName =“团体”;Sig_Info.LoggingInfo。NameMode = 1;Simulator.LoggingInfo.Signals = Sig_Info;模拟器。Parameters = DesignVars;

现在创建一个干扰抑制要求的图。然后,对模型进行模拟,并将记录的信号添加到图中。

hRequirement = plot(Requirements.LowerBound.BoundTimes',Requirements.LowerBound.BoundMagnitudes',“颜色”“黑”);持有情节(Requirements.UpperBound。BoundTimes’,Requirements.UpperBound.BoundMagnitudes’,“颜色”“黑”);%模拟器。参数= DesignVars;模拟器= sim(模拟器);SimLog = find(模拟器。LoggedData get_param (“sdoMotorPosition”“SignalLoggingName”));Sig_Log = find(SimLog,“团体”);CLRS =颜色顺序;原始= plot(Sig_Log. log .)值,“颜色”clr (:));传奇([hRequirement hOriginal),“要求”的原始变量);

图中包含一个轴对象。axis对象包含4个line类型的对象。这些对象代表需求、原始变量。

该图表明,电流电阻值不完全满足更严格的要求。

设置优化

优化过程使用电阻变量的不同值多次运行模型。要加快这一过程,请将模拟器配置为快速重新启动。

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

优化需要一个目标或代价函数来运行模型,并确定是否满足干扰抑制要求。对于本例,使用函数sdoMotorPosition_optFcn,它包含在示例的末尾。这个函数被优化求解器多次调用。要将函数传递给优化器,请使用带有一个参数的匿名函数,该参数调用sdoMotorPosition_optFcn

optimfcn = @(P) sdoMotorPosition_optFcn(P,模拟器,需求);

指定优化选项。将优化方法设置为surrogateopt求解器,这是支持调整离散参数的方法。万博1manbetx

Options = sdo.OptimizeOptions;选项。方法=“surrogateopt”;options . methodoptions . maxfunctionassessments = 100;objectivelimit = 0.001;选项。优化dModel = Simulator;

优化设计

要找到针对需求优化的电阻值,请调用sdo.optimize与成本函数句柄,参数优化,和选项。

rng (“默认”);再现率%[Optimized_DesignVars,Info] = sdo.optimize(optimfcn,DesignVars,Options);
试验类型1 0.0759805 0.0759805初始2 0.0751287 0.0751287随机3 0.0751287 0.179179随机4 0.0447169 0.0447169随机5 0.0317818 0.0317818随机6 0.0317818随机6 0.0317818随机6 0.0317818随机7 0.0257711 0.0257711随机8 0.0257711 0.0930365随机9 0.0257711 0.091938随机10 0.0257711 0.200359随机11 0.0062997 0.0062997随机12 0.0062997 0.206374随机14 0.0062997 0.0818387随机随机15 0.0062997 0.114002随机16 0.0062997 0.112485随机17 0.0062997 0.0759805随机18 0.0062997 0.0709489随机19 0.0062997 0.280136随机20 0.0062997 0.099985随机21 -0.00737024 -0.00737024自适应22 -0.00737024 0.0691728随机24 -0.00737024 0.0347164随机25 -0.00737024 0.0589627随机26 -0.00737024 0.104488随机27 -0.00737024 0.0534262随机30 -0.00737024 0.1643随机31 -0.00737024 0.0419731 random 32 -0.00737024 0.0396579 random 33 -0.00737024 0.077945 random 34 -0.00737024 0.0883493 random 35 -0.00762259 -0.00762259 random 36 -0.00762259 0.0455853 random 37 -0.00762259 0.13976 random 38 -0.00762259 0.140634 random 39 -0.00762259 0.0662368 random 40 -0.00762259 0.256738 random 41 -0.00762259 0.0348764 random 42 -0.00762259 0.18995 random 43 -0.00762259 0.0615952 random 44 -0.00762259 0.0597358 random 45 -0.00762259 0.015983 random 46 -0.00762259 0.0770592 random 47 -0.00762259 0.174666 random 48 -0.00762259 0.081758 random 49 -0.00762259 0.0240828 random 50 -0.00762259 0.173292 random Current F-count max constraint max constraint Trial type 51 -0.00762259 0.116519 random 52 -0.00762259 0.217099 random 53 -0.00762259 0.104371 random 54 -0.00762259 0.0937562 random 55 -0.00762259 0.104225 random 56 -0.00762259 0.0380129 random 57 -0.00762259 0.150819 random 58 -0.00762259 0.0636666 random 59 -0.00762259 0.0320499 random 60 -0.00762259 0.0273158 random 61 -0.00762259 0.0798937 random 62 -0.00762259 0.174146 random 63 -0.00762259 0.0166127 random 64 -0.00762259 0.00433873 adaptive 65 -0.00518218 -0.00518218 adaptive 66 -0.00518218 0.294106 random 67 -0.00518218 0.0319864 random 68 -0.00518218 0.266843 random 69 -0.00518218 0.0342618 random 70 -0.00518218 0.0982987 random 71 -0.00518218 0.0419731 random 72 -0.00518218 0.0396579 random 73 -0.00518218 0.299815 random 74 -0.00518218 0.0712971 random 75 -0.00518218 0.0709489 random 76 -0.00518218 0.0589627 random 77 -0.00518218 0.131778 random 78 -0.00518218 0.00653156 random 79 -0.00518218 0.211877 random 80 -0.00518218 0.0967155 random 81 -0.00518218 0.0689487 random 82 -0.00518218 0.0257711 random 83 -0.00518218 0.0930365 random 84 -0.00518218 0.114002 random 85 -0.00518218 0.112485 random 86 -0.00518218 0.06706 random 87 -0.00495699 -0.00495699 adaptive 88 -0.00495699 0.0751287 random 89 -0.00495699 0.0759805 random 90 -0.00495699 0.10447 random 91 -0.00495699 0.190644 random 92 -0.00495699 0.142755 random 93 -0.00495699 0.104193 random 94 -0.00495699 0.100237 random 95 -0.00495699 0.097787 random 96 -0.00495699 0.0735855 random 97 -0.00495699 0.137557 random 98 -0.00495699 0.0783709 random 99 -0.00495699 0.0875674 random 100 -0.00495699 0.0794652 random 101 -0.00495699 -0.00495699 best value The current solution is feasible. surrogateopt stopped because it exceeded the function evaluation limit set by the 'MethodOptions.MaxFunctionEvaluations' property in the sdo.OptimizeOptions object. If the solution needs to be improved, you could try increasing the function evaluation limit.

评估优化设计

绘制优化后的模型响应图。

模拟器。Parameters = Optimized_DesignVars; Simulator = sim(Simulator); SimLog = find(Simulator.LoggedData,get_param(“sdoMotorPosition”“SignalLoggingName”));Sig_Log = find(SimLog,“团体”);CLRS =颜色顺序;hOptimized = plot(Sig_Log. log .)值,“颜色”clr (:));legend([hRequirement original hOptimized],“要求”的原始变量优化变量的);

图中包含一个轴对象。axis对象包含5个line类型的对象。这些对象代表需求、原始变量、优化变量。

现在电机的位置在干扰抑制要求的规范内。

用优化的参数值更新模型

sdo。优化返回数组中参数的调优版本Optimized_DesignVars.这个数组中的每个条目都是a参数。离散参数对象价值属性设置为优化值。例如,检查的新值R2

Optimized_DesignVars(2)。价值
Ans = 220000

用优化后的参数值更新模型。

sdo.setValueInModel (“sdoMotorPosition”, Optimized_DesignVars);

恢复模拟器快速重启设置。

模拟器= fastRestart(模拟器,“关闭”);

结论

在本例中,您调整变量以改善电机控制器的抗扰特性。调整的变量是电子元件,只能取离散值,而不能取连续值。你用sdo.getParameterFromModel将变量指定为离散的,并使用surrogateopt求解器来调优参数。

目标函数

这个函数sdoMotorPosition_optFcn在具有一组参数值的优化问题的每次迭代中调用,P.函数返回目标值和违反约束的情况,瓦尔斯,到优化求解器。看到sdo.optimize获取函数签名的更详细描述。

函数Vals = sdoMotorPosition_optFcn(P,模拟器,需求)% SDOMOTORPOSITION_OPTFCN模拟模型。模拟器。Parameters = P; Simulator = sim(Simulator);检索记录的信号数据。SimLog = find(模拟器。LoggedData get_param (“sdoMotorPosition”“SignalLoggingName”));Sig_Log = find(SimLog,“团体”);评估设计需求。Cleq_UpperBound = evalRequirement(Requirements.UpperBound,Sig_Log.Values);Cleq_LowerBound = evalRequirement(Requirements.LowerBound,Sig_Log.Values);收集结构中评估的设计需求值%返回优化求解器。瓦尔斯。Cleq = [...Cleq_UpperBound (:);...Cleq_LowerBound (:));结束

另请参阅

|||

相关的话题