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,mn( ρ ) = ρ (R,| m-1 |n - 1( ρ ) +R,m + 1n - 1( ρ ) ) -R,mn - 2( ρ )
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.
Ö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.