高次ゼルニケ多項式の数値安定性


9

一部の画像の高次(たとえばm=0n=46)ゼルニケモーメントを計算しようとしています。しかし、放射多項式に関する問題に直面しています(ウィキペディアを参照)。これは区間[0 1]で定義された多項式です。以下のMATLABコードを参照してください

function R = radial_polynomial(m,n,RHO)
    R = 0;
    for k = 0:((n-m)/2)        
        R = R + (-1).^k.*factorial(n-k) ...
            ./ ( factorial(k).*factorial((n+m)./2-k) .* factorial((n-m)./2-k) ) ...
            .*RHO.^(n-2.*k);
    end
end

ただし、これは明らかにの近くの数値の問題にぶつかりますRHO > 0.9ノイズの多い多項式

私はそれをpolyvalいくつかのより良い舞台裏のアルゴリズムがあるかもしれないと考えるようにそれをリファクタリングしてみましたが、それは何も解決しませんでした。これをシンボリック計算に変換すると、目的のグラフが作成されましたが、次のような単純なグラフであっても驚くほど遅くなりました。

そのような高次多項式を評価する数値的に安定した方法はありますか?


3
多くの場合、直交多項式、ここではヤコビ多項式を使用する方が良いでしょう。mathworks.com/help/symbolic/jacobip.html と関係Rを試しましたか
Rメートルr=1メートル/2rメートルPメートル/2メートル012r2
ガンマテスター2018

@gammatesterうまくいきました!なぜこれが当てはまるのか、答えを詳しく説明してもらえますか?
18

うまくいくと聞きました。残念ながら、私は2つの理由で献身的な答えを出すことはできません。まず、直交多項式の方が標準形式よりも安定性が高いことが一般に知られていますが、形式的な証明はわかりません(特にこの場合)。次に、Matlabを使用せず、実装されたヤコビ多項式のデータを提供できません。
ガンマテスター2018

1
@Sanchisesここには無料の昼食はありません。多項式であるという理由だけで、力に関する直接の公式がそれを計算する正しい方法であることを意味せず、ヤコビ多項式を正確に計算すること自体は簡単な問題ではありません。それは係数を介して行われるため、それほど安価ではありません。
キリル、

2
ヤコビ多項式を使用するとうまくいく理由は、式の壊滅的な相殺を取り除き(非常に大きな係数を持つすべての振動因子を見てください!)、デフォルトのヤコビ多項式評価手順はライブラリに注意深く実装されているため、保証されています正確に。ここでの作業のほとんどは、ヤコビ多項式が正確に評価されるようにするために行われます。
キリル、

回答:


7

、この論文、HonarvarとParamesranは非常にいい再帰的な方法で、ラジアルゼルニケ多項式を計算するための興味深い方法を導き出します。漸化式大きな整数除算または乗算することなく、驚くほど簡単である:

Rメートルρ=ρR1|メートル1|ρ+R1メートル+1ρR2メートルρ

これは、次のOctaveスクリプトに実装されています。

clear                                     % Tested with Octave instead of Matlab
N = 120;
n_r = 1000;
R = cell(N+1,N+1);
rho = [0:n_r]/n_r;
rho_x_2 = 2*[0:n_r]/n_r;

R{0+1,0+1} = ones(1,n_r+1);               % R^0_0  Unfortunately zero based cell indexing is not possible
R{1+1,1+1} = R{0+1,0+1}.*rho;             % R^1_1  ==>  R{...+1,...+1} etc.
for n = 2:N,
    if bitget(n,1) == 0,                  % n is even
        R{0+1,n+1} = -R{0+1,n-2+1}+rho_x_2.*R{1+1,n-1+1};                % R^0_n
        m_lo = 2;
        m_hi = n-2;
    else
        m_lo = 1;
        m_hi = n-1;
    end
    for m = m_lo:2:m_hi,
        R{m+1,n+1} = rho.*(R{m-1+1,n-1+1}+R{m+1+1,n-1+1})-R{m+1,n-2+1};  % R^m_n
    end
    R{n+1,n+1} = rho.*R{n-1+1,n-1+1};                                    % R^n_n
end;


Z = @(m,n,rho) (-1)^((n-m)/2) * rho.^m .* jacobiPD((n-m)/2,m,0,1-2*rho.^2);
m = 22;
n = 112;
figure
plot(rho,Z(m,n,rho))
hold on
plot(rho,R{m+1,n+1},'r');
xlabel("rho")
ylabel("R^{22}_{112}(rho)")
legend("via Jacobi","recursive");
%print -djpg plt.jpg

m = 0;
n = 46;
max_diff_m_0_n_46 = norm(Z(m,n,rho)-R{m+1,n+1},inf)

たとえば、このコードによって生成された図は、 メートル=22=112ρ=0.7

ここに画像の説明を入力してください

メートル=0=461.4e-10


プロットはMatlabのバグのように見えます jacobiPDようであり、一般的な壊滅的なキャンセルのようではありません。
Kirill、

JacobiPD=30メートルρ6.9e-13JacobiPDfactorial(n+a) * factorial(n+b)ます。さらに、これらの記号は交互になります。これは、壊滅的なキャンセルの完璧なレシピです。
WIM

メートル=22=1121/(factorial(s)*factorial(n+a-s)*factorial(b+s)*factorial(n-s)) * ((x-1)/2).^(n-s).*((x+1)/2).^s * factorial(n+a) * factorial(n+b)場合はと同じくらい大きくなる可能性が1.4e18ありますが、合計は-2.1最終的にのみです。これをバグと呼ぶことができますが、無限の精度で、答えは正しかったでしょう。「一般的な壊滅的なキャンセルはありません」とはどういう意味ですか?
WIM

1
@wim私はそれがMatlabのものではないことに気づきませんでした。誰かのヤコビ多項式の実装が彼らの目的に十分適している場合、それは問題ありません。誤解し、組み込み関数だと思ったので、バグだとだけ言った(ライブラリー関数は非常に堅実であると思う)。「一般的」とは、関数がどのように実装されているかがわからない場合、あらゆる種類のエラーのキャッチオール用語のような誤った出力を「致命的なキャンセル」と呼ぶことはできないことを意味しましたが、それは私の誤解ですコードがやっていた。
Kirill、

1
明確にするために:私のコードは再帰的ではありません。これは、たとえば多項式のホーナー形式よりも通常は安定していると考えられる反復標準3項回帰関係(チェビシェフ多項式に類似)です。
ガンマテスター2018

8

可能な解決策(@gammatesterが推奨)は、ヤコビ多項式を使用することです。これにより、「素朴な」多項式評価によって大きな多項式係数を追加する際の壊滅的なキャンセルの問題が回避されます。

放射状ゼルニケ多項式は、次のようにヤコビ多項式で表すことができます(式(6)を参照)

Rメートルρ=1メートル/2ρメートルPメートル/2メートル012ρ2

ただし、MATLABでは、の使用はjacobiP(n,a,b,x)、の大きなベクトル/行列に対して許容できないほど遅くなりx=rhoます。jacobiP関数は、実際にはシンボリックツールボックスの一部であり、多項式の評価は、任意精度の速度を犠牲にシンボリックエンジンに延期されます。したがって、ヤコビ多項式を手動で実装する必要があります。

ヤコビ関数のパラメーターはすべて非負であるため(α=メートルβ=0=メートル/2s

Pαβρ=+α+βΣs=0[1s+αsβ+ssバツ12sバツ+12s]

MATLABでは、これは(Jacobi p olice d epartment P olynomial、 ' D ouble' implementation)に変換されます。

function P = jacobiPD(n,a,b,x)
    P = 0;
    for  s  0:n
        P = P + ...
            1/(factorial(s)*factorial(n+a-s)*factorial(b+s)*factorial(n-s)) * ...
            ((x-1)/2).^(n-s).*((x+1)/2).^s;
    end
    P = P*factorial(n+a) * factorial(n+b);
end

実際のラジアルゼルニケ多項式は(のためのことですm=abs(m)

Z = @(m,n,rho) (-1)^((n-m)/2) * rho.^m .* jacobiPD((n-m)/2,m,0,1-2*rho.^2);

注:この自己回答は実際的な解決策にすぎません。これが機能する理由を説明する別の回答にタグを付けてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.