Estou tentando calcular momentos Zernike de ordem superior (por exemplo m=0
, n=46
) para alguma imagem. No entanto, estou com um problema em relação ao polinômio radial (consulte a Wikipedia ). Este é um polinômio definido no intervalo [0 1]. Veja o código MATLAB abaixo
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
No entanto, isso obviamente tem problemas numéricos próximos RHO > 0.9
.
Eu tentei refatorá-lo para polyval
pensar que poderia ter alguns algoritmos melhores nos bastidores, mas isso não resolveu nada. Convertê-lo em um cálculo simbólico criou o gráfico desejado, mas foi incrivelmente lento mesmo para um gráfico simples como o mostrado.
Existe uma maneira numericamente estável de avaliar esses polinômios de alta ordem?
matlab
polynomials
numerical-limitations
Sanchises
fonte
fonte
Respostas:
Isso é implementado no seguinte script do Octave:
1.4e-10
fonte
jacobiPD
, não como qualquer cancelamento catastrófico genérico.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
Uma solução possível (sugerida por @gammatester) é usar polinômios de Jacobi. Isso contorna o problema do cancelamento catastrófico ao adicionar grandes coeficientes polinomiais por avaliação polinomial "ingênua".
O polinômio radial de Zernike pode ser expresso pelos polinômios de Jacobi da seguinte forma (consulte a equação (6) )
No entanto, no MATLAB, o uso de
jacobiP(n,a,b,x)
é inaceitavelmente lento para vetores / matrizes grandes dex=rho
. AjacobiP
função é realmente parte da Symbolic Toolbox e a avaliação do polinômio é adiada para o mecanismo simbólico, que troca a velocidade por precisão arbitrária. Uma implementação manual dos polinômios de Jacobi é, portanto, necessária.No MATLAB, isto traduz-se (Jacobi
p polícia prosseguiu d EPARTAMENTOP olynomial, ' D ouble' implementação)O polinômio radial de Zernike real é assim (para
m=abs(m)
)Nota: essa resposta automática é apenas uma solução prática; fique à vontade para marcar outra resposta que explique por que isso funciona.
fonte