에서 본 논문 , Honarvar 및 Paramesran 아주 좋은 재귀 방식으로 반경 제르 니케 다항식을 계산하는 흥미로운 방법을 도출. 재귀 수식은 큰 정수로 나누거나 곱하지 않고 놀랍도록 간단합니다.
아르 자형미디엄엔( ρ ) = ρ (아르 자형| m-1 |n - 1( ρ ) +아르 자형m + 1n - 1( ρ ) ) -아르 자형미디엄n - 2( ρ )
Honarvar와 Paramesran 논문에서 그림 1을보고 다른 Zernike 다항식 간의 종속성을 명확하게 보여줄 것을 권장합니다.
이것은 다음 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)
예를 들어이 코드로 생성 된 그림은 m = 22, n = 112근처에서 치명적인 취소가 발생합니다. ρ = 0.7Zernike 방사형 다항식은 Jacobi 다항식을 통해 계산됩니다. 따라서 저급 Zernike 다항식의 정확성에 대해서도 걱정해야합니다.
재귀 방법은 이러한 고차 Zernike 다항식을 안정적인 방식으로 계산하는 데 훨씬 더 적합한 것으로 보입니다. 그럼에도 불구하고m = 0 과 n = 46Jacobi와 재귀 적 방법의 최대 차이는 (단지?) 1.4e-10
이며 응용 프로그램에 충분히 정확할 수 있습니다.