Remez 算法

计算科学 优化 近似
2021-12-13 00:58:14

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

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

也可以通过应用最小二乘或凸优化来计算极小极大解,例如使用 Matlab 和应用于 [-1, 1] 上的龙格函数的免费 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而这种方法在这里达到极小值 ,与使用 Matlab工具箱0.0654中的 Remez 算法计算的值相同。chebfun

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

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

1个回答

“正确”的答案很大程度上取决于您需要近似值的目的。您真的需要某个误差范围的最佳近似值吗?还是只是一个很好的近似值?或者只是最小最大意义上的一个很好的近似值?

Nick Trefethen 最近给出了一个很好的例子,其中 Remez 近似是一个坏主意,因为它最小化了最大误差,而与整个区间的平均误差无关,这可能不是你想要的。当然,最大误差可能很大,但这对于平滑函数是有界的。

更新

根据下面评论中的讨论,我下载了 CVX Toolbox,并与 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 将为您提供全局最优结果。虽然离散模拟在小电网上可能很快,但它不会给出正确的结果。