Используя Оптимизатор Интерполяционной таблицы, можно сгенерировать прямую интерполяционную таблицу, аппроксимирующую блок 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 | 16384 | 0 | [8 256] | [3 8] | 8 | 6.250000e-02, 4.636476e-01 | | 5 | 32768 | 1 | [16 256] | [5 8] | 8 | 6.250000e-02, 3.902460e-03 | | 6 | 20480 | 1 | [16 256] | [4 8] | 5 | 6.250000e-02, 3.123983e-02 | | 7 | 14336 | 1 | [16 128] | [4 7] | 7 | 6.250000e-02, 5.707978e-02 | | 8 | 14336 | 0 | [8 256] | [3 8] | 7 | 6.250000e-02, 4.636476e-01 | | 9 | 28672 | 1 | [16 256] | [5 8] | 7 | 6.250000e-02, 7.811287e-03 | | 10 | 16384 | 1 | [16 256] | [4 8] | 4 | 6.250000e-02, 6.242911e-02 | | 11 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 11 | 12288 | 1 | [16 128] | [4 7] | 6 | 6.250000e-02, 5.870371e-02 | solution = 1x1 FunctionApproximation.LUTSolution with properties: ID: 11 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 | 458752 | 1 | 65536 | 16 | 7 | 2.000000e-01, 3.173828e-02 | | 2 | 524288 | 1 | 65536 | 16 | 8 | 2.000000e-01, 1.611328e-02 | | 3 | 3584 | 1 | 512 | 9 | 7 | 2.000000e-01, 1.093750e-01 | | 4 | 1792 | 1 | 256 | 8 | 7 | 2.000000e-01, 1.872559e-01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Intermediate WLs | TableData WL | Error(Max,Current) | | 4 | 1792 | 1 | 256 | 8 | 7 | 2.000000e-01, 1.872559e-01 |
Сравните исходное поведение подсистемы с приближением интерполяционной таблицы.
compare(solution);
Сгенерируйте новую подсистему, содержащую приближение интерполяционной таблицы.
approximate(solution);
Замените исходную подсистему на новую подсистему, содержащую приближение интерполяционной таблицы.
replaceWithApproximate(solution);
Можно вернуться модель назад к ее исходному состоянию с помощью функции revertToOriginal
. Эта функция помещает исходную подсистему назад в модель.
revertToOriginal(solution);