Аппроксимация функций с помощью интерполяционной таблицы

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