Целочисленная оптимизация с пользовательской выходной функцией

В этом примере показано, как выбрать резисторы и терморезисторы в схеме, чтобы лучше всего совпадать с заданной кривой однажды в схеме. Необходимо выбрать все электронные компоненты из списка доступных компонентов, что означает, что это - дискретная задача оптимизации. Чтобы помочь визуализировать прогресс оптимизации, пример включает пользовательскую выходную функцию, которая отображает качество промежуточных решений, в то время как оптимизация прогрессирует. Поскольку это - целочисленная задача с нелинейной целевой функцией, используйте surrogateopt решатель.

Этот пример адаптируется из Лиона [1].

Описание проблемы

Проблема включает эту схему.

Источник напряжения содержит точку A на уровне 1.1 В. Проблема состоит в том, чтобы выбрать резисторы и терморезисторы из списка стандартных компонентов так, чтобы напряжение в точке B совпадало с кривой целевых значений в зависимости от температуры.

Tdata = -40:5:85;
Vdata = 1.026E-1 + -1.125E-4 * Tdata + 1.125E-5 * Tdata.^2;
plot(Tdata,Vdata,'-*');
title('Target Curve','FontSize',12); 
xlabel('Temperature (^oC)'); ylabel('Voltage (V)')

Загрузите стандартный список компонентов.

load StandardComponentValues

Res вектор содержит стандартные значения резистора. ThBeta и ThVal векторы содержат стандартные параметры для терморезисторов. Сопротивление терморезистора в зависимости от температуры T

RTh=R25exp(βT-T25TT25).

  • RTh сопротивление терморезистора.

  • R25 сопротивление на уровне 25 градусов Цельсия, параметр ThVal.

  • T25 температура 25 градусов Цельсия.

  • T текущая температура.

  • β параметр терморезистора ThBeta.

На основе стандартных расчетов напряжения, эквивалентных серийных значений сопротивлений R1-Th1 блок

R1equivalent=R1Th1R1+Th1,

и эквивалентное сопротивление R3-Th2 блок

R3equivalent=R3Th2R3+Th2.

Поэтому напряжение в точке B

V=1.1R3equivalent+R4R1equivalent+R2+R3equivalent+R4.

Преобразуйте проблему закодировать

Проблема состоит в том, чтобы выбрать резисторы R1 через R4 и терморезисторы Th1 и Th2 так, чтобы напряжение V лучшие соответствия кривая целевых значений. Имейте контрольную переменную x, представляют эти значения:

  • x(i) = индекс Ri, для i от 1 до 4

  • x(5) = индекс Th1

  • x(6) = индекс Th2

tempCompCurve функция вычисляет получившееся напряжение в терминах x и температурный Tdata.

type tempCompCurve
function F = tempCompCurve(x,Tdata)
%% Calculate Temperature Curve given Resistor and Thermistor Values
% Copyright (c) 2012-2019, MathWorks, Inc.
%% Input voltage
Vin = 1.1;

%% Thermistor Calculations
% Values in x: R1 R2 R3 R4 RTH1(T_25degc) Beta1 RTH2(T_25degc) Beta2
% Thermistors are represented by:
%   Room temperature is 25degc: T_25
%   Standard value is at 25degc: RTHx_25
%   RTHx is the thermistor resistance at various temperatures
% 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));

%% Define equivalent circuits for parallel Rs and RTHs
R1_eq = x(1)*RTH1./(x(1)+RTH1);
R3_eq = x(3)*RTH2./(x(3)+RTH2);

%% Calculate voltages at Point B
F = Vin * (R3_eq + x(4))./(R1_eq + x(2) + R3_eq + x(4));

Целевая функция является суммой квадратов различий между кривой целевых значений и получившимися напряжениями для набора резисторов и терморезисторов по целевому диапазону температур.

type objectiveFunction
function G = objectiveFunction(x,StdRes, StdTherm_Val, StdTherm_Beta,Tdata,Vdata)
%% Objective function for the thermistor problem
% Copyright (c) 2012-2019, MathWorks, Inc.

% % StdRes = vector of resistor values
% StdTherm_val = vector of nominal thermistor resistances
% StdTherm_Beta = vector of thermistor temperature coefficients

% Extract component values from tables using integers in x as indices
y = zeros(8,1);
x = round(x); % in case of noninteger components
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 графики функций эти кривые и обновления кривые только, когда текущее значение целевой функции уменьшается. Эта пользовательская выходная функция долга, таким образом, ее не показывают здесь. Чтобы видеть содержимое этой выходной функции, введите type 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'.

options = optimoptions('surrogateopt','CheckpointFile','C:\TEMP\checkfile.mat','PlotFcn',[],...
    'OutputFcn',@(a1,a2,a3)SurrOptimPlot(a1,a2,a3,Tdata,Vdata,Res,ThVal,ThBeta));

Чтобы дать алгоритму лучший начальный набор точек, чтобы искать, задайте большую начальную случайную выборку, чем значение по умолчанию.

options.MinSurrogatePoints = 50;

Запустите оптимизацию.

rng default % For reproducibility
objconstr = @(x)objectiveFunction(x,Res,ThVal,ThBeta,Tdata,Vdata);
[xOpt,Fval] = surrogateopt(objconstr,lb,ub,intCon,options);

Surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.

Оптимизируйте с большим количеством вычислений функции

Чтобы попытаться получить лучшую подгонку, перезапустите оптимизацию от файла контрольной точки и задайте больше вычислений функции. На этот раз используйте surrogateoptplot функция построения графика, чтобы контролировать процесс оптимизации более тесно.

clf % Clear previous figure
opts = optimoptions(options,'MaxFunctionEvaluations',600,'PlotFcn','surrogateoptplot');
[xOpt,Fval] = surrogateopt('C:\TEMP\checkfile.mat',opts);

Surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.

Используя большее количество вычислений функции улучшает подгонку немного.

Ссылки

[1] Лион, Крэйг К. Генетический алгоритм решает сетевые терморезистором значения компонента. Сеть EDN, 19 марта 2008. Доступный в https://www.edn.com/design/analog/4326942/Genetic-algorithm-solves-thermistor-network-component-values.

Смотрите также

Похожие темы