В этом примере показано, как использовать поступательные и reflectional симметрии в функциях для того, чтобы оптимизировать интерполяционные таблицы.
Функции имеют симметрию, если функции неизменны простыми математическими операциями, такими как перевод, вращение или отражение. Когда функция имеет симметрию, целая область значений функции может быть сгенерирована из меньшей области функции. После построения этой меньшей области можно перевести, отразить и вращать его, чтобы получить остаток от функции. Это свойство функций с симметрией полезно для встраиваемых приложений.
Периодические функции являются функциями с дискретной поступательной симметрией. Дискретная поступательная симметрия означает это в течение периода, в течение любого целого числа. Учитывая любого, можно вычислить значение при помощи идентичности. Это вычисление эквивалентно переводу целочисленным кратным, таково что.
Функции могут также иметь reflectional симметрии о линиях или точках в Декартовой плоскости. Наиболее распространенными примерами являются четные и нечетные функции. Четные функции симметричны об оси Y, означая. Нечетные функции симметричны при отражении через начало координат, которое описывается как. Функции могут также быть четными или нечетные относительно других линий и точек в плоскости. Функция, которая является четной относительно линии, будет выполняться. Точно так же функция, которая является нечетной относительно точки, будет выполняться.
Интерполяционные таблицы используются, чтобы сохранить результаты дорогих вычислений. Эти таблицы аппроксимируют функцию путем нахождения соответствующей записи в таблице для данного входа. Часто, вход точно не совпадает с тем, который хранится. В этом случае дальнейшее приближение, такое как интерполяция или округление, необходимо. Дальнейшее приближение вызывает числовые ошибки, которые могут уменьшаться путем составления большей таблицы. Таким образом существует компромисс между точностью интерполяционной таблицы аппроксимации и КПД памяти таблицы.
При аппроксимации симметричной функции только необходимо сохранить область полного образа функции. Можно создать остаток путем применения операций симметрии к этой области. Этот процесс создает меньшие, более эффективные памятью интерполяционные таблицы, не жертвуя числовой эффективностью.
Чтобы продемонстрировать, как использовать симметрии, чтобы уменьшать пробел в интерполяционной таблице, мы будем использовать суперпозицию двух функций синусоиды. Эта функция должна быть просмотрена как нетривиальная модель, которая иллюстрирует эту концепцию.
Когда две или больше синусоиды накладываются, они создают отличный интерференционный шаблон, который зависит от амплитудной и относительной фазы каждой синусоиды. Если отношение периодов синусоид рационально, то суперпозиция синусоид является периодической также с периодом, равным наименьшему общему кратному каждого периода. Интерференция может привести к симметричной подструктуре в каждый период, хотя не всегда.
Рассмотрите функцию. Эта функция имеет период, а также ровная ось симметрии о линии. Можно использовать оба из этих значений, чтобы создать эффективную интерполяционную таблицу.
График ниже показов первый период функции, с осью даже симметрии, показавшей точечной вертикальной линией.
h = figure; x = 0:0.001:0.5; f = @(x) 3.*sin(20.*pi.*(x - 0.125)) + 4 .* cos(24.*pi.*(x-0.125)); p0 = plot(x, f(x), 'k-'); YLim = [-8, 8]; hold on; a = h.Children(1); a.YLim = YLim; p1 = plot(a, [0.25 0.25], YLim, 'k--');
Рассмотрите случай, где входные параметры лежат в диапазоне от 0 до 10 с точностью приблизительно трех десятичных разрядов. Чтобы смоделировать это, используйте вход числовой тип с 14 битами, 10 из них дробный.
inputNt = numerictype(0, 14, 10);
Используйте приближение функций, чтобы сгенерировать эффективную памятью интерполяционную таблицу для любой тестовой функции. Опишите задачу приближения путем создания FunctionApproximation.Problem
объект. Используйте solve
метод, чтобы решить задачу оптимизации.
problem = FunctionApproximation.Problem(f);
problem.InputLowerBounds = 0;
problem.InputUpperBounds = 10;
problem.InputTypes = inputNt;
s1 = problem.solve();
fprintf("Lookup table uses %3.2f Kilobytes\n", s1.totalMemoryUsage ./ 2^10);
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 92 | 0 | 2 | 14 | 32 | EvenSpacing | 7.812500e-03, 1.368395e+01 | | 1 | 163900 | 1 | 5121 | 14 | 32 | EvenSpacing | 7.812500e-03, 5.173779e-03 | | 2 | 109276 | 0 | 3414 | 14 | 32 | EvenSpacing | 7.812500e-03, 1.037254e-02 | | 3 | 65596 | 0 | 2049 | 14 | 32 | EvenSpacing | 7.812500e-03, 5.183705e-02 | | 4 | 81980 | 0 | 2561 | 14 | 32 | EvenSpacing | 7.812500e-03, 2.058212e-02 | | 5 | 156 | 0 | 2 | 14 | 64 | EvenSpacing | 7.812500e-03, 1.368395e+01 | | 6 | 128 | 0 | 2 | 32 | 32 | EvenSpacing | 7.812500e-03, 1.368395e+01 | | 7 | 131164 | 0 | 2049 | 14 | 64 | EvenSpacing | 7.812500e-03, 5.183710e-02 | | 8 | 92 | 0 | 2 | 14 | 32 | EvenPow2Spacing | 7.812500e-03, 1.368395e+01 | | 9 | 81980 | 0 | 2561 | 14 | 32 | EvenPow2Spacing | 7.812500e-03, 2.058212e-02 | | 10 | 156 | 0 | 2 | 14 | 64 | EvenPow2Spacing | 7.812500e-03, 1.368395e+01 | | 11 | 128 | 0 | 2 | 32 | 32 | EvenPow2Spacing | 7.812500e-03, 1.368395e+01 | | 12 | 138000 | 0 | 3000 | 14 | 32 | ExplicitValues | 7.812500e-03, 1.037254e-02 | | 13 | 150006 | 1 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.548735e-03 | | 14 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.920225e-03 | | 15 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.920225e-03 | | 16 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.920225e-03 | | 17 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.920225e-03 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 13 | 150006 | 1 | 3261 | 14 | 32 | ExplicitValues | 7.812500e-03, 7.548735e-03 | Lookup table uses 146.49 Kilobytes
В этом случае интерполяционная таблица является большой.
Оптимизация интерполяционной таблицы в меньшей области значений входных результатов в меньшей интерполяционной таблице, когда меньше значений функции хранится в таблице. В данном примере только область значений для x
между 0 и 1/2 должен храниться в приближении интерполяционной таблицы. Корректировка входа верхние и нижние границы и решение демонстрирует сохраненную память.
problem.InputLowerBounds = 0;
problem.InputUpperBounds = 0.25;
s2 = problem.solve();
sprintf("Lookup table uses %1.2f Kilobytes", s2.totalMemoryUsage ./ 2^10)
| ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 0 | 48 | 0 | 2 | 8 | 16 | EvenSpacing | 7.812500e-03, 1.262720e+01 | | 1 | 32 | 0 | 2 | 8 | 8 | EvenSpacing | 7.812500e-03, 1.262720e+01 | | 2 | 2080 | 1 | 129 | 8 | 16 | EvenSpacing | 7.812500e-03, 5.183465e-03 | | 3 | 1056 | 0 | 65 | 8 | 16 | EvenSpacing | 7.812500e-03, 2.062116e-02 | | 4 | 80 | 0 | 2 | 8 | 32 | EvenSpacing | 7.812500e-03, 1.262720e+01 | | 5 | 48 | 0 | 2 | 8 | 16 | EvenPow2Spacing | 7.812500e-03, 1.262720e+01 | | 6 | 32 | 0 | 2 | 8 | 8 | EvenPow2Spacing | 7.812500e-03, 1.262720e+01 | | 7 | 1056 | 0 | 65 | 8 | 16 | EvenPow2Spacing | 7.812500e-03, 2.062116e-02 | | 8 | 80 | 0 | 2 | 8 | 32 | EvenPow2Spacing | 7.812500e-03, 1.262720e+01 | | 9 | 2544 | 1 | 106 | 8 | 16 | ExplicitValues | 7.812500e-03, 5.960266e-03 | | 10 | 2448 | 0 | 102 | 8 | 16 | ExplicitValues | 7.812500e-03, 1.194193e-02 | | 11 | 2448 | 0 | 102 | 8 | 16 | ExplicitValues | 7.812500e-03, 1.106188e-02 | | 12 | 2712 | 1 | 113 | 8 | 16 | ExplicitValues | 7.812500e-03, 7.545040e-03 | | 13 | 144 | 0 | 2 | 8 | 64 | EvenSpacing | 7.812500e-03, 1.262720e+01 | | 14 | 128 | 0 | 2 | 32 | 32 | EvenSpacing | 7.812500e-03, 1.262720e+01 | | 15 | 144 | 0 | 2 | 8 | 64 | EvenPow2Spacing | 7.812500e-03, 1.262720e+01 | | 16 | 128 | 0 | 2 | 32 | 32 | EvenPow2Spacing | 7.812500e-03, 1.262720e+01 | Best Solution | ID | Memory (bits) | Feasible | Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 2 | 2080 | 1 | 129 | 8 | 16 | EvenSpacing | 7.812500e-03, 5.183465e-03 | ans = "Lookup table uses 2.03 Kilobytes"
Используйте approximate
метод, чтобы сгенерировать блок Lookup Table из интерполяционной таблицы уменьшаемого размера в предыдущем примере.
s2.approximate();
Эта модель демонстрирует, как объединить симметрии функции, взятой в качестве примера, с интерполяционной таблицей, чтобы получить точное приближение. Блок-схема иллюстрирует, как использовать операции симметрии в conjuntion с интерполяционной таблицей, найденной в предыдущем примере. Интерполяционная таблица, сохраненная в блоке под названием Approximation
содержит значения функции для входных параметров между 0 и 0.25.
open_system('ModelWithApproximation')
Подсистема под названием Translate to First Half Period
демонстрирует, как использовать блок Modulo by Constant, чтобы уменьшать входной параметр функции до полуоткрытого интервала [0, 0.25). Обратите внимание на то, что этот блок использует значение 0.25 вместо 0,5, потому что вы используете обоих поступательные и зеркальные симметрии функции для КПД. Поскольку этот блок спроектирован для встроенного КПД, он может уменьшать это вычисление до броска, когда 0.25 степень 2.
open_system('ModelWithApproximation/Translate to First Half Period')
Чтобы использовать зеркальную симметрию, сначала проверяйте, в котором половине полного периода находится каждый вход. Если, отразитесь об оси симметрии в первый период. Используйте блок Modulo by Constant, чтобы выполнить эту операцию.
open_system('ModelWithApproximation/Use Mirror Symmetry?')
Подсистема под названием Get Index
преобразует в индекс интерполяционной таблицы. Это берет в булевом аргументе, чтобы указать, необходимо ли отразиться об оси симметрии. Если так, вычтен от 0,5, чтобы получить индекс в интерполяционную таблицу. В противном случае, используется, чтобы получить индекс.
open_system('ModelWithApproximation/Get Index');
Используйте блок MATLAB function, чтобы сгенерировать подходящую базовую линию с плавающей точкой, чтобы сравнить приближение интерполяционной таблицы. Тело функции показывают здесь.
Создайте данные от 0 до 10 и симулируйте модель. Эта область значений даст возможность видеть повторяющийся интерференционный шаблон, показанный обоими приближение интерполяционной таблицы, а также базовая линия.
SampleData.signals.values = fi((0:pow2(-10):10)', inputNt);
SampleData.signals.dims = [1,1];
SampleData.time = (0:1:length(SampleData.signals.values)-1)';
sim('ModelWithApproximation');
Осциллограф ниже сравнивает приближение и базовую линию. Диаграмма погрешностей показывает, что приближение с помощью сжатой интерполяционной таблицы соглашается хорошо со значением с двойной точностью функции, взятой в качестве примера.
FunctionApproximation.Problem
| Modulo by Constant