J'essaie de calculer des moments Zernike d' ordre supérieur (par exemple m=0
, n=46
) pour une image. Cependant, je rencontre un problème concernant le polynôme radial (voir wikipedia ). Il s'agit d'un polynôme défini sur l'intervalle [0 1]. Voir le code MATLAB ci-dessous
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
Cependant, cela se heurte évidemment à des problèmes numériques proches RHO > 0.9
.
J'ai essayé de le refactoriser en polyval
pensant qu'il pourrait avoir de meilleurs algorithmes en coulisses mais cela n'a rien résolu. Le convertir en un calcul symbolique a créé le graphique souhaité, mais était incroyablement lent, même pour un graphique simple tel que montré.
Existe-t-il un moyen numériquement stable d'évaluer de tels polynômes d'ordre élevé?
matlab
polynomials
numerical-limitations
Sanchises
la source
la source
Réponses:
Ceci est implémenté dans le script Octave suivant:
1.4e-10
la source
jacobiPD
, pas à une annulation catastrophique générique.JacobiPD
6.9e-13
JacobiPD
factorial(n+a) * factorial(n+b)
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)
1.4e18
-2.1
Une solution possible (suggérée par @gammatester) consiste à utiliser des polynômes de Jacobi. Ceci contourne le problème de l'annulation catastrophique en ajoutant les grands coefficients polynomiaux par évaluation polynomiale «naïve».
Le polynôme radial de Zernike peut être exprimé par les polynômes de Jacobi comme suit (voir équation (6) )
Dans MATLAB cependant, l'utilisation de
jacobiP(n,a,b,x)
est trop lente pour les grands vecteurs / matrices dex=rho
. LajacobiP
fonction fait en fait partie de la boîte à outils symbolique et l'évaluation du polynôme est reportée au moteur symbolique, qui échange la vitesse contre une précision arbitraire. Une implémentation manuelle des polynômes de Jacobi est donc nécessaire.Dans MATLAB, cela se traduit par (Jacobi
p olice d ÉPARTEMENTP olynomial, ' D mise en oeuvre ouble')Le polynôme radial de Zernike réel est donc (pour
m=abs(m)
)Remarque: cette auto-réponse n'est qu'une solution pratique; n'hésitez pas à ajouter une autre réponse qui explique pourquoi cela fonctionne.
la source