主要内容

优化周期函数的查找表

这个例子展示了如何在函数中使用平移对称和反射对称来优化查找表。

与对称函数

如果函数通过简单的数学运算(如平移、旋转或反射)保持不变,则函数具有对称性。当一个函数具有对称性时,该函数的整个范围可以由该函数的较小区域生成。在构造这个较小的区域之后,您可以平移、反射和旋转它,以获得函数的剩余部分。具有对称性的函数的这一特性对于嵌入式应用程序非常有用。

周期函数与离散平移对称

周期函数是具有离散平移对称的函数。离散平移对称意味着对于周期元新台币$f(x) = f(x +nT)$对于任何一个整数n美元.给出任何x美元,你可以计算的值f (x)美元通过使用恒等式$f(x) = f(x\ mod\ T)$.这个计算相当于翻译x美元乘以的整数倍元新台币,这样$0 \le x - nT < T$

周期函数与反射对称性

函数也可以具有关于笛卡尔平面上的线或点的反射对称性。最常见的例子是奇偶函数。偶函数是对称的y设在,意思是$ f (x) = f (- x)美元.奇函数在原点反射下对称,表示为美元- f (x) = f (- x)美元.对于平面上的其他直线和点,函数也可以是偶的或奇的。一个关于直线的偶函数$ x =加元要服从$f(C + \Delta x) = f(C - \Delta x)$.类似地,一个函数对该点是奇的$(x,y) = (C, 0)$要服从$-f(C+\Delta x) = f(C - \Delta x)$

对称函数查找表

查找表用于存储昂贵的计算结果。这些表通过在表中为给定输入找到适当的条目来近似一个函数。通常,输入与所存储的输入不完全匹配。在这种情况下,需要进一步的逼近,例如插值或舍入。进一步的近似会导致数值误差,可以通过创建一个更大的表来减少这种误差。因此,在近似查找表的准确性和表的内存效率之间存在权衡。

当近似一个对称函数时,您只需要存储该函数的完整图像的一个区域。你可以通过对这个区域应用对称运算来构造余数。这个过程创建更小、内存效率更高的查找表,而不会牺牲数值性能。

使用查找表近似正弦曲线的叠加

为了演示如何使用对称性来减少查找表中的空间,我们将使用两个正弦函数的叠加。这个函数应该被看作是演示这个概念的一个非平凡模型。

当两个或多个正弦信号叠加时,它们会产生一个不同的干涉图样,该图样依赖于每个正弦信号的振幅和相对相位。如果正弦波的周期之比是有理数,那么正弦波的叠加也是周期性的,其周期等于每个周期的最小公倍数。干扰可以在每个周期内产生对称的子结构,但并不总是如此。

考虑到功能3美元\ * \罪(20 \ \π\乘以(x - \压裂{1}{8}))+ 4 \ \ cos(24 \ \π\乘以(x - \压裂{1}{8}))$.这个函数的周期是美元\压裂{1}{2}$,以及一条关于直线的匀称对称轴$ x = \压裂{1}{4}$.您可以利用这两个值来创建一个高效的查找表。

下图显示了函数的第一个周期,匀称对称轴表示为虚线。

h =图;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];持有;一个= 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。问题对象。使用解决求解优化问题的方法。

问题= FunctionApproximation.Problem (f);问题。InputLowerBounds = 0;问题。InputUpperBounds = 10;问题。InputTypes = inputNt;s1 = problem.solve ();流("查找表使用%3.2f千字节\n", s1。totalMemoryUsage。/ 2 ^ 10);
| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 0 | 92 | 0 | 2 | 14 | 32 | EvenSpacing | 7.812500 e 03, 1.368395 e + 01 | | 1 | 163900 | 1 | 5121 | 14 | 32 | EvenSpacing | 7.812500 e 03, 5.173779 e 03 | | 2 | 109276 | 0 | 3414 | 14 | 32 | EvenSpacing | 7.812500 e 03, 1.037254 e-02 | | 3 | 65596 | 0 | 2049 | 14 | 32 | EvenSpacing | 7.812500 e 03, 5.183705 e-02 | | 4 | 81980 | 0 | 2561 | 14 | 32 | EvenSpacing | 7.812500 e 03,2.058212 e-02 | | 156 | | 0 | 2 | 64 | | EvenSpacing | 7.812500 e 03, 1.368395 e + 01 | | 6 | 128 | 0 | 2 | 32 | 32 | EvenSpacing | 7.812500 e 03, 1.368395 e + 01 | | 131164 | | 0 | 2049 | 64 | | EvenSpacing | 7.812500 e 03, 5.183710 e-02 | | 92 | | 0 | 2 | 14 | 32 | EvenPow2Spacing | 7.812500 e 03, 1.368395 e + 01 | | 81980 | | 0 | 2561 | 14 | 32 | EvenPow2Spacing | 7.812500 e 03, 2.058212 e-02 | | 156 | | 0 | 2 | 64 | | EvenPow2Spacing | 7.812500 e 03,1.368395 e + 01 | | 128 | | 0 | 2 | 32 | 32 | EvenPow2Spacing | 7.812500 e 03, 1.368395 e + 01 | | 138000 | | 0 | 3000 | 14 | 32 | ExplicitValues | 7.812500 e 03, 1.037254 e-02 | | | 150006 | | 3261 | | 14日32 | ExplicitValues | 7.812500 e 03, 7.548735 e 03 | | 150006 | | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500 e 03, 7.920225 e 03 | | 150006 | | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500 e 03, 7.920225 e 03 | | 16 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500 e 03,7.920225e-03 | | 17 | 150006 | 0 | 3261 | 14 | 32 | ExplicitValues | 7.812500e- 03,7.920225e -03 |最佳解决方案| ID |内存(bits) |可行|表Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 13 | 150006 | 1 | 3261 | 14 | 32 | ExplicitValues | 7.812500e- 03,7.548735e -03 |查找表使用146.49 kobytes

在本例中,查找表很大。

使用函数对称来减少查找表的大小

在更小的输入范围上优化查找表,会得到更小的查找表,因为在表中存储的函数值更少。对于本例,只有For的范围x0到1/2之间的数据需要存储在查找表近似中。调整输入上界和下界并重新求解将显示所节省的内存。

问题。InputLowerBounds = 0;问题。InputUpperBounds = 0.25;s2 = problem.solve ();sprintf ("查找表使用%1.2f千字节", s2。totalMemoryUsage。/ 2 ^ 10)
| | ID内存(位)| |可行的表大小|断点WLs | TableData西城| BreakpointSpecification |错误(Max、电流)| | 0 | 48 | 0 | 2 | 8 | 16 | EvenSpacing | 7.812500 e 03, 1.262720 e + 01 | | 1 | 32 | 0 | 2 | 8 | 8 | EvenSpacing | 7.812500 e 03, 1.262720 e + 01 | | 2 | 2080 | 1 | 129 | 8 | 16 | EvenSpacing | 7.812500 e 03, 5.183465 e 03 | | 3 | 1056 | 0 | 65 | 8 | 16 | EvenSpacing | 7.812500 e 03, 2.062116 e-02 | | 4 | 80 | 0 | 2 | 8 | 32 | EvenSpacing | 7.812500 e 03,1.262720 e + 01 | | 5 | 48 | 0 | 2 | 8 | 16 | EvenPow2Spacing | 7.812500 e 03, 1.262720 e + 01 | | 6 | 32 | 0 | 2 | 8 | 8 | EvenPow2Spacing | 7.812500 e 03, 1.262720 e + 01 | | 1056 | | 0 | 65 | 8 | 16 | EvenPow2Spacing | 7.812500 e 03, 2.062116 e-02 | | 80 | | 0 | 2 | 8 | 32 | EvenPow2Spacing | 7.812500 e 03, 1.262720 e + 01 | | 2544 | | 106 | | 8 | 16 | ExplicitValues | 7.812500 e 03, 5.960266 e 03 | | 2448 | | 0 | 102 | 8 | 16 | ExplicitValues | 7.812500 e 03,1.194193 e-02 | | 2448 | | 0 | 102 | 8 | 16 | ExplicitValues | 7.812500 e 03, 1.106188 e-02 | | 2712 | | 113 | | 8 | 16 | ExplicitValues | 7.812500 e 03, 7.545040 e 03 | | 144 | | 0 | 2 | 64 | | EvenSpacing | 7.812500 e 03, 1.262720 e + 01 | | 128 | | 0 | 2 | 32 | 32 | EvenSpacing | 7.812500 e 03, 1.262720 e + 01 | | 144 | | 0 | 2 | 64 | | EvenPow2Spacing | 7.812500 e 03, 1.262720 e + 01 | | 16 | 128 | 0 | 2 | 32 32 | | EvenPow2Spacing | 7.812500 e 03,1.262720e+01 |最佳解决方案| ID | Memory (bits) |可行| Table Size | Breakpoints WLs | TableData WL | BreakpointSpecification | Error(Max,Current) | | 2 | 2080 | 1 | 129 | 8 | 16 | EvenSpacing | 7.812500e- 03,5.183465e -03 | ans = "查找表使用2.03 kobytes "

创建查找表块

使用近似方法从前面示例中的缩小查找表生成一个Lookup Table块。

s2.approximate ();

在Simulink模型中使用缩小查找表

该模型演示了如何将示例函数的对称性与查找表结合起来,以获得精确的近似。该框图说明了如何将对称操作与前面示例中的查找表结合使用。存储在命名的块中的查找表近似包含0到0.25之间输入的函数值。

open_system (“ModelWithApproximation”

翻译到上半年

子系统命名翻译到上半年演示了如何使用Modulo by Constant块将函数输入减少到半开放区间[0,0.25)。注意,这个块使用的值是0.25而不是0.5,因为为了提高效率,您同时使用了函数的平移对称和镜像对称。由于该块是为嵌入式效率而设计的,因此它可以将此计算减少为强制转换,因为0.25是2的幂。

open_system (“模型与近似/翻译到上半年”

使用镜面对称

要使用镜像对称,首先检查每个输入处于完整周期的哪一半。如果$x\ mod\ 0.5\ >\ 0.25$,在第一周期内绕对称轴反射。使用Modulo by Constant块来执行此操作。

open_system (“ModelWithApproximation /使用镜面对称吗?”

获取查找表索引

子系统命名得到指数转换$ X \ mod \ 0.25美元转换为查找表索引。它采用一个布尔参数来指示是否需要反射对称轴。如果是这样,$ X国防部0.25美元从0.5中减去以将索引放入查找表中。否则,$ X国防部0.25美元用于获取索引。

open_system (“ModelWithApproximation /得到指数”);

生成一个浮点基线

使用MATLAB函数块生成合适的浮点基线,比较查找表近似。函数体显示在这里。

模拟系统

创建从0到10的数据并模拟模型。这个范围将很容易看到由查找表近似和基线显示的重复干扰模式。

SampleData.signals.values = fi((0:pow2(-10):10)', inputNt);SampleData.signals.dims = [1];SampleData。时间=(0:1:长度(SampleData.signals.values) 1) ';sim卡(“ModelWithApproximation”);

下面的范围比较了近似值和基线值。误差图表明,使用压缩查找表的近似与示例函数的双精度值一致。

另请参阅

|

相关的话题

Baidu
map