Следующие примеры показывают, как сгенерировать эффективные памятью интерполяционные таблицы программно. Используя командную строку, эквивалентную из 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 | 672 | 0 | 41 | 8 | 16 | EvenSpacing | 9.765625e-04, 3.322094e-02 | | 3 | 1648 | 1 | 102 | 8 | 16 | EvenSpacing | 9.765625e-04, 7.988139e-05 | | 4 | 480 | 0 | 29 | 8 | 16 | EvenSpacing | 9.765625e-04, 1.575496e-01 | | 5 | 1104 | 0 | 68 | 8 | 16 | EvenSpacing | 9.765625e-04, 1.970943e-03 | | 6 | 352 | 0 | 21 | 8 | 16 | EvenSpacing | 9.765625e-04, 3.322094e-02 | | 7 | 320 | 0 | 19 | 8 | 16 | EvenSpacing | 9.765625e-04, 9.553784e-02 | | 8 | 64 | 0 | 2 | 16 | 16 | EvenSpacing | 9.765625e-04, 9.853516e-01 | | 9 | 48 | 0 | 2 | 16 | 8 | EvenSpacing | 9.765625e-04, 9.853516e-01 | | 10 | 640 | 1 | 38 | 16 | 16 | EvenSpacing | 9.765625e-04, 6.281694e-04 | | 11 | 624 | 0 | 37 | 16 | 16 | EvenSpacing | 9.765625e-04, 3.435787e-03 | | 12 | 496 | 0 | 29 | 16 | 16 | EvenSpacing | 9.765625e-04, 9.943803e-04 | | 13 | 480 | 0 | 28 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.238521e-03 | | 14 | 560 | 0 | 33 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.970943e-03 | | 15 | 592 | 0 | 35 | 16 | 16 | EvenSpacing | 9.765625e-04, 3.679927e-03 | | 16 | 608 | 0 | 36 | 16 | 16 | EvenSpacing | 9.765625e-04, 2.703365e-03 | | 17 | 352 | 1 | 20 | 16 | 16 | EvenSpacing | 9.765625e-04, 5.671342e-04 | | 18 | 336 | 0 | 19 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.325779e-03 | | 19 | 208 | 0 | 11 | 16 | 16 | EvenSpacing | 9.765625e-04, 3.430176e-02 | | 20 | 272 | 0 | 15 | 16 | 16 | EvenSpacing | 9.765625e-04, 1.043701e-02 | | 21 | 304 | 0 | 17 | 16 | 16 | EvenSpacing | 9.765625e-04, 4.526615e-03 | | 22 | 320 | 0 | 18 | 16 | 16 | EvenSpacing | 9.765625e-04, 2.378452e-03 | | 23 | 48 | 0 | 2 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 1.300802e+00 | | 24 | 64 | 0 | 2 | 16 | 16 | EvenPow2Spacing | 9.765625e-04, 1.300802e+00 | | 25 | 1648 | 1 | 102 | 8 | 16 | EvenPow2Spacing | 9.765625e-04, 7.988139e-05 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 17 | 352 | 1 | 20 | 16 | 16 | EvenSpacing | 9.765625e-04, 5.671342e-04 | S = 1x1 FunctionApproximation.LUTSolution with properties: ID: 17 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: {[0 0.3307 0.6614 0.9921 1.3228 1.6534 1.9841 ... ]} BreakpointDataTypes: [1x1 embedded.numerictype] TableValues: [4.2725e-04 0.3278 0.6200 0.8420 0.9759 1.0063 ... ] TableDataType: [1x1 embedded.numerictype] IsEvenSpacing: 1 Interpolation: Linear
Чтобы получить доступ к сгенерированному блоку Lookup Table, используйте approximate
метод.
approximate(S)
В этом примере показано, как оптимизировать существующий блок 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 = 1×1 FunctionApproximation.Problem with properties: FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant' NumberOfInputs: 2 InputTypes: ["numerictype('single')" … ] InputLowerBounds: [50 0.0500] InputUpperBounds: [1000 0.9500] OutputType: "numerictype('single')" Options: [1×1 FunctionApproximation.Options]
Задайте дополнительные ограничения путем изменения Options
объект сопоставлен с Problem
объект, P
.
P.Options.BreakpointSpecification = "EvenSpacing"
P = 1×1 FunctionApproximation.Problem with properties: FunctionToApproximate: 'sldemo_fuelsys/fuel_rate_control/airflow_calc/Pumping Constant' NumberOfInputs: 2 InputTypes: ["numerictype('single')" … ] InputLowerBounds: [50 0.0500] InputUpperBounds: [1000 0.9500] OutputType: "numerictype('single')" Options: [1×1 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.047640e-01 | | 3 | 336 | 0 | [6 6] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 5.359873e-02 | | 4 | 288 | 0 | [5 6] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 5.763923e-02 | | 5 | 288 | 0 | [6 5] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 5.852598e-02 | | 6 | 248 | 0 | [5 5] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 6.255026e-02 | | 7 | 1016 | 0 | [11 11] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.738934e-02 | | 8 | 928 | 0 | [10 11] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.983925e-02 | | 9 | 928 | 0 | [11 10] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.738934e-02 | | 10 | 848 | 0 | [10 10] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.983925e-02 | | 11 | 3744 | 0 | [21 22] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.080366e-02 | | 12 | 3568 | 0 | [20 22] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.188371e-02 | | 13 | 3408 | 0 | [21 20] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.080366e-02 | | 14 | 3248 | 0 | [20 20] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.188371e-02 | | 15 | 7008 | 0 | [29 30] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.208317e-02 | | 16 | 9024 | 0 | [33 34] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.954298e-02 | | 17 | 10968 | 0 | [35 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.700278e-02 | | 18 | 11280 | 0 | [36 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.700279e-02 | | 19 | 11592 | 0 | [37 39] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 2.700279e-02 | | 20 | 840 | 0 | [9 11] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 4.118272e-02 | | 21 | 768 | 0 | [9 10] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 4.118272e-02 | | 22 | 3392 | 0 | [19 22] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.296377e-02 | | 23 | 3216 | 0 | [18 22] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.404382e-02 | | 24 | 3088 | 0 | [19 20] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.296377e-02 | | 25 | 2928 | 0 | [18 20] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.404382e-02 | | 26 | 1848 | 0 | [15 15] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.396479e-02 | | 27 | 1728 | 0 | [14 15] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.528193e-02 | | 28 | 1728 | 0 | [15 14] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.396479e-02 | | 29 | 1616 | 0 | [14 14] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.528193e-02 | | 30 | 6768 | 0 | [28 30] | [16 8] | 8 | EvenSpacing | 7.812500e-03, 3.208317e-02 | | 31 | 128 | 0 | [2 2] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.050016e-01 | | 32 | 384 | 0 | [6 6] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 5.586659e-02 | | 33 | 336 | 0 | [5 6] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 5.984835e-02 | | 34 | 336 | 0 | [6 5] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 6.017463e-02 | | 35 | 296 | 0 | [5 5] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 6.433061e-02 | | 36 | 1064 | 0 | [11 11] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.046093e-02 | | 37 | 976 | 0 | [10 11] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.175766e-02 | | 38 | 976 | 0 | [11 10] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.295625e-02 | | 39 | 896 | 0 | [10 10] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.429314e-02 | | 40 | 3624 | 0 | [21 21] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.124774e-02 | | 41 | 3456 | 0 | [20 21] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.233026e-02 | | 42 | 3456 | 0 | [21 20] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.124774e-02 | | 43 | 3296 | 0 | [20 20] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.233026e-02 | | 44 | 6824 | 1 | [29 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 5.957022e-03 | | 45 | 5096 | 0 | [25 25] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.076232e-02 | | 46 | 5928 | 0 | [27 27] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.914692e-03 | | 47 | 6368 | 0 | [28 28] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.589452e-03 | | 48 | 888 | 0 | [9 11] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.302356e-02 | | 49 | 816 | 0 | [9 10] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 3.558207e-02 | | 50 | 3288 | 0 | [19 21] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.350690e-02 | | 51 | 3120 | 0 | [18 21] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.479964e-02 | | 52 | 3136 | 0 | [19 20] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.350690e-02 | | 53 | 2976 | 0 | [18 20] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.479964e-02 | | 54 | 4704 | 0 | [24 24] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.145920e-02 | | 55 | 5504 | 0 | [26 26] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.017491e-02 | | 56 | 1896 | 0 | [15 15] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.783914e-02 | | 57 | 1776 | 0 | [14 15] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.897344e-02 | | 58 | 1776 | 0 | [15 14] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 2.034441e-02 | | 59 | 1664 | 0 | [14 14] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 2.103841e-02 | | 60 | 6592 | 0 | [28 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.247549e-03 | | 61 | 6592 | 0 | [29 28] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.316519e-03 | | 62 | 2984 | 0 | [19 19] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.350690e-02 | | 63 | 2832 | 0 | [18 19] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.479964e-02 | | 64 | 3576 | 0 | [15 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.783914e-02 | | 65 | 5200 | 0 | [22 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.143289e-02 | | 66 | 5896 | 0 | [25 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.042340e-02 | | 67 | 6360 | 0 | [27 29] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.646382e-03 | | 68 | 3576 | 0 | [29 15] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 1.082333e-02 | | 69 | 5200 | 1 | [29 22] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 4.794985e-03 | | 70 | 4272 | 1 | [29 18] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 6.289935e-03 | | 71 | 3808 | 0 | [29 16] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 9.146322e-03 | | 72 | 4040 | 1 | [29 17] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 4.853550e-03 | | 73 | 112 | 0 | [2 2] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 1.054412e-01 | | 74 | 624 | 0 | [6 6] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 5.441330e-02 | | 75 | 528 | 0 | [5 6] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 5.850855e-02 | | 76 | 528 | 0 | [6 5] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 5.939646e-02 | | 77 | 448 | 0 | [5 5] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 6.331635e-02 | | 78 | 1984 | 0 | [11 11] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.825822e-02 | | 79 | 1808 | 0 | [10 11] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 4.057692e-02 | | 80 | 1808 | 0 | [11 10] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.825822e-02 | | 81 | 1648 | 0 | [10 10] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 4.057692e-02 | | 82 | 2752 | 0 | [13 13] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.730308e-02 | | 83 | 3184 | 0 | [14 14] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.596578e-02 | | 84 | 3648 | 0 | [15 15] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.462848e-02 | | 85 | 1632 | 0 | [9 11] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 4.191638e-02 | | 86 | 1488 | 0 | [9 10] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 4.191638e-02 | | 87 | 3408 | 0 | [14 15] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.596578e-02 | | 88 | 3408 | 0 | [15 14] | [16 8] | 16 | EvenSpacing | 7.812500e-03, 3.462848e-02 | | 89 | 160 | 0 | [2 2] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.056962e-01 | | 90 | 672 | 0 | [6 6] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 5.635968e-02 | | 91 | 576 | 0 | [5 6] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 6.042931e-02 | | 92 | 576 | 0 | [6 5] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 6.089415e-02 | | 93 | 496 | 0 | [5 5] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 6.486682e-02 | | 94 | 2032 | 0 | [11 11] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.087381e-02 | | 95 | 1856 | 0 | [10 11] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.201155e-02 | | 96 | 1856 | 0 | [11 10] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.321355e-02 | | 97 | 1696 | 0 | [10 10] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.438402e-02 | | 98 | 2800 | 0 | [13 13] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 2.427534e-02 | | 99 | 3232 | 0 | [14 14] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 2.115314e-02 | | 100 | 3696 | 0 | [15 15] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.867522e-02 | | 101 | 1680 | 0 | [9 11] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.326033e-02 | | 102 | 1536 | 0 | [9 10] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 3.565893e-02 | | 103 | 3456 | 0 | [14 15] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 1.988021e-02 | | 104 | 3456 | 0 | [15 14] | [16 32] | 16 | EvenSpacing | 7.812500e-03, 2.043030e-02 | | 105 | 80 | 0 | [2 2] | [16 8] | 8 | EvenPow2Spacing | 7.812500e-03, 8.762666e-02 | | 106 | 560 | 0 | [8 8] | [16 8] | 8 | EvenPow2Spacing | 7.812500e-03, 4.444923e-02 | | 107 | 1848 | 0 | [15 15] | [16 8] | 8 | EvenPow2Spacing | 7.812500e-03, 3.133052e-02 | | 108 | 128 | 0 | [2 2] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 8.876663e-02 | | 109 | 608 | 0 | [8 8] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 4.280622e-02 | | 110 | 1896 | 0 | [15 15] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 1.728861e-02 | | 111 | 112 | 0 | [2 2] | [16 8] | 16 | EvenPow2Spacing | 7.812500e-03, 8.821256e-02 | | 112 | 1072 | 0 | [8 8] | [16 8] | 16 | EvenPow2Spacing | 7.812500e-03, 4.520058e-02 | | 113 | 3648 | 0 | [15 15] | [16 8] | 16 | EvenPow2Spacing | 7.812500e-03, 3.195386e-02 | | 114 | 160 | 0 | [2 2] | [16 32] | 16 | EvenPow2Spacing | 7.812500e-03, 8.949983e-02 | | 115 | 1120 | 0 | [8 8] | [16 32] | 16 | EvenPow2Spacing | 7.812500e-03, 4.298368e-02 | | 116 | 3696 | 0 | [15 15] | [16 32] | 16 | EvenPow2Spacing | 7.812500e-03, 1.766077e-02 | | 117 | 176 | 0 | [2 2] | [16 8] | 32 | EvenPow2Spacing | 7.812500e-03, 8.821365e-02 | | 118 | 2096 | 0 | [8 8] | [16 8] | 32 | EvenPow2Spacing | 7.812500e-03, 4.520053e-02 | | 119 | 224 | 0 | [2 2] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 1.056971e-01 | | 120 | 1248 | 0 | [6 6] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 5.635974e-02 | | 121 | 1056 | 0 | [5 6] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 6.042954e-02 | | 122 | 1056 | 0 | [6 5] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 6.089419e-02 | | 123 | 896 | 0 | [5 5] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 6.486649e-02 | | 124 | 3968 | 0 | [11 11] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.087266e-02 | | 125 | 3616 | 0 | [10 11] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.201098e-02 | | 126 | 3616 | 0 | [11 10] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.321287e-02 | | 127 | 3296 | 0 | [10 10] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.438386e-02 | | 128 | 3264 | 0 | [9 11] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.325982e-02 | | 129 | 2976 | 0 | [9 10] | [16 32] | 32 | EvenSpacing | 7.812500e-03, 3.565864e-02 | | 130 | 224 | 0 | [2 2] | [16 32] | 32 | EvenPow2Spacing | 7.812500e-03, 8.950080e-02 | | 131 | 2144 | 0 | [8 8] | [16 32] | 32 | EvenPow2Spacing | 7.812500e-03, 4.298387e-02 | | 132 | 128 | 0 | [2 2] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 9.900912e-02 | | 133 | 416 | 0 | [8 5] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 5.790341e-02 | | 134 | 1176 | 0 | [15 9] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 3.455174e-02 | | 135 | 3936 | 0 | [30 16] | [16 32] | 8 | EvenPow2Spacing | 7.812500e-03, 1.060568e-02 | | 136 | 224 | 0 | [2 2] | [16 32] | 32 | EvenPow2Spacing | 7.812500e-03, 1.067945e-01 | | 137 | 1216 | 0 | [7 5] | [16 32] | 32 | EvenPow2Spacing | 7.812500e-03, 6.091571e-02 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 72 | 4040 | 1 | [29 17] | [16 32] | 8 | EvenSpacing | 7.812500e-03, 4.853550e-03 | S = 1×1 FunctionApproximation.LUTSolution with properties: ID: 72 Feasible: "true"
Сравните числовое поведение исходной интерполяционной таблицы с оптимизированной интерполяционной таблицей.
compare(S)
ans = 1×2 struct array with fields: Breakpoints Original Approximate
Сгенерируйте новый блок Lookup Table с помощью approximate
метод.
S.approximate
%#ok<*NOPTS>
Когда это необходимо, чтобы оптимизировать и для памяти и для абсолютной погрешности, полезно визуализировать компромиссы между двумя. Этот пример создает приближение интерполяционной таблицы функционального 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;
Решения, которые неосуществимы, означая, что они не соответствуют необходимой абсолютной погрешности, отмечены красным. Решения, которые выполнимы, отмечены зеленым. Когда абсолютная погрешность увеличивается, приближение находит решения, которые используют меньше памяти. Когда абсолютная погрешность ниже, указывая выше на числовую точность, необходимая память также увеличивается.
Этот пример сравнивает приближения интерполяционной таблицы, сгенерированные для tanh
функционируйте когда OnCurveTableValues
свойство FunctionApproximation.Options
объект установлен в true
и false
. OnCurveTableValues
свойство задает, должны ли табличные значения оптимизированного приближения интерполяционной таблицы быть равны квантованному выходу исходной аппроксимируемой функции. В некоторых случаях, путем устанавливания этого значения к false
, сгенерированное приближение интерполяционной таблицы может обеспечить те же ошибочные допуски при сокращении памяти, используемой интерполяционной таблицей.
Создайте приближение интерполяционной таблицы Используя на табличных значениях кривой
Используйте FunctionApproximation.Problem
объект задать функцию, чтобы аппроксимировать интерполяционной таблицей. По умолчанию, OnCurveTableValues
свойство связанного Options
объект установлен в ложь. Установите это свойство на true, чтобы ограничить табличные значения к квантованному выходу аппроксимируемой функции.
P1 = FunctionApproximation.Problem('tanh');
P1.Options.OnCurveTableValues = 1
P1 = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: @(x)tanh(x) NumberOfInputs: 1 InputTypes: "numerictype(1,16,12)" InputLowerBounds: -8 InputUpperBounds: 8 OutputType: "numerictype(1,16,15)" Options: [1x1 FunctionApproximation.Options]
Сгенерируйте приближение интерполяционной таблицы.
S1 = solve(P1)
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 64 | 0 | 2 | 16 | 16 | EvenSpacing | 7.812500e-03, 9.999998e-01 | | 1 | 1248 | 1 | 76 | 16 | 16 | EvenSpacing | 7.812500e-03, 4.368265e-03 | | 2 | 1232 | 1 | 75 | 16 | 16 | EvenSpacing | 7.812500e-03, 4.439035e-03 | | 3 | 944 | 1 | 57 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.780470e-03 | | 4 | 928 | 0 | 56 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.990307e-03 | | 5 | 656 | 0 | 39 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.678519e-02 | | 6 | 640 | 0 | 38 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.660649e-02 | | 7 | 784 | 0 | 47 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.102459e-02 | | 8 | 864 | 0 | 52 | 16 | 16 | EvenSpacing | 7.812500e-03, 9.403441e-03 | | 9 | 896 | 0 | 54 | 16 | 16 | EvenSpacing | 7.812500e-03, 8.643626e-03 | | 10 | 912 | 0 | 55 | 16 | 16 | EvenSpacing | 7.812500e-03, 8.316993e-03 | | 11 | 496 | 0 | 29 | 16 | 16 | EvenSpacing | 7.812500e-03, 2.894880e-02 | | 12 | 720 | 0 | 43 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.355547e-02 | | 13 | 832 | 0 | 50 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.019267e-02 | | 14 | 880 | 0 | 53 | 16 | 16 | EvenSpacing | 7.812500e-03, 8.881069e-03 | | 15 | 448 | 1 | 14 | 16 | 16 | ExplicitValues | 7.812500e-03, 7.801827e-03 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 15 | 448 | 1 | 14 | 16 | 16 | ExplicitValues | 7.812500e-03, 7.801827e-03 |
S1 = 1x1 FunctionApproximation.LUTSolution with properties: ID: 15 Feasible: "true"
Создайте приближение интерполяционной таблицы Используя любые табличные значения
Создайте другой FunctionApproximation.Problem
объект. Установите OnCurveTableValues
свойство этого объекта ко лжи, чтобы позволить оптимизации оптимизировать табличные значения, а также точки останова.
P2 = FunctionApproximation.Problem('tanh');
P2.Options.OnCurveTableValues = 0
P2 = 1x1 FunctionApproximation.Problem with properties: FunctionToApproximate: @(x)tanh(x) NumberOfInputs: 1 InputTypes: "numerictype(1,16,12)" InputLowerBounds: -8 InputUpperBounds: 8 OutputType: "numerictype(1,16,15)" Options: [1x1 FunctionApproximation.Options]
Сгенерируйте приближение интерполяционной таблицы.
S2 = solve(P2)
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 64 | 0 | 2 | 16 | 16 | EvenSpacing | 7.812500e-03, 9.999998e-01 | | 1 | 1248 | 1 | 76 | 16 | 16 | EvenSpacing | 7.812500e-03, 4.368265e-03 | | 2 | 1232 | 1 | 75 | 16 | 16 | EvenSpacing | 7.812500e-03, 4.439035e-03 | | 3 | 944 | 1 | 57 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.780470e-03 | | 4 | 928 | 1 | 56 | 16 | 16 | EvenSpacing | 7.812500e-03, 6.110240e-03 | | 5 | 656 | 0 | 39 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.678519e-02 | | 6 | 640 | 0 | 38 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.660649e-02 | | 7 | 784 | 1 | 47 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.743777e-03 | | 8 | 704 | 1 | 42 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.805676e-03 | | 9 | 672 | 1 | 40 | 16 | 16 | EvenSpacing | 7.812500e-03, 7.809550e-03 | | 10 | 368 | 0 | 21 | 16 | 16 | EvenSpacing | 7.812500e-03, 4.855583e-02 | | 11 | 512 | 0 | 30 | 16 | 16 | EvenSpacing | 7.812500e-03, 2.773526e-02 | | 12 | 592 | 0 | 35 | 16 | 16 | EvenSpacing | 7.812500e-03, 2.088471e-02 | | 13 | 624 | 0 | 37 | 16 | 16 | EvenSpacing | 7.812500e-03, 1.870074e-02 | | 14 | 384 | 1 | 12 | 16 | 16 | ExplicitValues | 7.812500e-03, 7.812317e-03 | | 15 | 384 | 0 | 12 | 16 | 16 | ExplicitValues | 7.812500e-03, 1.196141e-02 | | 16 | 384 | 1 | 12 | 16 | 16 | ExplicitValues | 7.812500e-03, 7.812317e-03 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 14 | 384 | 1 | 12 | 16 | 16 | ExplicitValues | 7.812500e-03, 7.812317e-03 |
S2 = 1x1 FunctionApproximation.LUTSolution with properties: ID: 14 Feasible: "true"
Просмотр результатов
Сравните лучшие решения для каждого приближения интерполяционной таблицы.
compare(S1)
ans = struct with fields:
Breakpoints: [65536x1 double]
Original: [65536x1 double]
Approximate: [65536x1 double]
compare(S2)
ans = struct with fields:
Breakpoints: [65536x1 double]
Original: [65536x1 double]
Approximate: [65536x1 double]
Максимальная погрешность между исходной функцией и двумя приближениями интерполяционной таблицы приблизительно равна, однако память, используемая интерполяционной таблицей, которая не была ограничена к использованию только на табличных значениях кривой, значительно ниже.
percent_reduction = S2.totalMemoryUsage/S1.totalMemoryUsage
percent_reduction = 0.8571
FunctionApproximation.Problem
| FunctionApproximation.Options
| FunctionApproximation.LUTSolution
| FunctionApproximation.LUTMemoryUsageCalculator