Используя Lookup Table Optimizer, можно сгенерировать прямую интерполяционную таблицу, аппроксимирующую блок Simulink® или функцию. Прямые интерполяционные таблицы эффективны, чтобы реализовать на оборудовании, потому что они не требуют никаких вычислений.
Создайте FunctionApproximation.Problem
объект, задающий функцию, для которой можно сгенерировать аппроксимированное. Чтобы сгенерировать прямую интерполяционную таблицу, установите метод интерполяции для None
в FunctionApproximation.Options
объект.
problem = FunctionApproximation.Problem('atan2'); problem.InputTypes = [numerictype(0,4,2) numerictype(0,8,4)]; problem.OutputType = fixdt(0,8,7); problem.Options.Interpolation = "None"; problem.Options.AbsTol = 2^-4; problem.Options.RelTol = 0; problem.Options.WordLengths = 1:8;
Используйте solve
метод, чтобы сгенерировать оптимальную интерполяционную таблицу.
solution = solve(problem)
| ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 32768 | 1 | [16 256] | [4 8] | 8 | 6.250000e-02, 3.902460e-03 | | 1 | 28672 | 1 | [16 256] | [4 8] | 7 | 6.250000e-02, 7.811287e-03 | | 2 | 24576 | 1 | [16 256] | [4 8] | 6 | 6.250000e-02, 1.561990e-02 | | 3 | 16384 | 1 | [16 128] | [4 7] | 8 | 6.250000e-02, 6.242016e-02 | | 4 | 14336 | 1 | [16 128] | [4 7] | 7 | 6.250000e-02, 5.707978e-02 | | 5 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | | 6 | 10240 | 0 | [16 128] | [4 7] | 5 | 6.250000e-02, 8.585766e-02 | | 7 | 8192 | 0 | [16 128] | [4 7] | 4 | 6.250000e-02, 1.020576e-01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 5 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | solution = 1x1 FunctionApproximation.LUTSolution with properties: ID: 5 Feasible: "true"
Используйте compare
метод, чтобы сравнить выход исходной функции и аппроксимированного.
compare(solution);
Используйте approximate
метод, чтобы сгенерировать подсистему Simulink™, содержащую сгенерированную прямую интерполяционную таблицу.
approximate(solution)
В этом примере показано, как аппроксимировать подсистему Simulink™ прямой интерполяционной таблицей.
Откройте модель, содержащую подсистему, чтобы аппроксимировать.
functionToApproximate = 'ex_direct_approximation/MathExpression'; open_system('ex_direct_approximation');
Чтобы сгенерировать прямую интерполяционную таблицу, установите метод интерполяции для None
.
problem = FunctionApproximation.Problem(functionToApproximate);
problem.Options.Interpolation = 'None';
problem.Options.RelTol = 0;
problem.Options.AbsTol = 0.2;
problem.Options.WordLengths = [7 8 9 16];
solution = solve(problem);
| ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 2097152 | 1 | 65536 | 16 | 32 | 2.000000e-01, 0.000000e+00 | | 1 | 896 | 0 | 128 | 7 | 7 | 2.000000e-01, 2.265625e+00 | | 2 | 1024 | 0 | 128 | 7 | 8 | 2.000000e-01, 2.265625e+00 | | 3 | 1152 | 0 | 128 | 7 | 9 | 2.000000e-01, 2.265625e+00 | | 4 | 2048 | 0 | 128 | 7 | 16 | 2.000000e-01, 2.267090e+00 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 0 | 2097152 | 1 | 65536 | 16 | 32 | 2.000000e-01, 0.000000e+00 |
Сравните исходное поведение подсистемы с приближением интерполяционной таблицы.
compare(solution);
Сгенерируйте новую подсистему, содержащую приближение интерполяционной таблицы.
approximate(solution);
Замените исходную подсистему на новую подсистему, содержащую приближение интерполяционной таблицы.
replaceWithApproximate(solution);
Можно вернуться модель назад к ее исходному состоянию с помощью revertToOriginal
функция. Эта функция помещает исходную подсистему назад в модель.
revertToOriginal(solution);