Yüksek mertebeden Zernike polinomlarının sayısal kararlılığı


9

Ben (örneğin yüksek sırasını hesaplamak çalışıyorum m=0, n=46bazı görüntü için) Zernike anlar. Ancak, radyal polinom ile ilgili bir sorunla karşılaşıyorum (bkz. Wikipedia ). Bu, [0 1] aralığında tanımlanan bir polinomdur. Aşağıdaki MATLAB koduna bakın

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

Bununla birlikte, bu açıkça yakın sayısal sorunlara rastlar RHO > 0.9. Çok gürültülü bir polinom

polyvalBazı daha iyi sahne arkası algoritmaları olabileceğini düşünmek için yeniden düzenleme denedim ama bu bir şey çözmedi. Sembolik bir hesaplamaya dönüştürmek istenen grafiği yarattı, ancak gösterildiği gibi basit bir grafik için bile şaşırtıcı derecede yavaştı.

Bu tür yüksek dereceli polinomları değerlendirmek için sayısal olarak kararlı bir yol var mı?


3
Çoğu zaman, burada Jacobi polinomları olan dik polinomları kullanmak daha iyidir . Eğer denedi mathworks.com/help/symbolic/jacobip.html ve ilişki
R,nm(r)=(-1)(n-m)/2rmP(n-m)/2(m,0)(1-2r2)?
gammatester

@gammatester Bu işe yarıyor! Belki de durumun neden böyle olacağına dair bir cevap verebilir misiniz?
Sanchises

İşe yaradığını duymak güzel. Ne yazık ki iki nedenden dolayı kesin bir cevap veremiyorum. Birincisi: Ortogonal polinomların standart formdan daha iyi stabilite özelliklerine sahip oldukları bilinmesine rağmen, resmi bir kanıt bilmiyorum (özellikle bu durumda). İkinci olarak Matlab kullanmıyorum ve uygulanan Jacobi polinomları için veri veremiyorum.
gammatester

1
@Sanchises Burada ücretsiz öğle yemeği yok: bir şeyin polinom olması, güçler açısından doğrudan formülün onu hesaplamanın doğru yolu olduğu anlamına gelmez ve Jacobi polinomlarını doğru bir şekilde hesaplamak önemsiz bir mesele değildir; katsayılar sayesinde, o kadar ucuz değil.
Kirill

2
Jacobi polinomlarını kullanmanın nedeni, formülünüzdeki felaket iptalinden kurtulmanızdır (çok büyük katsayılara sahip tüm salınım faktörlerine bakın!) Ve varsayılan Jacobi polinom değerlendirme prosedürü bir kütüphanede dikkatli bir şekilde uygulandığından garanti edilir. doğru olmak. Buradaki çalışmaların çoğu Jacobi polinomlarının doğru bir şekilde değerlendirildiğinden emin olmak için yapılır.
Kirill

Yanıtlar:


7

In Bu yazıda , Honarvar ve Paramesran çok güzel bir özyinelemeli şekilde radyal Zernike polinomları hesaplamak için ilginç bir yöntem türetmek. Özyineleme formülü, büyük tamsayılarla bölünme veya çarpma olmadan şaşırtıcı derecede basittir:

R,nm(ρ)=ρ(R,n-1|m-1|(ρ)+R,n-1m+1(ρ))-R,n-2m(ρ)
Honarvar ve Paramesran gazetesinde, farklı Zernike polinomları arasındaki bağımlılıkları açıkça gösteren şekil 1'e bakmanızı tavsiye ederim.

Bu, aşağıdaki Octave komut dosyasında uygulanır:

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)

Örneğin, bu kod tarafından üretilen şekil, m=22, ve n=112, yakınlarda felaket iptali olur ρ=0.7, eğer Zernike radyal polinomları Jacobi polinomları ile hesaplanırsa. Bu nedenle, düşük dereceli Zernike polinomlarının doğruluğu konusunda da endişe edilmelidir.

resim açıklamasını buraya girin

Özyinelemeli yöntem, bu üst düzey Zernike polinomlarını kararlı bir şekilde hesaplamak için çok daha uygun görünmektedir. Yine de,m=0 ve n=46, Jacobi ve özyinelemeli yöntem arasındaki maksimum fark (yalnızca?) 1.4e-10, bu da uygulamanız için yeterince doğru olabilir.


Çiziminiz Matlab'larda bir hataya benziyor jacobiPD, herhangi bir genel felaket iptali gibi değil.
Kirill

@Kiril: Ben Sanchises kullanılan JacobiPDdan onun cevabını . Bu, düşük dereceli polinomlar için iyi çalışır. Örneğin,n=30, keyfi mve keyfi ρ, iki yöntem arasındaki fark küçüktür 6.9e-13. Toplamındaki bireysel terimler JacobiPDküçük olmakla birlikte , çarpılarak büyük hale gelebilir factorial(n+a) * factorial(n+b). Dahası, felaket iptali için mükemmel bir tarif olan alternatif işaretlere sahipler.
wim

(devam) Örneğin m=22 ve n=112ifadesi 1/(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), kadar büyük hale gelebilir 1.4e18toplamı sadece iken, -2.1eninde sonunda. Buna bir hata diyebilirsiniz, ancak sonsuz bir hassasiyetle cevap doğru olurdu. Ne demek istediğini "jenerik felaket iptali yok" ile açıklayabilir misin?
wim

1
@ wim Matlab'ın olmadığını fark etmedim. Birinin Jacobi polinom uygulaması amaçları için yeterince iyi ise, bu sorun değil. Sadece bir hata dedim çünkü yanlış anladım ve yerleşik bir fonksiyon olduğunu düşündüm (kütüphane fonksiyonlarının çok sağlam olmasını bekliyorum). "Genel" ile ifade etmek gerekirse, işlevin nasıl uygulandığını bilmiyorsanız, yanlış çıktıları her tür hata için bir catch-all terimi gibi "felaket iptali" olarak adlandıramazsınız, ama bu sadece benim yanlış anlama kod yapıyordu.
Kirill

1
Açık olmak gerekirse: kodum özyinelemeli değil. Normalde örneğin polinomlar için Horner formundan daha kararlı olduğu varsayılan tekrarlanan standart üç dönemli nüks ilişkisidir (Chebyshev polinomlarına benzer).
gammatester

8

Olası bir çözüm (@gammatester tarafından önerilmektedir) Jacobi polinomlarını kullanmaktır. Bu, 'naif' polinom değerlendirmesi ile büyük polinom katsayılarının eklenmesinde felaket iptali sorununu ortadan kaldırmaktadır.

Radyal Zernike polinomu Jacobi polinomları tarafından aşağıdaki gibi ifade edilebilir ( denklem (6) 'ya bakınız )

R,nm(ρ)=(-1)(n-m)/2ρmP(n-m)/2(m,0)(1-2ρ2)

Ancak MATLAB'de, 'nin jacobiP(n,a,b,x)büyük vektörleri / matrisleri için kullanımı kabul edilemez derecede yavaştır x=rho. jacobiPFonksiyon aslında Sembolik Toolbox parçasıdır ve polinomun değerlendirilmesi keyfi hassasiyet için hızını esnaf sembolik motoruna ertelenir. Jacobi polinomlarının manuel olarak uygulanması gereklidir.

Jacobi işlevine ait parametrelerin tümü negatif olmadığından (α=m, β=0, n*=(n-m/2)), aşağıdaki ifadeyi kullanabiliriz ( Wikipedia'ya bakın , için değerleri doldurduğuma dikkat edin)s)

Pn(α,β)(ρ)=(n+α)!(n+β)!Σs=0n[1s!(n+α-s)!(β+s)!(n-s)!(x-12)n-s(x+12)s]

MATLAB'de bu, (Jacobi p olice d epartment P olynomial, ' D ouble' uygulaması) anlamına gelir.

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

Gerçek radyal Zernike polinomu ve böylece bir (için m=abs(m))

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

Not: Bu kendi kendine cevap sadece pratik bir çözümdür; bunun neden işe yaradığını açıklayan başka bir yanıtta etiketleme yapmaktan çekinmeyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.