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

Источник напряжения удерживает точку А в точке 1.1V. Проблема состоит в том, чтобы выбрать резисторы и термисторы из списка стандартных компонентов так, чтобы напряжение в точке В соответствовало целевой кривой как функции температуры.
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-T25T⋅T25).
- сопротивление терморезистора.
- сопротивление при 25 градусах Цельсия, параметр ThVal.
- температура 25 градусов Цельсия.
- текущая температура.
- параметр термистора ThBeta.
На основе стандартных расчетов напряжения эквивалентные последовательные значения сопротивлений блока R1-Th1 составляют
,
и эквивалентное сопротивление блока R3-Th2
.
Следовательно, напряжение в точке B равно
R3equivalent + R4.
Проблема заключается в выборе резисторов через и термисторы и так, чтобы напряжение наилучшим образом соответствовало целевой кривой. Пусть управляющая переменная x представляет следующие значения:
x(i) = индекс , для i от 1 до 4
x(5) = индекс
x(6) = индекс
tempCompCurve функция вычисляет результирующее напряжение в терминах x и температура Tdata.
type tempCompCurvefunction 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 objectiveFunctionfunction 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.