Следующие примеры показывают, как сгенерировать эффективные памятью интерполяционные таблицы программно. Используя командную строку, эквивалентную из Lookup Table Optimizer, вы можете:
Оптимизируйте существующий блок Lookup Table.
Сгенерируйте интерполяционную таблицу от блока Math Function.
Сгенерируйте интерполяционную таблицу от функции или указателя на функцию.
Сгенерируйте интерполяционную таблицу от блока Subsystem.
Этот пример показывает, как сгенерировать эффективную памятью интерполяционную таблицу, которая аппроксимирует функцию sin
. Задайте проблему приближения путем создания объекта FunctionApproximation.Problem
.
P = FunctionApproximation.Problem('sin')
P = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: @(x)sin(x) NumberOfInputs: 1 InputTypes: "numerictype(0,16,13)" InputLowerBounds: 0 InputUpperBounds: 6.2832 OutputType: "numerictype(1,16,14)" Options: [1x1 FunctionApproximation.Options]
Свойства FunctionToApproximate
и NumberOfInputs
объекта Problem
выведены из определения объекта и не могут быть отредактированы после создания. Все другие свойства перезаписываемы.
Отредактируйте объект FunctionApproximation.Options
задать дополнительные ограничения, чтобы использовать в процессе оптимизации. Например, ограничьте точки останова сгенерированной интерполяционной таблицы к ровному интервалу.
P.Options.BreakpointSpecification = 'EvenSpacing'
P = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: @(x)sin(x) NumberOfInputs: 1 InputTypes: "numerictype(0,16,13)" InputLowerBounds: 0 InputUpperBounds: 6.2832 OutputType: "numerictype(1,16,14)" Options: [1x1 FunctionApproximation.Options]
Задайте дополнительные ограничения, такие как абсолютные и относительные допуски вывода и ограничений размера слова.
P.Options.AbsTol = 2^-10; P.Options.RelTol = 2^-6; P.Options.WordLengths = [8,16];
Используйте метод solve
, чтобы решить задачу оптимизации. MATLAB™ отображает итерации процесса оптимизации. Метод solve
возвращает объект FunctionApproximation.LUTSolution
.
S = solve(P)
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 48 | 0 | 2 | 8 | 16 | EvenSpacing | 9.765625e-04, 1.007261e+00 | | 1 | 32 | 0 | 2 | 8 | 8 | EvenSpacing | 9.765625e-04, 1.007261e+00 | | 2 | 288 | 0 | 17 | 8 | 16 | EvenSpacing | 9.765625e-04, 2.794368e-01 | | 3 | 560 | 0 | 34 | 8 | 16 | EvenSpacing | 9.765625e-04, 9.553784e-02 | | 4 | 1104 | 0 | 68 | 8 | 16 | EvenSpacing | 9.765625e-04, 1.970943e-03 | | 5 | 3264 | 1 | 203 | 8 | 16 | EvenSpacing | 9.765625e-04, 7.988139e-05 | | 6 | 64 | 0 | 2 | 16 | 16 | EvenSpacing | 9.765625e-04, 9.853516e-01 | | 7 | 48 | 0 | 2 | 16 | 8 | EvenSpacing | 9.765625e-04, 9.853516e-01 | | 8 | 304 | 0 | 17 | 16 | 16 | EvenSpacing | 9.765625e-04, 4.538564e-03 | | 9 | 576 | 0 | 34 | 16 | 16 | EvenSpacing | 9.765625e-04, 3.008540e-03 | | 10 | 1120 | 0 | 68 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.909908e-03 | | 11 | 2208 | 0 | 136 | 16 | 16 | EvenSpacing | 9.765625e-04, 4.473384e-03 | | 12 | 1664 | 0 | 102 | 16 | 16 | EvenSpacing | 9.765625e-04, 7.647212e-03 | | 13 | 1936 | 0 | 119 | 16 | 16 | EvenSpacing | 9.765625e-04, 2.886470e-03 | | 14 | 2064 | 0 | 127 | 16 | 16 | EvenSpacing | 9.765625e-04, 7.769283e-03 | | 15 | 2128 | 0 | 131 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.484936e-02 | | 16 | 2160 | 0 | 133 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.509350e-02 | | 17 | 2176 | 1 | 134 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.398881e-04 | | 18 | 48 | 0 | 2 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 1.300802e+00 | | 19 | 432 | 0 | 26 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 3.322094e-02 | | 20 | 832 | 0 | 51 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 3.322094e-02 | | 21 | 1648 | 1 | 102 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 7.988139e-05 | | 22 | 64 | 0 | 2 | 16 | 16 | EvenPow2Spacing | 9.765625e-04, 1.300816e+00 | | 23 | 448 | 0 | 26 | 16 | 16 | EvenPow2Spacing | 9.765625e-04, 3.315991e-02 | | 24 | 848 | 0 | 51 | 16 | 16 | EvenPow2Spacing | 9.765625e-04, 3.315991e-02 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 21 | 1648 | 1 | 102 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 7.988139e-05 | S = 1x1 FunctionApproximation.LUTSolution with properties: ID: 21 Feasible: "true"
Сравните числовое поведение исходной функции с числовым поведением сгенерированной интерполяционной таблицы, сохраненной в решении, S
.
err = compare(S)
err = struct with fields: Breakpoints: [51473x1 double] Original: [51473x1 double] Approximate: [51473x1 double]
Можно получить доступ к данным об интерполяционной таблице, хранимым в объекте LUTSolution
.
t = S.TableData
t = struct with fields: BreakpointValues: {[1x102 double]} BreakpointDataTypes: [1x1 embedded.numerictype] TableValues: [1x102 double] TableDataType: [1x1 embedded.numerictype] IsEvenSpacing: 1 Interpolation: Linear
Чтобы получить доступ к сгенерированному блоку Lookup Table, используйте метод approximate
.
S.approximate
Этот пример показывает, как оптимизировать существующий блок Lookup Table для эффективности памяти. Откройте модель, содержащую блок Lookup Table, который вы хотите оптимизировать.
load_system('sldemo_fuelsys'); open_system('sldemo_fuelsys/fuel_rate_control/airflow_calc');
Создайте объект FunctionApproximation.Problem
задать задачу оптимизации и ограничения.
P = FunctionApproximation.Problem('sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant')
P = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant' NumberOfInputs: 2 InputTypes: [1x2 string] InputLowerBounds: [50 0.0500] InputUpperBounds: [1000 0.9500] OutputType: "numerictype('single')" Options: [1x1 FunctionApproximation.Options]
Задайте дополнительные ограничения путем изменения объекта Options
, сопоставленного с объектом Problem
, P
.
P.Options.BreakpointSpecification = "EvenSpacing"
P = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant' NumberOfInputs: 2 InputTypes: [1x2 string] InputLowerBounds: [50 0.0500] InputUpperBounds: [1000 0.9500] OutputType: "numerictype('single')" Options: [1x1 FunctionApproximation.Options]
Решите задачу оптимизации.
S = solve(P)
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 12128 | 1 | [18 19] | [32 32] | 32 | ExplicitValues | 7.812500e-03, 0.000000e+00 | | 1 | 11840 | 1 | [18 19] | [16 32] | 32 | ExplicitValues | 7.812500e-03, 0.000000e+00 | | 2 | 80 | 0 | [2 2] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 1.045582e-01 | | 3 | 2928 | 0 | [18 20] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.133151e-02 | | 4 | 11280 | 0 | [36 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.742526e-02 | | 5 | 6528 | 0 | [27 30] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.297625e-02 | | 6 | 8480 | 0 | [31 34] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.020075e-02 | | 7 | 10344 | 0 | [33 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.020075e-02 | | 8 | 10656 | 0 | [34 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.742526e-02 | | 9 | 10968 | 0 | [35 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.742526e-02 | | 10 | 128 | 0 | [2 2] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.048788e-01 | | 11 | 2832 | 0 | [18 19] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.426438e-02 | | 12 | 11040 | 1 | [36 38] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 2.082726e-03 | | 13 | 6144 | 0 | [27 28] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.765960e-03 | | 14 | 8280 | 1 | [31 33] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 5.650558e-03 | | 15 | 7056 | 0 | [29 30] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 8.803874e-03 | | 16 | 7536 | 1 | [30 31] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 7.327236e-03 | | 17 | 112 | 0 | [2 2] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 1.052361e-01 | | 18 | 5808 | 0 | [18 20] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.194828e-02 | | 19 | 1808 | 0 | [10 11] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 4.010030e-02 | | 20 | 3408 | 0 | [14 15] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.247673e-02 | | 21 | 4400 | 0 | [16 17] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.247672e-02 | | 22 | 4944 | 0 | [17 18] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.622878e-02 | | 23 | 5488 | 0 | [17 20] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.622878e-02 | | 24 | 160 | 0 | [2 2] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.055567e-01 | | 25 | 5568 | 0 | [18 19] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.448403e-02 | | 26 | 1696 | 0 | [10 10] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.366882e-02 | | 27 | 3232 | 0 | [14 14] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 2.069179e-02 | | 28 | 4192 | 0 | [16 16] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.697001e-02 | | 29 | 4720 | 0 | [17 17] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.629277e-02 | | 30 | 4992 | 0 | [17 18] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.629277e-02 | | 31 | 80 | 0 | [2 2] | [16 8] | 8 | EvenPow2Spacing | 7.812500e-03, 8.718936e-02 | | 32 | 7248 | 0 | [30 30] | [16 8] | 8 | EvenPow2Spacing | 7.812500e-03, 3.020075e-02 | | 33 | 128 | 0 | [2 2] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 8.842091e-02 | | 34 | 7056 | 0 | [30 29] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 8.138325e-03 | | 35 | 3696 | 0 | [30 15] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 1.056678e-02 | | 36 | 112 | 0 | [2 2] | [16 8] | 16 | EvenPow2Spacing | 7.812500e-03, 8.776325e-02 | | 37 | 3888 | 0 | [30 8] | [16 8] | 16 | EvenPow2Spacing | 7.812500e-03, 3.088659e-02 | | 38 | 160 | 0 | [2 2] | [16 32] | 16 | EvenPow2Spacing | 7.812500e-03, 8.914277e-02 | | 39 | 3936 | 0 | [30 8] | [16 32] | 16 | EvenPow2Spacing | 7.812500e-03, 3.205415e-02 | | 40 | 176 | 0 | [2 2] | [16 8] | 32 | EvenPow2Spacing | 7.812500e-03, 8.776436e-02 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 16 | 7536 | 1 | [30 31] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 7.327236e-03 | S = 1x1 FunctionApproximation.LUTSolution with properties: ID: 16 Feasible: "true"
Сравните числовое поведение исходной интерполяционной таблицы с оптимизированной интерполяционной таблицей.
compare(S)
ans = 1x2 struct array with fields: Breakpoints Original Approximate
Сгенерируйте новый блок Lookup Table с помощью метода approximate
.
S.approximate
Когда это необходимо, чтобы оптимизировать и для памяти и для абсолютного допуска, полезно визуализировать компромиссы между двумя. Этот пример создает приближение интерполяционной таблицы функционального 1-exp(-x)
с переменными уровнями абсолютного допуска и создает график каждого найденного решения. В итоговом графике можно просмотреть компромиссы между эффективностью памяти и числовой точностью.
nTol = 32; % Initialize variables solutions = cell(1,nTol); objectiveValues = cell(1,nTol); constraintValues = cell(1,nTol); memoryUnits = 'bytes'; % Options for absolute tolerance absTol = 2.^linspace(-12,-4,nTol); % Relative tolerance is set to 0 relTol = 0; % Initialize options options = FunctionApproximation.Options( ... 'RelTol', relTol, ... 'BreakpointSpecification', 'EvenSpacing', ... 'Display', false, ... 'WordLengths', 16); % Setup the approximation problem problem = FunctionApproximation.Problem( ... @(x) 1 - exp(-x), ... 'InputTypes',numerictype(0,16), ... 'OutputType',numerictype(1,16,14), ... 'InputLowerBounds',0, ... 'InputUpperBounds',5, ... 'Options',options); % Execute to find solutions with different tolerances for iTol = 1:nTol problem.Options.AbsTol = absTol(iTol); solution = solve(problem); objectiveValues{iTol} = arrayfun(@(x) x.totalMemoryUsage(memoryUnits), solution.AllSolutions); constraintValues{iTol} = arrayfun(@(x) x.Feasible, solution.AllSolutions); solutions{iTol} = solution; end % Plot results h = figure(); hold on; for iTol = 1:nTol for iObjective = 1:numel(objectiveValues{iTol}) if constraintValues{iTol}(iObjective) markerColor = 'g'; else markerColor = 'r'; end plot(absTol(iTol),objectiveValues{iTol}(iObjective), ... 'Marker', '.' ,'LineStyle', 'none', ... 'MarkerSize', 24, ... 'MarkerEdgeColor', markerColor) end end xlabel('AbsTol') ylabel(['MemoryUsage (',memoryUnits,')']) h.Children.XScale = 'log'; h.Children.YMinorGrid = 'on'; grid on box on hold off;
Решения, которые неосуществимы, означая, что они не соответствуют необходимому абсолютному допуску, отмечены красным. Решения, которые выполнимы, отмечены зеленым. Когда абсолютный допуск увеличивается, приближение находит решения, которые используют меньше памяти. Когда абсолютный допуск ниже, указывая выше на числовую точность, необходимая память также увеличивается.
FunctionApproximation.LUTMemoryUsageCalculator
| FunctionApproximation.LUTSolution
| FunctionApproximation.Options
| FunctionApproximation.Problem