Dalam tulisan ini , Honarvar dan Paramesran memperoleh metode yang menarik untuk menghitung polinomial radial Zernike dengan cara rekursif yang sangat bagus. Formula rekursi secara langsung sangat mudah, tanpa pembagian atau perkalian dengan bilangan bulat besar:
Saya akan merekomendasikan untuk melihat gambar 1 di Honarvar dan Paramesran kertas, yang dengan jelas menggambarkan ketergantungan antara berbagai polinomial Zernike.Rmn(ρ)=ρ(R|m−1|n−1(ρ)+Rm+1n−1(ρ))−Rmn−2(ρ)
Ini diimplementasikan dalam skrip Oktaf berikut:
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)
Misalnya, gambar yang dihasilkan oleh kode ini menunjukkan bahwa dengan , dan , pembatalan bencana terjadi di dekat , jika polinom radial Zernike dikomputasi melalui polinomial Jacobi. Oleh karena itu, kita juga harus khawatir tentang keakuratan polinomial Zernike tingkat rendah.m=22n=112ρ=0.7
Metode rekursif tampaknya jauh lebih cocok untuk menghitung polinomial Zernike tingkat tinggi ini dengan cara yang stabil. Namun demikian, untuk dan , perbedaan maksimum antara Jacobi dan metode rekursif adalah (hanya?) , Yang mungkin cukup akurat untuk aplikasi Anda.m=0n=461.4e-10