这个例子展示了如何在一个电路中选择电阻和热敏电阻,以最佳地匹配电路中某一点的指定曲线。你必须从一份可用部件列表中选择所有的电子部件,这意味着这是一个离散优化问题。为了帮助可视化优化过程,该示例包含一个自定义输出函数,在优化过程中显示中间解决方案的质量。万博 尤文图斯因为这是一个带有非线性目标函数的整数问题,使用surrogateopt
解算器。
这个例子改编自Lyon[1]。
这个问题涉及到这个电路。
电压源保持点A在1.1V。问题是要从一组标准元件中选择电阻和热敏电阻,使B点的电压与目标曲线的温度函数相匹配。
Tdata = 40:5:85;Vdata = 1.026E-1 + - 1.12e -4 * Tdata + 1.12e -5 * Tdata.^2;情节(Tdata Vdata,“- *”);标题(“目标曲线”,“字形大小”12);包含(“温度(^ oC)”);ylabel (“电压(V)”)
加载标准组件列表。
负载StandardComponentValues
的Res
向量包含标准电阻器值。的ThBeta
和ThVal
矢量包含热敏电阻的标准参数。热敏电阻电阻与温度的函数关系
是
为热敏电阻电阻。
电阻是在25摄氏度时的参数吗ThVal
.
温度是25摄氏度。
为当前温度。
是热敏电阻参数吗ThBeta
.
根据标准电压计算,得到串联电阻的等值值 块
,
和等效电阻 块
.
因此,B点的电压为
.
问题是选择电阻 通过 和热敏电阻 和 所以电压 最符合目标曲线。让控制变量x代表以下值:
x(我)
=指数
,因为我
从1到4
x (5)
=指数
x (6)
=指数
的tempCompCurve
函数根据来计算产生的电压x
和温度Tdata
.
类型tempCompCurve
function F = tempCompCurve(x,Tdata) %% Calculate Temperature Curve given Resistor and Thermistor Values %在x % % %热敏电阻计算值:R1, R2 R3 R4 RTH1 (T_25degc) Beta1 RTH2 (T_25degc) Beta2 %热敏电阻为:%的房间温度是25摄氏度:T_25 %标准价值在25摄氏度:RTHx_25 % RTHx %仅仅是热敏电阻在不同温度(T) =仅仅(T_25degc) / exp(β* (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));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
function G = Objective function (x,StdRes, StdTherm_Val, StdTherm_Beta,Tdata,Vdata) %% Objective function for the thermistor problem % Copyright (c) 2012-2019, MathWorks,从表中提取分量值,使用整数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。
磅= 1 (1,6);
电阻的上界都是一样的。表项的上限值设置为Res
数据。
乌兰巴托= (Res) *的长度(1,6);
设置热敏电阻的上限值为ThBeta
数据。
乌兰巴托(6)=长度(ThBeta) * [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、磅、乌兰巴托、intCon选项);
Surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
为了获得更好的适应,从检查点文件重新启动优化,并指定更多的函数计算。这一次,使用surrogateoptplot
绘图功能更密切地监控优化过程。
clf清除先前的数字选择= optimoptions(选项,“MaxFunctionEvaluations”, 600,“PlotFcn”,“surrogateoptplot”);[xOpt, Fval] = surrogateopt (“C: \ TEMP \ checkfile.mat”、选择);
Surrogateopt停止,因为它超过了'options.MaxFunctionEvaluations'设置的函数求值限制。
使用更多的函数计算稍微提高了适合度。
克雷格·K·里昂报道。遗传算法求解热敏电阻网络元件值。EDN网络,2008年3月19日。可以在https://www.edn.com/design/analog/4326942/Genetic-algorithm-solves-thermistor-network-component-values
.