Числова стійкість поліномів вищого порядку Зерніке


9

Я намагаюся обчислити моменти вищого порядку (наприклад m=0, n=46) моменти Zernike для деякого зображення. Однак я зіткнувся з проблемою щодо радіального многочлена (див. Wikipedia ). Це поліном, визначений на проміжку [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думку, що він може мати кілька кращих закулісних алгоритмів, але це нічого не вирішило. Перетворення його в символічний розрахунок створило потрібний графік, але було розумно повільним навіть для простого графіка, такого як показано.

Чи існує чисельно стійкий спосіб оцінювання таких поліномів високого порядку?


3
Часто краще використовувати ортогональні многочлени, тут поліноми Якобі . Ви спробували mathworks.com/help/symbolic/jacobip.html і відношення
Rнм(r)=(-1)(н-м)/2rмП(н-м)/2(м,0)(1-2r2)?
гаммейстер

@gammatester Це працює! Не могли б ви детальніше розказати, чому це було так?
Санчіз

Приємно чути, що це працює. На жаль, я не можу дати рішучу відповідь з двох причин. По-перше: хоча загальновідомо, що ортогональні поліноми мають кращі властивості стійкості, ніж стандартна форма, я не знаю формального доказу (особливо в цьому випадку). По-друге, я не використовую Matlab і не можу надати дані для реалізованих поліномів Якобі.
гаммейстер

1
@Sanchises Тут немає безкоштовного обіду: тільки те, що щось є поліномом, не означає, що пряма формула з точки зору повноважень - це правильний спосіб його обчислити, а точні обчислення поліномів Якобі самі по собі не є дрібницею - ви цього не робите. це через коефіцієнти, тож це не так дешево.
Кирило

2
Причина, з якою працює поліноми Якобі, полягає в тому, що ви позбавитесь від катастрофічного скасування у вашій формулі (подивіться на всі ті коливальні фактори з дуже великими коефіцієнтами!), А процедура оцінки поліномів Якобі за замовчуванням ретельно реалізована в бібліотеці, тому це гарантовано бути точним. Більшість роботи тут робиться для того, щоб переконатися, що поліноми Якобі точно оцінені.
Кирило

Відповіді:


7

У цій роботі Хонавар і Парамесран отримують цікавий метод обчислення радіальних поліномів Зерніке дуже приємним рекурсивним способом. Формула рекурсії напрочуд проста, без ділення чи множення на великі цілі числа: Я б рекомендував поглянути на рисунок 1 у Хонарварі та Парамесрані документ, який наочно ілюструє залежності між різними поліномами Зерніке.

Rнм(ρ)=ρ(Rн-1|м-1|(ρ)+Rн-1м+1(ρ))-Rн-2м(ρ)

Це реалізовано у наступному сценарії 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)

Наприклад, на малюнку, отриманому цим кодом, видно, що при і катастрофічне скасування відбувається поблизу , якщо радіальні поліноми Зерніке обчислюються через многочлени Якобі. Тому потрібно також турбуватися про точність поліномів Зерніке нижнього ступеня.м=22н=112ρ=0,7

введіть тут опис зображення

Рекурсивний метод здається набагато більш придатним для стабільного обчислення цих поліномів вищого порядку Зерніке. Тим не менш, для і максимальна різниця між методом Якобі і рекурсивним методом становить (тільки?) , Що може бути достатньо точним для вашого застосування.м=0н=461.4e-10


Ваш сюжет виглядає як помилка в Matlab's jacobiPD, не як будь-яке загальне катастрофічне скасування.
Кирило

@Kiril: Я використав Санчіс ' JacobiPDз його відповіді . Це добре працює для поліномів низького порядку. Наприклад, при , довільному та довільному , різниця між двома методами менша, ніж . Хоча окремі доданки в підсумовуванні малі, вони можуть стати великими після множення на . Більше того, вони мають чергування знаку, що є ідеальним рецептом для катастрофічного скасування. н=30мρ6.9e-13JacobiPDfactorial(n+a) * factorial(n+b)
Вім

(продовження) Напр., з виразом та , може стати настільки ж великим , поки сума лише в кінцевому підсумку. Ви можете назвати це помилкою, але з нескінченною точністю відповідь була б правильною. Чи можете ви пояснити, що ви маєте на увазі під "відсутністю загального катастрофічного скасування"? м=22н=1121/(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
Вім

1
@wim Я не помітив, що це не Матлаб. Якщо реалізація поліномів Якобі досить хороша для своїх цілей, це не проблема. Я лише сказав, що це помилка, тому що я неправильно зрозумів і подумав, що це вбудована функція (я очікую, що функції бібліотеки будуть дуже надійними). Під "загальним" я мав на увазі, що якщо ви не знаєте, як функція реалізована, ви не можете назвати неправильні виходи "катастрофічним скасуванням", як термін "загальний" для будь-яких помилок, але це було лише моїм нерозумінням того, що код робив.
Кирило

1
Щоб було зрозуміло: мій код не є рекурсивним. Це ітеративне стандартне тричасне відношення рецидивів (подібне до поліносів Чебишева), яке, як правило, має бути більш стійким, ніж, наприклад, форма Хорнера для поліномів.
гаммейстер

8

Можливим рішенням (запропонованим @gammatester) є використання многочленів Якобі. Це обходить проблему катастрофічного скасування при додаванні великих коефіцієнтів поліномів шляхом «наївної» оцінки поліномів.

Радіальний многочлен Зерніке може бути виражений поліномами Якобі таким чином (див. Рівняння (6) )

Rнм(ρ)=(-1)(н-м)/2ρмП(н-м)/2(м,0)(1-2ρ2)

Однак у MATLAB використання jacobiP(n,a,b,x)неприпустимо повільного для великих векторів / матриць x=rho. jacobiPФункція фактично є частиною символічного Toolbox, і оцінка полінома відкладається на символічному двигун, який торгує швидкість для довільної точності. Таким чином, необхідна ручна реалізація поліномів Якобі.

Оскільки параметри функції Якобі всі невід’ємні ( , , ), ми можемо використовувати наступне вираження (див. Вікіпедію , зауважимо, що я заповнив значення для ) α=мβ=0н=(н-м/2)с

Пн(α,β)(ρ)=(н+α)!(н+β)!с=0н[1с!(н+α-с)!(β+с)!(н-с)!(х-12)н-с(х+12)с]

В MATLAB, це призводить до (Jacobi р olice д epartment Р olynomial, ' D ouble' реалізації)

function P = jacobiPD(n,a,b,x)
    P = 0;
    for  s  0:n
        P = P + ...
            1/(factorial(s)*factorial(n+a-s)*factorial(b+s)*factorial(n-s)) * ...
            ((x-1)/2).^(n-s).*((x+1)/2).^s;
    end
    P = P*factorial(n+a) * factorial(n+b);
end

Фактичний радіальний многочлен Зерніке, таким чином, (для m=abs(m))

Z = @(m,n,rho) (-1)^((n-m)/2) * rho.^m .* jacobiPD((n-m)/2,m,0,1-2*rho.^2);

Примітка: ця самовідповідь є лише практичним рішенням; не соромтеся позначити іншу відповідь, яка пояснює, чому це працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.