Я пытаюсь вычислить моменты Zernike более высокого порядка (например m=0
, n=46
) для некоторого изображения. Тем не менее, я сталкиваюсь с проблемой, касающейся радиального полинома (см. Википедию ). Это полином, определенный на интервале [0 1]. Смотрите код MATLAB ниже
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
Тем не менее, это, очевидно, сталкивается с численными проблемами рядом RHO > 0.9
.
Я попытался реорганизовать его, polyval
думая, что у него могут быть какие-то лучшие закулисные алгоритмы, но это ничего не решило. Преобразование его в символьное вычисление создало желаемый граф, но было ошеломительно медленным даже для простого графика, такого как показано.
Существует ли численно устойчивый способ оценки таких многочленов высокого порядка?
matlab
polynomials
numerical-limitations
Sanchises
источник
источник
Ответы:
В этой статье Хонарвар и Парамесран выводят интересный метод вычисления радиальных полиномов Цернике очень хорошим рекурсивным способом. Формула рекурсии удивительно проста, без деления или умножения на большие целые числа:рмN( ρ ) = ρ (р| м-1 |n - 1( ρ ) +рм + 1n - 1( ρ ) ) -рмп - 2( ρ )
Я бы порекомендовал взглянуть на рисунок 1 в статье Хонарвара и Парамесрана, которая ясно иллюстрирует зависимости между различными полиномами Цернике.
Это реализовано в следующем скрипте Octave:
Например, рисунок, созданный этим кодом, показывает, что см = 22 , а также n = 112 , катастрофическая отмена происходит вблизи ρ = 0,7 , если радиальные полиномы Зернике вычисляются с помощью полиномов Якоби. Следовательно, нужно также беспокоиться о точности полиномов Цернике нижней степени.
Рекурсивный метод, по-видимому, гораздо лучше подходит для стабильного вычисления этих полиномов Цернике высшего порядка. Тем не менее, дляm = 0 а также n = 46 максимальная разница между Якоби и рекурсивным методом составляет (только?)
1.4e-10
, которая может быть достаточно точной для вашего приложения.источник
jacobiPD
, а не как какая-либо общая катастрофическая отмена.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
конце концов. Вы можете назвать это ошибкой, но с бесконечной точностью ответ будет правильным. Можете ли вы объяснить, что вы имеете в виду под «отсутствием общей катастрофической отмены»?Возможное решение (предложенное @gammatester) заключается в использовании полиномов Якоби. Это позволяет обойти проблему катастрофической отмены при сложении больших полиномиальных коэффициентов путем «наивной» полиномиальной оценки.
Радиальный многочлен Зернике может быть выражен многочленами Якоби следующим образом (см. Уравнение (6) )
В MATLAB, однако, использование
jacobiP(n,a,b,x)
неприемлемо медленно для больших векторов / матрицx=rho
. ЭтаjacobiP
функция на самом деле является частью Symbolic Toolbox, и оценка полинома откладывается на символический механизм, который обменивает скорость на произвольную точность. Таким образом, необходима ручная реализация полиномов Якоби.Поскольку все параметры функции Якоби неотрицательны (α = м , β= 0 , N*= ( п - м / 2 ) ), мы можем использовать следующее выражение (см. Википедия , обратите внимание, что я заполнил значения дляs )
п( α , β)N( ρ ) = ( n + α ) ! ( n + β) !⋅Σс = 0N[1с ! ( n + α - s ) ! ( β+ с ) ! ( н - с ) !(х - 12)н - с(х + 12)s]
В MATLAB, это приводит к (Jacobi
р olice д epartmentР olynomial, ' D ouble' реализации)Таким образом, фактический радиальный полином Зернике является (для
m=abs(m)
)Примечание: этот ответ на себя - только практическое решение; не стесняйтесь отмечать другой ответ, который объясняет, почему это работает.
источник