Этот пример показывает, как выбрать резисторы и терморезисторы в схеме, чтобы наилучшим образом соответствовать заданной кривой в одной точке схемы. Необходимо выбрать все электронные компоненты из списка доступных компонентов, что означает, что это дискретная задача оптимизации. Чтобы помочь визуализировать прогресс оптимизации, пример включает пользовательскую выходную функцию, которая отображает качество промежуточных решений по мере прогрессирования оптимизации. Поскольку это целочисленная задача с нелинейной целевой функцией, используйте 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
векторы содержат стандартные параметры для терморезисторов. Термисторное сопротивление как функция от температуры является
- сопротивление терморезистора.
- сопротивление при 25 степенях Цельсия, параметр ThVal
.
- температура 25 степени Цельсия.
- текущая температура.
- параметр термистора ThBeta
.
На основе стандартных вычислений напряжения, эквивалентных последовательных значений сопротивлений блок есть
,
и эквивалентное сопротивление блок есть
.
Поэтому напряжение в точке B является
.
Задача состоит в том, чтобы выбрать резисторы через и термисторы и так, чтобы напряжение лучше всего соответствует целевой кривой. Иметь управляющую переменную x, представляющую эти значения:
x(i)
= индекс , для i
от 1 до 4
x(5)
= индекс
x(6)
= индекс
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
.