使用最优组件选择surrogateopt
本例展示了如何在电路中选择电阻器和热敏电阻,以在电路中的某一点上最佳地匹配指定曲线。您必须从可用组件列表中选择所有的电子组件,这意味着这是一个离散优化问题。为了帮助可视化优化的过程,该示例包括一个自定义输出函数,该函数在优化过程中显示中间解决方案的质量。因为这是一个具有非线性目标函数的整数问题,所以使用surrogateopt
解算器。
这个例子改编自Lyon[1]。
问题描述
这个问题涉及到这个电路。
电压源将A点保持在1.1V。问题是要从标准元件列表中选择电阻器和热敏电阻,使B点的电压与目标曲线作为温度的函数相匹配。
Tdata = -40:5:85;Vdata = 1.026E-1 + -1.125E-4 * Tdata + 1.125E-5 * Tdata.^2;情节(Tdata Vdata,“- *”);标题(“目标曲线”,“字形大小”12);包含(“温度(^ oC)”);ylabel (“电压(V)”)
加载标准组件列表。
负载StandardComponentValues
的Res
矢量包含标准电阻值。的ThBeta
和ThVal
矢量包含热敏电阻的标准参数。热敏电阻电阻是温度的函数
是
是热敏电阻电阻。
25摄氏度时的电阻参数是多少
ThVal
.温度是25摄氏度。
是当前温度。
热敏电阻是参数吗
ThBeta
.
在标准电压计算的基础上,计算出各电阻的等效串联值 块
,
的等效电阻 块
.
因此,B点的电压为
.
将问题转化为代码
问题是选择电阻器 通过 和热敏电阻 和 所以电压 最佳匹配目标曲线。让控制变量x表示这些值:
x(我)
指数 ,因为我
从1到4x (5)
指数x (6)
指数
的tempCompCurve
函数以的形式计算得到的电压x
还有温度Tdata
.
类型tempCompCurve
函数F = tempCompCurve(x,Tdata) %%计算给定电阻和热敏电阻值的温度曲线%版权所有(c) 2012-2019, MathWorks, Inc. %%输入电压Vin = 1.1;%%热敏电阻计算% x: R1 R2 R3 R4 RTH1(T_25degc) Beta1 RTH2(T_25degc) Beta2 %热敏电阻表示为:%室温为25degc: T_25 %标准值为25degc: RTHx_25 % RTHx为不同温度下的热敏电阻% RTH(T) = RTH(T_25degc) / exp (Beta * (T-T_25)/(T*T_25)) T_25 = 298.15;T_off = 273.15;Beta1 = x(6);Beta2 = x(8);RTH1 = x(5)。/ exp (Beta1 * ((Tdata + T_off) -T_25)。/ ((Tdata + T_off) * T_25));RTH2 = x(7)。/ exp (Beta2 * ((Tdata + T_off) -T_25)。/ ((Tdata + T_off) * T_25));定义并行Rs和rth的等效电路R1_eq = x(1)*RTH1./(x(1)+RTH1);R3_eq = x(3)*RTH2./(x(3)+RTH2);计算点B的电压F = Vin * (R3_eq + x(4))。/(R1_eq + x(2) + R3_eq + x(4));
目标函数是一组电阻器和热敏电阻器在目标温度范围内的目标曲线与结果电压之间差异的平方和。
类型objectiveFunction
函数G = objectiveFunction(x,StdRes, StdTherm_Val, StdTherm_Beta,Tdata,Vdata) %%热敏电阻问题的目标函数%版权(c) 2012-2019, MathWorks, Inc. %% StdRes =电阻器值的矢量% StdTherm_Val =标称热敏电阻电阻的矢量% StdTherm_Beta =热敏电阻温度系数的矢量%从表中使用x中的整数作为指数y =零(8,1);X = round(X);%对于非整数分量y(1) = StdRes(x(1));y(2) = StdRes(x(2));y(3) = StdRes(x(3));y(4) = StdRes(x(4));y(5) = StdTherm_Val(x(5));y(6) = StdTherm_Beta(x(5));y(7) = StdTherm_Val(x(6));y(8) = StdTherm_Beta(x(6)); % Calculate temperature curve for a particular set of components F = tempCompCurve(y, Tdata); % Compare simulated results to target curve Residual = F(:) - Vdata(:); Residual = Residual(1:2:26); %% G = Residual'*Residual; % sum of squares
监测进展
为了观察优化的进展,调用一个输出函数来绘制迄今为止发现的系统的最佳响应和目标曲线。的SurrOptimPlot
函数绘制这些曲线,仅当当前目标函数值减小时更新曲线。这个自定义输出函数很长,所以这里没有显示。要查看此输出函数的内容,请输入类型SurrOptimPlot
.
优化问题
优化目标函数,使用surrogateopt
,它接受整数变量。首先,将所有变量设置为整数。
intCon = 1:6;
将所有变量的下界设置为1。
Lb = ones(1,6);
电阻的上界都是一样的。属性中的项数设置为上界Res
数据。
ub = length(Res)*ones(1,6);
设置热敏电阻的上界为ThBeta
数据。
ub(5:6) = length(ThBeta)*[1,1];
设置选项以使用SurrOptimPlot
自定义输出函数,并使用无绘图函数。此外,为了防止可能的优化中断,可以指定一个检查点文件“checkfile.mat”
.
选项= optimoptions(“surrogateopt”,“CheckpointFile”,“C: \ TEMP \ checkfile.mat”,“PlotFcn”[],…“OutputFcn”@ (a1, a2, a3) SurrOptimPlot (a1, a2, a3, Tdata Vdata, Res, ThVal, ThBeta));
为了给算法一个更好的搜索点的初始集,指定一个比默认值更大的初始随机样本。
选项。MinSurrogatePoints = 50;
运行优化。
rng默认的%用于再现性objconstr = @(x) objecvefunction (x,Res,ThVal,ThBeta,Tdata,Vdata);[xOpt,Fval] = surrogateopt(objconstr,lb,ub,intCon,options);
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
使用更多的函数评估进行优化
要尝试获得更好的匹配,请从检查点文件重新启动优化,并指定更多的函数计算。这一次,使用surrogateoptplot
绘图功能,以更密切地监控优化过程。
clf%清除先前数据Opts = optimoptions(选项,“MaxFunctionEvaluations”, 600,“PlotFcn”,“surrogateoptplot”);[xOpt,Fval] = surrogateopt(“C: \ TEMP \ checkfile.mat”、选择);
surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数计算限制。
使用更多的函数计算可以稍微改善拟合。
参考文献
[1]里昂,克雷格K。遗传算法求解热敏电阻网络分量值。EDN网络,2008年3月19日。可以在https://www.edn.com/genetic-algorithm-solves-thermistor-network-component-values/
.