उच्च क्रम Zernike बहुपद की संख्यात्मक स्थिरता


9

मैं कुछ छवि के लिए उच्च क्रम (जैसे m=0, n=46) , Zernike क्षणों की गणना करने की कोशिश कर रहा हूं । हालाँकि, मैं रेडियल बहुपद के बारे में एक समस्या में चल रहा हूँ ( विकिपीडिया देखें )। यह एक बहुपद है जिसे अंतराल पर परिभाषित किया गया है [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 और संबंध का प्रयास किया है
आरn(आर)=(-1)(n-)/2आरपी(n-)/2(,0)(1-2आर2)?
gammatester

@gammatester काम करता है! क्या आप शायद इस बारे में एक जवाब में बता सकते हैं कि ऐसा क्यों होगा?
सांचेस

अच्छा लगा कि यह काम करता है। दुर्भाग्य से मैं दो कारणों से एक व्याख्यात्मक जवाब नहीं दे सकता। पहला: हालांकि यह आमतौर पर जाना जाता है कि ऑर्थोगोनल पॉलीओनियम्स में मानक रूप से बेहतर स्थिरता गुण हैं, मुझे औपचारिक प्रमाण नहीं पता है (विशेषकर इस मामले में)। दूसरा मैं मतलाब का उपयोग नहीं करता और कार्यान्वित जैकोबी बहुपद के लिए डेटा नहीं दे सकता।
gammatester

1
@ सेंचुरीज़ यहाँ कोई मुफ्त भोजन नहीं है: सिर्फ इसलिए कि कुछ एक बहुपद है इसका मतलब यह नहीं है कि शक्तियों के मामले में प्रत्यक्ष सूत्र इसकी गणना करने का सही तरीका है, और जैकोबी बहुपद की गणना सही ढंग से स्वयं एक तुच्छ मामला नहीं है! यह गुणांक के माध्यम से है, इसलिए यह उतना सस्ता नहीं है।
किरिल

2
इसका कारण यह है कि जैकोबी बहुपद का उपयोग करने के लिए काम करता है, आप अपने फार्मूले में भयावह रद्द करने से छुटकारा पा लेते हैं (उन सभी को बहुत बड़े गुणांक वाले दोलन कारकों पर ध्यान दें!), और डिफ़ॉल्ट जैकोबी बहुपद मूल्यांकन प्रक्रिया को एक पुस्तकालय में सावधानी से लागू किया जाता है, इसलिए इसकी गारंटी है। सटीक होने के लिए। यहां अधिकांश काम यह सुनिश्चित करने में किया जाता है कि जैकोबी बहुपद का सही मूल्यांकन किया जाए।
किरिल

जवाबों:


7

में इस पत्र , Honarvar और Paramesran एक बहुत अच्छी तरह से पुनरावर्ती रेडियल Zernike बहुआयामी पद गणना करने के लिए एक दिलचस्प विधि निकाले जाते हैं। बड़े पूर्णांकों द्वारा विभाजन या गुणन के बिना पुनरावृत्ति फार्मूला आश्चर्यजनक रूप से सीधा है:

आरn(ρ)=ρ(आरn-1|-1|(ρ)+आरn-1+1(ρ))-आरn-2(ρ)
मैं माननीय चित्र और परमेशर पेपर में आकृति 1 पर एक नज़र डालने की सलाह दूंगा, जो स्पष्ट रूप से अलग-अलग Zernike polynomials के बीच निर्भरता को दिखाता है।

यह निम्नलिखित ऑक्टेव लिपि में लागू किया गया है:

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, तथा n=112, प्रलयकारी निरस्तीकरण निकट आता है ρ=0.7, यदि ज़र्निक रेडियल बहुपद की गणना जैकोबी बहुपद के माध्यम से की जाती है। इसलिए, किसी को निचले-स्तर के ज़र्निक पॉलीओमियल्स की सटीकता के बारे में भी चिंता करनी होगी।

यहां छवि विवरण दर्ज करें

इन उच्च-क्रम Zernike बहुपद को स्थिर तरीके से गणना करने के लिए पुनरावर्ती विधि अधिक उपयुक्त लगती है। फिर भी, के लिए=0 तथा n=46जैकोबी और पुनरावर्ती विधि के बीच अधिकतम अंतर केवल (?) है 1.4e-10, जो आपके आवेदन के लिए पर्याप्त सटीक हो सकता है।


आपका प्लॉट माटलैब के बग जैसा दिखता है jacobiPD, न कि किसी सामान्य कैनेस्ट्रॉफिक रद्दीकरण जैसा।
किरिल

@ किरील: मैंने उनके जवाबJacobiPD से सांचेस का इस्तेमाल किया । यह कम-क्रम बहुपद के लिए अच्छी तरह से काम करता है। उदाहरण के लिए, साथn=30, मनमाना , और मनमाना ρदोनों विधियों के बीच अंतर की तुलना में कम है 6.9e-13। हालाँकि योग में व्यक्तिगत शब्द JacobiPDछोटे होते हैं, लेकिन वे गुणा करने के बाद बड़े हो सकते हैं factorial(n+a) * factorial(n+b)। इसके अलावा उनके पास बारी-बारी से हस्ताक्षर हैं, जो विनाशकारी निरस्तीकरण के लिए एक आदर्श नुस्खा है।
विम

(जारी) ईजी साथ =22 तथा n=112अभिव्यक्ति 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अंततः है। आप इसे बग कह सकते हैं, लेकिन अनंत परिशुद्धता के साथ, उत्तर सही होगा। क्या आप बता सकते हैं कि "नो जेनरिक कैस्ट्रॉफिक कैंसिलेशन" से आपका क्या मतलब है?
विम

1
@ मुझे पता नहीं है कि यह मतलूब का नहीं है। यदि किसी का जैकोबी बहुपद कार्यान्वयन उनके उद्देश्य के लिए पर्याप्त है, तो यह कोई समस्या नहीं है। मैंने केवल यह कहा कि यह एक बग है क्योंकि मैंने गलत समझा और सोचा कि यह एक अंतर्निहित कार्य है (मुझे उम्मीद है कि पुस्तकालय के कार्य बहुत ठोस होंगे)। "जेनेरिक" से मेरा मतलब था कि यदि आप यह नहीं जानते हैं कि फ़ंक्शन कैसे लागू किया जाता है, तो आप सभी प्रकार की त्रुटियों के लिए कैच-ऑल टर्म जैसे गलत आउटपुट को "भयावह रद्द" नहीं कह सकते, लेकिन यह सिर्फ मेरी गलतफहमी थी कोड कर रहा था।
किरिल

1
स्पष्ट होना: मेरा कोड पुनरावर्ती नहीं है। यह पुनरावृत्ति मानक तीन अवधि पुनरावृत्ति संबंध है (चेबिशेव पॉलिनॉमिअल्स के समान) जो बहुपद के लिए हॉर्नर रूप से सामान्य रूप से अधिक स्थिर माना जाता है।
गमटास्टर

8

जैकोबी बहुपद का उपयोग करने के लिए एक संभावित समाधान (@gammatester द्वारा सुझाया गया) है। यह 'भोले' बहुपद मूल्यांकन द्वारा बड़े बहुपद गुणांक को जोड़ने में भयावह रद्द करने की समस्या को रोकता है।

रेडियल Zernike बहुपद को जैकोबी बहुपदों द्वारा व्यक्त किया जा सकता है (देखें समीकरण (6) )

आरn(ρ)=(-1)(n-)/2ρपी(n-)/2(,0)(1-2ρ2)

MATLAB में, jacobiP(n,a,b,x)बड़े वैक्टर / मैट्रिसेस के लिए अस्वीकार्य रूप से उपयोग धीमा है x=rhojacobiPसमारोह वास्तव में प्रतीकात्मक उपकरण बॉक्स का हिस्सा है, और बहुपद के मूल्यांकन प्रतीकात्मक इंजन है, जो मनमाना परिशुद्धता के लिए गति व्यापार के लिए स्थगित किया गया है। इस प्रकार जैकोबी बहुपद का एक मैनुअल कार्यान्वयन आवश्यक है।

चूंकि जैकोबी फ़ंक्शन के पैरामीटर सभी अप्रतिष्ठित हैं (α=, β=0, n*=(n-/2)), हम निम्नलिखित अभिव्यक्ति का उपयोग कर सकते हैं ( विकिपीडिया देखें , ध्यान दें कि मैंने इसके लिए मूल्यों को भर दिया हैरों)

पीn(α,β)(ρ)=(n+α)!(n+β)!Σरों=0n[1रों!(n+α-रों)!(β+रों)!(n-रों)!(एक्स-12)n-रों(एक्स+12)रों]

MATLAB में, यह (जैकोबी पी) में अनुवाद करता है ऑलिस डी इपार्टमेंट पी ऑलिनोमियल, ' डी ' डबल 'निष्कर्ष )

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

वास्तविक रेडियल Zernike बहुपद इस प्रकार है (के लिए m=abs(m))

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

नोट: यह आत्म-उत्तर केवल एक व्यावहारिक समाधान है; एक और उत्तर पर टैग करने के लिए स्वतंत्र महसूस करें जो बताता है कि यह क्यों काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.