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

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

Этот пример адаптирован из Lyon [1].

Описание задачи

Проблема связана с этой схемой.

Источник напряжения удерживает точку A на 1.1V. Задача состоит в том, чтобы выбрать резисторы и терморезисторы из списка стандартных компонентов, чтобы напряжение в точке 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

The Res вектор содержит стандартные значения резисторов. The 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

The 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

Отслеживайте прогресс

Чтобы наблюдать прогресс оптимизации, вызовите выходную функцию, которая строит график наилучшего отклика системы, найденной до сих пор, и целевой кривой. The 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] Lyon, Craig K. Генетический алгоритм решает значения компонентов термисторная сеть. EDN Network, 19 марта 2008 года. Доступно в https://www.edn.com/design/analog/4326942/Genetic-algorithm-solves-thermistor-network-component-values.

См. также

Похожие темы