具有自定义输出函数的整数优化
这个例子展示了如何在电路中选择电阻和热敏电阻,以最佳地匹配电路中某一点的指定曲线。您必须从可用组件列表中选择所有电子组件,这意味着这是一个离散优化问题。为了帮助可视化优化过程,该示例包含一个自定义输出函数,该函数在优化过程中显示中间解决方案的质量。金宝搏官方网站因为这是一个具有非线性目标函数的整数问题,所以使用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
Vector包含标准电阻值。的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和RTH1的等效电路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 = 0 (8,1);X =圆(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 =长度(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)objectiveFunction(x,Res,ThVal,ThBeta,Tdata,Vdata);[xOpt,Fval] = surrogateopt(objconstr,lb,ub,intCon,options);
surrogateopt停止,因为它超过了'options. maxfunctionevaluments '设置的函数求值限制。
优化与更多的函数评估
要尝试获得更好的匹配,请从检查点文件重新启动优化,并指定更多的函数计算。这一次,使用surrogateoptplot
绘图功能,以更密切地监视优化过程。
clf%清除上一个数字Opts = optimoptions(选项,“MaxFunctionEvaluations”, 600,“PlotFcn”,“surrogateoptplot”);[xOpt,Fval] = surrogateopt(“C: \ TEMP \ checkfile.mat”、选择);
surrogateopt停止,因为它超过了'options. maxfunctionevaluments '设置的函数求值限制。
使用更多的函数计算略微改善了拟合性。
参考文献
里昂,克雷格·K。遗传算法求解热敏电阻网络分量值。EDN网络,2008年3月19日。可以在https://www.edn.com/genetic-algorithm-solves-thermistor-network-component-values/
.