Độ ổn định số của đa thức Zernike bậc cao


9

Tôi đang cố gắng để tính toán bậc cao (ví dụ m=0, n=46) những khoảnh khắc Zernike đối với một số hình ảnh. Tuy nhiên, tôi đang gặp phải một vấn đề liên quan đến đa thức xuyên tâm (xem wikipedia ). Đây là một đa thức được xác định trong khoảng [0 1]. Xem mã MATLAB bên dưới

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

Tuy nhiên, điều này rõ ràng chạy vào các vấn đề số gần RHO > 0.9. Một đa thức có nhiều tiếng ồn

Tôi đã thử tái cấu trúc nó để polyvalnghĩ rằng nó có thể có một số thuật toán hậu trường tốt hơn nhưng điều đó không giải quyết được gì. Chuyển đổi nó thành một phép tính tượng trưng đã tạo ra biểu đồ mong muốn nhưng lại chậm chạp ngay cả đối với một biểu đồ đơn giản như được hiển thị.

Có cách nào ổn định về mặt số để đánh giá các đa thức bậc cao như vậy không?


3
Rnm(r)=(1)(nm)/2rmP(nm)/2(m,0)(12r2)?

@gammatester Điều đó có hiệu quả! Có lẽ bạn có thể giải thích trong một câu trả lời về lý do tại sao điều này sẽ là trường hợp?
Sanchise

Rất vui khi biết rằng nó hoạt động. Thật không may, tôi không thể đưa ra một câu trả lời quyết định vì hai lý do. Thứ nhất: mặc dù người ta thường biết rằng đa thức trực giao có đặc tính ổn định tốt hơn dạng chuẩn, tôi không biết một bằng chứng chính thức (đặc biệt là trong trường hợp này). Thứ hai tôi không sử dụng Matlab và không thể cung cấp dữ liệu cho các đa thức Jacobi đã triển khai.
chơi trò chơi

1
@Sanchises Không có bữa ăn trưa miễn phí ở đây: chỉ vì một thứ gì đó là đa thức không có nghĩa là công thức trực tiếp về quyền hạn là cách tính toán chính xác, và tính toán đa thức Jacobi chính xác không phải là vấn đề tầm thường mà bạn không làm nó thông qua các hệ số, vì vậy nó không rẻ như vậy.
Kirill

2
Lý do nó hoạt động để sử dụng đa thức Jacobi là vì bạn thoát khỏi sự hủy bỏ thảm khốc trong công thức của bạn (nhìn vào tất cả các yếu tố dao động với hệ số rất lớn!), Và quy trình đánh giá đa thức Jacobi mặc định được thực hiện cẩn thận trong thư viện nên được đảm bảo cẩn thận trong thư viện. là chính xác. Hầu hết các công việc ở đây được thực hiện để đảm bảo các đa thức Jacobi được đánh giá chính xác.
Kirill

Câu trả lời:


7

Rnm(ρ)=ρ(Rn1|m1|(ρ)+Rn1m+1(ρ))Rn2m(ρ)

Điều này được thực hiện trong tập lệnh Octave sau:

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)

m=22n=112ρ=0.7

nhập mô tả hình ảnh ở đây

m=0n=461.4e-10


Cốt truyện của bạn trông giống như một lỗi trong Matlab jacobiPD, không giống như bất kỳ sự hủy bỏ thảm khốc chung chung nào.
Kirill

JacobiPDn=30mρ6.9e-13JacobiPDfactorial(n+a) * factorial(n+b)

m=22n=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 Tôi không nhận thấy đó không phải là Matlab. Nếu việc thực hiện đa thức Jacobi của ai đó đủ tốt cho mục đích của họ, thì đó không phải là vấn đề. Tôi chỉ nói đó là một lỗi vì tôi đã hiểu nhầm và nghĩ rằng đó là một hàm tích hợp (tôi hy vọng các hàm thư viện sẽ rất chắc chắn). Bởi "chung chung" Tôi có nghĩa là nếu bạn không biết cách thực hiện chức năng, bạn không thể gọi đầu ra không chính xác là "hủy bỏ thảm khốc" như một thuật ngữ bắt tất cả các loại lỗi, nhưng đó chỉ là sự hiểu lầm của tôi về những gì mã đã được thực hiện.
Kirill

1
Để rõ ràng: mã của tôi không được đệ quy. Đó là mối quan hệ lặp lại ba kỳ tiêu chuẩn lặp lại (tương tự với đa thức Ch Quashev) được cho là thường ổn định hơn so với dạng Horner cho đa thức.
chơi trò chơi

8

Một giải pháp khả thi (được đề xuất bởi @gammatester) là sử dụng đa thức Jacobi. Điều này giải quyết vấn đề hủy bỏ thảm khốc trong việc thêm các hệ số đa thức lớn bằng cách đánh giá đa thức 'ngây thơ'.

Đa thức Zernike xuyên tâm có thể được biểu thị bằng đa thức Jacobi như sau (xem phương trình (6) )

Rnm(ρ)=(1)(nm)/2ρmP(nm)/2(m,0)(12ρ2)

Tuy nhiên, trong MATLAB, việc sử dụng jacobiP(n,a,b,x) chậm không thể chấp nhận được đối với các vectơ / ma trận lớn x=rho. Các jacobiPchức năng thực sự là một phần của hộp công cụ tượng trưng, và đánh giá của đa thức được hoãn lại để các công cụ mang tính biểu tượng, giao dịch tốc độ cho độ chính xác tùy ý. Do đó, việc thực hiện thủ công các đa thức Jacobi là cần thiết.

α=mβ=0n=(nm/2)s

Pn(α,β)(ρ)=(n+α)!(n+β)!s=0n[1s!(n+αs)!(β+s)!(ns)!(x12)ns(x+12)s]

Trong MATLAB, điều này chuyển đến (Jacobi p olice d epartment P olynomial, ' D Gấp đôi' thực hiện)

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

Do đó, đa thức Zernike xuyên tâm thực tế là (cho m=abs(m))

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

Lưu ý: tự trả lời này chỉ là một giải pháp thực tế; vui lòng gắn thẻ vào một câu trả lời khác giải thích tại sao điều này hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.