Remez算法


14

Remez算法是众所周知的迭代例程,可以通过极小极大范数中的多项式近似函数。但是,正如Nick Trefethen [1]所说:

这些[实现]中的大多数都可以追溯到很多年前,实际上,它们中的大多数并不能解决上面提出的一般最佳逼近问题,而是可以解决涉及离散变量或数字滤波的变体。可以找到其他一些流通的计算机程序,但是总的来说,目前似乎没有广泛使用的程序可以计算最佳近似值。

也可以通过应用最小二乘或凸优化来计算minimax解,例如,使用Matlab和应用于[-1,1]的Runge函数的免费CVX工具箱:

m = 101; n = 11;            % 101 points, polynomial of degree 10
xi = linspace(-1, 1, m);    % equidistant points in [-1, 1]
ri = 1 ./ (1+(5*xi).^2);    % Runge function

tic                         % p is the polynomial of degree (n-1)
cvx_begin                   % minimize the distance in all points
    variable p(n);
    minimize( max(abs(polyval(p, xi) - ri)) );
cvx_end
toc                         % 0.17 sec for Matlab, CVX and SeDuMi

Chebyshev多项式的逼近的极小范数为,0.1090而这种方法在这里达到最小值0.0654,该值与Matlab chebfun工具箱中的Remez算法所计算的值相同。

如果您可以使用优化求解器更快,更准确地计算minimax解,那么应用更复杂的Remez算法是否有任何优势?是否有任何报告/文章比较这两种方法在一些困难的问题或测试用例上的表现?

-
[1] R. Pachon和LN Trefethen。BIT数值数学(2008)第1卷。46。

Answers:


4

“正确”的答案在很大程度上取决于您需要近似的对象。您是否确实需要某些误差范围的最佳近似值?还是只是一个很好的近似值?还是在minmax方面只是一个很好的近似值?

尼克· 特雷菲森(Nick Trefethen)最近举了一个很好的例子,其中雷米兹逼近法是个坏主意,因为它使最大误差最小化,而与整个时间间隔内的平均误差无关,这可能不是您想要的。当然,最大误差可能很大,但这对于平滑函数是有界的。

更新资料

在下面的评论中进行讨论之后,我下载了CVX工具箱,并与Chebfun Remez算法进行了直接比较(免责声明:我是Chebfun开发团队的成员):

% Do the convex optimization bit.
m = 101; n = 11;            % 101 points, polynomial of degree 10
xi = linspace(-1, 1, m);    % equidistant points in [-1, 1]
ri = 1 ./ (1+(5*xi).^2);    % Runge function

tic                         % p is the polynomial of degree (n-1)
cvx_begin                   % minimize the distance in all points
    variable p(n);
    minimize( max(abs(polyval(p, xi) - ri)) );
cvx_end
toc_or = toc                % 0.17 sec for Matlab, CVX and SeDuMi

% Extract a Chebfun from the result
x = chebfun( [-1,1] );
A = [ chebfun(1) , x ];
for k=3:n, A(:,k) = A(:,k-1).*x; end
or = A * flipud(p)

% Make a chebfun of Runge's function
f = chebfun( @(x) 1 ./ ( 1 + 25*x.^2 ) )

% Get the best approximation using Remez
tic, cr = remez( f , 10 ); toc_cr = toc

% Get the maximum error in each case
fprintf( 'maximum error of convex optimization: %e (%f s)\n' , norm( f - or , inf ) , toc_or );
fprintf( 'maximum error of chebfun remez: %e (%f s)\n' , norm( f - cr , inf ) , toc_cr );

% Plot the two error curves
plot( [ f - cr , f - or ] );
legend( 'chebfun remez' , 'convex optimization' );

经过大量输出,我在装有Matlab 2012a的笔记本电脑上获得了CVX 1.22版和Chebfun的最新SVN快照:

maximum error of convex optimization: 6.665479e-02 (0.138933 s)
maximum error of chebfun remez: 6.592293e-02 (0.309443 s)

请注意,f用于测量误差的Chebfun 精确到15位数字。因此,Chebfun的Remez花费了两倍的时间,但是得到了一个较小的全局错误。应当指出,CVX使用编译后的代码进行优化,而Chebfun是100%本机Matlab。最小误差0.00654是“在网格上”的最小误差,在该网格之外,误差最大为0.00659。增加网格大小来m = 1001我得到

maximum error of convex optimization: 6.594361e-02 (0.272887 s)
maximum error of chebfun remez: 6.592293e-02 (0.319717 s)

即几乎相同的速度,但从第四位十进制数字开始,离散优化仍然较差。最后,将网格尺寸进一步增加到m = 10001我得到

maximum error of convex optimization: 6.592300e-02 (5.177657 s)
maximum error of chebfun remez: 6.592293e-02 (0.312316 s)

即,离散优化现在慢了十倍以上,并且到第六位为止还很差。

最重要的是,Remez将为您提供全球最佳的结果。尽管离散模拟可能在小型电网上速度很快,但不会给出正确的结果。


N. Trefethen强调了这一点,并在我引用的文章中给出了类似的示例。问题不是关于最佳逼近,而是:如果您可以通过一个合理的凸求解器获得相同的结果,那么Remez算法(当今)的优势是什么
汉斯W.

1
@HansWerner,对不起,我读错了您的问题。凸求解器不会给您相同的结果,至少不是全部数字都给您。如果我正确理解了凸代码,那么您将使离散点上的最大误差最小化。这是使全局最大误差最小化的一个很好的近似值-但与它不同。
2012年

在这种情况下,凸解算器给出了更好的结果。考虑一下,Remez算法是一个迭代过程,与优化例程非常相似,并且也不会返回确切的结果。在上面的具体情况下,优化解决方案比我所知的最佳Remez实施方案更好,即总体上最大范数更小。这个问题仍然悬而未决
汉斯W.

@HansWerner,您如何测量通过凸解算器获得的解的最大误差?Remez算法chebfun应进行迭代,直到达到某种程度的机器精度为止(在某种意义上)。
2012年

不必要; 的选项有“ tol”(相对公差)或“ maxiter”之chebfun/remez类的选项,但是对于各种优化求解器也有类似的选项。可以说,Remez是专门针对特定任务的优化例程。问题是:通用求解器是否赶上了,并且不再需要这种专用求解器?当然,我可能是错的。
汉斯W.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.