“正确”的答案在很大程度上取决于您需要近似的对象。您是否确实需要某些误差范围的最佳近似值?还是只是一个很好的近似值?还是在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将为您提供全球最佳的结果。尽管离散模拟可能在小型电网上速度很快,但不会给出正确的结果。