Ich versuche m=0
, n=46
Zernike-Momente höherer Ordnung (z. B. ) für ein Bild zu berechnen . Ich habe jedoch ein Problem mit dem radialen Polynom (siehe Wikipedia ). Dies ist ein Polynom, das im Intervall [0 1] definiert ist. Siehe den MATLAB-Code unten
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
Dies stößt jedoch offensichtlich auf numerische Probleme in der Nähe RHO > 0.9
.
Ich habe versucht, es so umzugestalten, dass ich polyval
dachte, es könnte einige bessere Algorithmen hinter den Kulissen geben, aber das hat nichts gelöst. Die Konvertierung in eine symbolische Berechnung hat zwar das gewünschte Diagramm erstellt, war jedoch selbst für ein einfaches Diagramm wie das gezeigte erstaunlich langsam.
Gibt es eine numerisch stabile Methode zur Bewertung solcher Polynome höherer Ordnung?
matlab
polynomials
numerical-limitations
Sanchises
quelle
quelle
Antworten:
Dies ist im folgenden Octave-Skript implementiert:
1.4e-10
quelle
jacobiPD
, nicht wie eine generische katastrophale Stornierung.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
Eine mögliche Lösung (von @gammatester vorgeschlagen) ist die Verwendung von Jacobi-Polynomen. Dies umgeht das Problem der katastrophalen Aufhebung beim Addieren der großen Polynomkoeffizienten durch "naive" Polynombewertung.
Das radiale Zernike-Polynom kann durch Jacobi-Polynome wie folgt ausgedrückt werden (siehe Gleichung (6) )
In MATLAB ist die Verwendung von
jacobiP(n,a,b,x)
jedoch für große Vektoren / Matrizen von unannehmbar langsamx=rho
. DiejacobiP
Funktion ist tatsächlich Teil der Symbolic Toolbox, und die Auswertung des Polynoms wird auf die symbolische Engine verschoben, die Geschwindigkeit gegen willkürliche Präzision eintauscht. Eine manuelle Implementierung der Jacobi-Polynome ist daher erforderlich.In MATLAB bedeutet dies (Jacobi
p olice d epartmentP olynomial, ' D ouble' Implementierung)Das tatsächliche radiale Zernike-Polynom ist also (für
m=abs(m)
)Hinweis: Diese Selbstantwort ist nur eine praktische Lösung. Fühlen Sie sich frei, eine andere Antwort zu markieren, die erklärt, warum dies funktioniert.
quelle