主要内容

自定义输出函数整数优化

这个例子展示了如何在一个电路中选择电阻和热敏电阻,以最佳地匹配电路中某一点的指定曲线。你必须从一份可用部件列表中选择所有的电子部件,这意味着这是一个离散优化问题。为了帮助可视化优化过程,该示例包含一个自定义输出函数,在优化过程中显示中间解决方案的质量。万博 尤文图斯因为这是一个带有非线性目标函数的整数问题,使用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向量包含标准电阻器值。的ThBetaThVal矢量包含热敏电阻的标准参数。热敏电阻电阻与温度的函数关系 T

R T h R 2 5 经验值 β T - T 2 5 T T 2 5

  • R T h 为热敏电阻电阻。

  • R 2 5 电阻是在25摄氏度时的参数吗ThVal

  • T 2 5 温度是25摄氏度。

  • T 为当前温度。

  • β 是热敏电阻参数吗ThBeta

根据标准电压计算,得到串联电阻的等值值 R 1 - T h 1

R 1 e u v 一个 l e n t R 1 T h 1 R 1 + T h 1

和等效电阻 R 3. - T h 2

R 3. e u v 一个 l e n t R 3. T h 2 R 3. + T h 2

因此,B点的电压为

V 1 1 R 3. e u v 一个 l e n t + R 4 R 1 e u v 一个 l e n t + R 2 + R 3. e u v 一个 l e n t + R 4

将问题转化为代码

问题是选择电阻 R 1 通过 R 4 和热敏电阻 T h 1 T h 2 所以电压 V 最符合目标曲线。让控制变量x代表以下值:

  • x(我)=指数 R ,因为从1到4

  • x (5)=指数 T h 1

  • x (6)=指数 T h 2

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

另请参阅

相关的话题