「正しい」答えは、あなたがあなたの近似を必要とするものに強く依存します。いくつかの誤差限界に対して本当に最適な近似が必要ですか?またはちょうど良い近似?それとも、ミニマックスの意味でちょうど良い近似ですか?
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は2倍の時間がかかりますが、グローバルエラーは小さくなります。Chebfunは100%ネイティブのMatlabであるのに対し、CVXは最適化のためにコンパイルされたコードを使用することに注意してください。の最小誤差0.00654
は、「グリッド上」、そのグリッド外の最小誤差であり、誤差は最大である可能性があります0.00659
。グリッドサイズを増やすm = 1001
I GET
maximum error of convex optimization: 6.594361e-02 (0.272887 s)
maximum error of chebfun remez: 6.592293e-02 (0.319717 s)
つまり、ほぼ同じ速度ですが、離散最適化は4桁目の10進数の時点でさらに悪化します。最後に、にさらにグリッドサイズをncreasing m = 10001
I GET
maximum error of convex optimization: 6.592300e-02 (5.177657 s)
maximum error of chebfun remez: 6.592293e-02 (0.312316 s)
つまり、離散最適化は10倍以上遅くなり、6桁目ではさらに悪化しています。
一番下の行は、Remezがグローバルに最適な結果を得るということです。ディスクリートアナログは小さなグリッドでは高速かもしれませんが、正しい結果にはなりません。