고차 Zernike 다항식의 수치 안정성


9

일부 이미지의 Zernike 순간을 더 높은 순서 (예 : m=0, n=46) 로 계산하려고합니다 . 그러나 방사형 다항식에 관한 문제가 있습니다 ( 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
종종 직교 다항식, 여기서 Jacobi 다항식 을 사용하는 것이 좋습니다 . mathworks.com/help/symbolic/jacobip.html 과 관계 를 사용해 보셨습니까?
아르 자형미디엄(아르 자형)=(1)(미디엄)/2아르 자형미디엄(미디엄)/2(미디엄,0)(12아르 자형2)?
gammatester

@gammatester 그게 작동합니다! 이것이 왜 그런지에 대한 답을 자세히 설명해 주시겠습니까?
Sanchises

잘 작동한다고 들었습니다. 불행히도 나는 두 가지 이유로 속이 된 답변을 줄 수 없습니다. 첫째 : 직교 다항식이 표준 형식보다 더 나은 안정성을 갖는 것으로 일반적으로 알려져 있지만 공식적인 증거는 알 수 없습니다 (특히이 경우). 둘째, Matlab을 사용하지 않으며 구현 된 Jacobi 다항식에 대한 데이터를 제공 할 수 없습니다.
gammatester

1
@Sanchises 여기에 무료 점심은 없습니다. 다항식이기 때문에 힘의 관점에서 직접 공식을 계산하는 것이 올바른 방법임을 의미하는 것은 아니며 Jacobi 다항식을 정확하게 계산하는 것이 그 자체로는 사소한 문제가 아닙니다. 계수를 통해 계산하므로 저렴하지는 않습니다.
Kirill

2
Jacobi 다항식을 사용하는 이유는 수식에서 치명적인 취소를 제거하고 (매우 큰 계수를 갖는 모든 진동 요소를보십시오!) 기본 Jacobi 다항식 평가 절차는 라이브러리에서 신중하게 구현되므로 보장됩니다. 정확합니다. 여기서 대부분의 작업은 Jacobi 다항식이 정확하게 평가되도록하기 위해 수행됩니다.
Kirill

답변:


7

에서 본 논문 , Honarvar 및 Paramesran 아주 좋은 재귀 방식으로 반경 제르 니케 다항식을 계산하는 흥미로운 방법을 도출. 재귀 수식은 큰 정수로 나누거나 곱하지 않고 놀랍도록 간단합니다.

아르 자형미디엄(ρ)=ρ(아르 자형1|미디엄1|(ρ)+아르 자형1미디엄+1(ρ))아르 자형2미디엄(ρ)
Honarvar와 Paramesran 논문에서 그림 1을보고 다른 Zernike 다항식 간의 종속성을 명확하게 보여줄 것을 권장합니다.

이것은 다음 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.7Zernike 방사형 다항식은 Jacobi 다항식을 통해 계산됩니다. 따라서 저급 Zernike 다항식의 정확성에 대해서도 걱정해야합니다.

여기에 이미지 설명을 입력하십시오

재귀 방법은 이러한 고차 Zernike 다항식을 안정적인 방식으로 계산하는 데 훨씬 더 적합한 것으로 보입니다. 그럼에도 불구하고미디엄=0=46Jacobi와 재귀 적 방법의 최대 차이는 (단지?) 1.4e-10이며 응용 프로그램에 충분히 정확할 수 있습니다.


귀하의 음모는 Matlab의 버그처럼 보이지만 jacobiPD일반적인 치명적인 취소와 는 다릅니다 .
Kirill

@ Kiril : 나는 그의 대답JacobiPD 에서 Sanchises를 사용 했습니다 . 이것은 낮은 차수의 다항식에 적합합니다. 예를 들어=30, 임의 미디엄및 임의 ρ두 방법의 차이는보다 작습니다 6.9e-13. 의 합계에 포함 된 개별 항 JacobiPD은 작지만을 곱한 후 커질 수 있습니다 factorial(n+a) * factorial(n+b). 또한 대체 기호가있어 치명적인 취소에 대한 완벽한 조리법입니다.
wim

예를 들어 미디엄=22=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
wim

1
@ wim 나는 그것이 Matlab이 아니라는 것을 알지 못했습니다. 누군가의 Jacobi 다항식 구현이 목적에 충분하다면 아무 문제가 없습니다. 나는 단지 오해하고 그것이 내장 함수라고 생각했기 때문에 버그라고 말했다. (라이브러리 함수는 매우 견고 할 것으로 예상된다). "generic"이란 함수가 어떻게 구현되는지 모르는 경우 모든 종류의 오류에 대한 포괄적 인 용어처럼 잘못된 결과를 "치명적인 취소"라고 부를 수는 없다는 것을 의미했습니다. 코드가하고있었습니다.
Kirill

1
분명히하기 위해 : 내 코드는 재귀 적이 지 않습니다. 다항식의 호너 형태보다 일반적으로 더 안정적인 것으로 추정되는 반복 표준 3 기 반복 관계 (체비 쇼프 다항식과 유사)입니다.
gammatester

8

@gammatester가 제안한 가능한 해결책은 Jacobi 다항식을 사용하는 것입니다. 이것은 '순수한'다항식 평가에 의해 큰 다항식 계수를 추가 할 때 치명적인 소거 문제를 회피합니다.

방사형 Zernike 다항식은 다음과 같이 Jacobi 다항식으로 표현할 수 있습니다 ( 식 (6) 참조 ).

아르 자형미디엄(ρ)=(1)(미디엄)/2ρ미디엄(미디엄)/2(미디엄,0)(12ρ2)

그러나 MATLAB에서는의 jacobiP(n,a,b,x)큰 벡터 / 행렬에 대해 사용 이 용납 될 수 없습니다 x=rho. 이 jacobiP함수는 실제로 Symbolic Toolbox의 일부이며, 다항식의 평가는 임의의 정밀도를 위해 속도를 교환하는 기호 엔진으로 연기됩니다. 따라서 Jacobi 다항식을 수동으로 구현해야합니다.

Jacobi 함수에 대한 매개 변수는 모두 음이 아니므로 (α=미디엄, β=0, =(미디엄/2)), 우리는 볼 (다음 식을 사용할 수 있습니다 위키 백과를 내가의 값에 작성하는 것으로,에스)

(α,β)(ρ)=(+α)!(+β)!에스=0[1에스!(+α에스)!(β+에스)!(에스)!(엑스12)에스(엑스+12)에스]

MATLAB, 이것은 (자코비 변환에 P olice D epartment P 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

실제 방사형 Zernike 다항식은 (for m=abs(m))

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

참고 :이 자체 답변은 실용적인 솔루션 일뿐입니다. 이것이 왜 효과가 있는지 설명하는 다른 답변에 자유롭게 태그하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.