В этом примере показано, как выбрать резисторы и терморезисторы в схеме, чтобы лучше всего совпадать с заданной кривой однажды в схеме. Необходимо выбрать все электронные компоненты из списка доступных компонентов, что означает, что это - дискретная задача оптимизации. Чтобы помочь визуализировать прогресс оптимизации, пример включает пользовательскую выходную функцию, которая отображает качество промежуточных решений, в то время как оптимизация прогрессирует. Поскольку это - целочисленная задача с нелинейной целевой функцией, используйте 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
векторы содержат стандартные параметры для терморезисторов. Сопротивление терморезистора как функция температуры
сопротивление терморезистора.
сопротивление на уровне 25 градусов Цельсия, параметр ThVal
.
температура 25 градусов Цельсия.
текущая температура.
параметр терморезистора ThBeta
.
На основе стандартных расчетов напряжения, эквивалентных серийных значений сопротивлений блок
,
и эквивалентное сопротивление блок
.
Поэтому напряжение в точке B
.
Проблема состоит в том, чтобы выбрать резисторы через и терморезисторы и так, чтобы напряжение лучшие соответствия кривая целевых значений. Имейте контрольную переменную x, представляют эти значения:
x(i)
= индекс , для i
от 1 до 4
x(5)
= индекс
x(6)
= индекс
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 fun = @(x)objectiveFunction(x,Res,ThVal,ThBeta,Tdata,Vdata); [xOpt,Fval] = surrogateopt(fun,lb,ub,intCon,options);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
Чтобы попытаться получить лучшую подгонку, перезапустите оптимизацию от файла контрольной точки и задайте больше функциональных оценок. На этот раз используйте surrogateoptplot
функция построения графика, чтобы контролировать процесс оптимизации более тесно.
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
.