Используя 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);