เสถียรภาพเชิงตัวเลขของพหุนาม 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
บ่อยครั้งที่มันจะดีกว่าที่จะใช้ polynomials มุมฉากที่นี่มีหลายชื่อ Jacobi คุณเคยลองmathworks.com/help/symbolic/jacobip.html และความสัมพันธ์
Rnม.(R)=(-1)(n-ม.)/2Rม.P(n-ม.)/2(ม.,0)(1-2R2)?
gammatester

@gammatester ใช้งานได้! คุณอาจอธิบายรายละเอียดเกี่ยวกับสาเหตุที่เป็นไปได้หรือไม่
Sanchises

นีซได้ยินว่ามันใช้งานได้ น่าเสียดายที่ฉันไม่สามารถให้คำตอบที่ตัดสินใจได้ด้วยเหตุผลสองประการ ครั้งแรก: แม้ว่าจะเป็นที่รู้กันโดยทั่วไปว่าชื่อพหุนามฉากมีคุณสมบัติความมั่นคงที่ดีกว่ารูปแบบมาตรฐานฉันไม่ทราบหลักฐานที่เป็นทางการ (โดยเฉพาะในกรณีนี้) ที่สองฉันไม่ได้ใช้ Matlab และไม่สามารถให้ข้อมูลสำหรับชื่อพหุนาม Jacobi ที่ใช้งานได้
gammatester

1
@Sanchises ไม่มีอาหารกลางวันฟรีที่นี่: เพียงเพราะสิ่งที่เป็นพหุนามไม่ได้หมายความว่าสูตรโดยตรงในแง่ของพลังเป็นวิธีที่ถูกต้องในการคำนวณและการคำนวณชื่อพหุนาม Jacobi อย่างถูกต้องไม่ได้เป็นเรื่องเล็กน้อย - คุณไม่ได้ทำ มันผ่านค่าสัมประสิทธิ์ดังนั้นมันจึงไม่ถูก
คิริลล์

2
เหตุผลที่ใช้งานได้ดีกับ Jacobi polynomials คือคุณกำจัดการยกเลิกความหายนะในสูตรของคุณ (ดูที่ปัจจัยการสั่นทั้งหมดที่มีค่าสัมประสิทธิ์ขนาดใหญ่มาก!) และขั้นตอนการประเมินค่าพหุนาม Jacobi เริ่มถูกนำมาใช้อย่างระมัดระวังในห้องสมุด เพื่อความถูกต้อง งานส่วนใหญ่ที่นี่ทำเพื่อให้แน่ใจว่าชื่อพหุนาม Jacobi ได้รับการประเมินอย่างถูกต้อง
คิริลล์

คำตอบ:


7

ในบทความนี้ Honarvar และ Paramesran ได้รับวิธีการที่น่าสนใจในการคำนวณพหุนาม Zernike เรเดียนในแบบเรียกซ้ำที่ดีมาก สูตรการเรียกซ้ำตรงไปตรงมาอย่างน่าประหลาดใจโดยไม่มีการหารหรือการคูณด้วยจำนวนเต็มขนาดใหญ่:

Rnม.(ρ)=ρ(Rn-1|ม.-1|(ρ)+Rn-1ม.+1(ρ))-Rn-2ม.(ρ)
ฉันขอแนะนำให้ดูที่รูปที่ 1 ในกระดาษ Honarvar และ Paramesran ซึ่งแสดงให้เห็นอย่างชัดเจนถึงการพึ่งพาระหว่างชื่อพหุนาม Zernike ที่ต่างกัน

สิ่งนี้ถูกนำไปใช้ในสคริปต์อ็อกเทฟต่อไปนี้:

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 ผ่านพหุนาม Jacobi ดังนั้นเราจึงต้องกังวลเกี่ยวกับความถูกต้องของพหุนาม Zernike ระดับต่ำกว่า

ป้อนคำอธิบายรูปภาพที่นี่

วิธีการเรียกซ้ำดูเหมือนว่าจะเหมาะสมกว่าสำหรับการคำนวณโพลิโนมิล Zernike ที่มีลำดับสูงกว่าเหล่านี้ในลักษณะที่เสถียร อย่างไรก็ตามสำหรับม.=0 และ n=46ความแตกต่างสูงสุดระหว่าง Jacobi และวิธีการเรียกซ้ำคือ (เท่านั้น) 1.4e-10ซึ่งอาจแม่นยำเพียงพอสำหรับการสมัครของคุณ


พล็อตของคุณดูเหมือนว่าบั๊กใน Matlab jacobiPDไม่เหมือนกับการยกเลิกหายนะทั่วไป
คิริลล์

@Kiril: ผมใช้ Sanchises' JacobiPDจากคำตอบของเขา สิ่งนี้ทำงานได้ดีสำหรับพหุนามแบบลำดับต่ำ ตัวอย่างเช่นด้วยn=30โดยพลการ ม.และโดยพลการ ρ6.9e-13ความแตกต่างระหว่างทั้งสองวิธีจะน้อยกว่า แม้ว่าในแต่ละแง่บวกของที่มีขนาดเล็กที่พวกเขาอาจจะมีขนาดใหญ่หลังจากคูณด้วยJacobiPD factorial(n+a) * factorial(n+b)ยิ่งไปกว่านั้นพวกเขามีสัญญาณสลับซึ่งเป็นสูตรที่สมบูรณ์แบบสำหรับการยกเลิกภัยพิบัติ
Wim

(ต่อ) เช่นกับ ม.=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ในที่สุด คุณสามารถเรียกสิ่งนี้ว่าบั๊ก แต่ด้วยความแม่นยำที่ไม่สิ้นสุดคำตอบก็จะถูกต้อง คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย "ไม่มีการยกเลิกภัยพิบัติทั่วไป"?
Wim

1
@ ฉันไม่ได้สังเกตว่ามันไม่ใช่ของ Matlab หากการใช้พหุนาม Jacobi ของใครบางคนดีพอสำหรับจุดประสงค์ของพวกเขานั่นก็ไม่ใช่ปัญหา ฉันแค่บอกว่ามันเป็นข้อผิดพลาดเพราะฉันเข้าใจผิดและคิดว่ามันเป็นฟังก์ชั่นในตัว (ฉันคาดว่าฟังก์ชั่นห้องสมุดจะแข็งแกร่งมาก) โดย "ทั่วไป" ฉันหมายความว่าถ้าคุณไม่รู้วิธีใช้งานฟังก์ชั่นคุณไม่สามารถเรียกผลลัพธ์ที่ไม่ถูกต้อง "การยกเลิกหายนะ" เช่นคำที่จับได้ทั้งหมดสำหรับข้อผิดพลาดทุกประเภท แต่นั่นเป็นเพียงความเข้าใจผิดของฉัน รหัสกำลังทำ
คิริลล์

1
เพื่อความชัดเจน: รหัสของฉันไม่สามารถเรียกซ้ำได้ มันเป็นมาตรฐานซ้ำสามคำสัมพันธ์ซ้ำ (คล้ายกับ Chebyshev ชื่อพหุนาม) ซึ่งควรจะมีเสถียรภาพมากกว่าปกติเช่น e กรัมฮอร์เนอร์แบบฟอร์มสำหรับชื่อที่ประกอบด้วยหลายคำ
gammatester

8

ทางออกที่เป็นไปได้ (แนะนำโดย @gammatester) คือการใช้ชื่อพหุนาม Jacobi ปัญหานี้ทำให้เกิดปัญหาการยกเลิกหายนะในการเพิ่มสัมประสิทธิ์พหุนามขนาดใหญ่โดยการประเมินพหุนามไร้เดียงสา

พหุนาม Zernike เรเดียลสามารถแสดงได้โดยพหุนาม Jacobi ดังนี้ (ดูสมการ (6) )

Rnม.(ρ)=(-1)(n-ม.)/2ρม.P(n-ม.)/2(ม.,0)(1-2ρ2)

อย่างไรก็ตามใน MATLAB การใช้งานjacobiP(n,a,b,x)ช้าx=rhoเกินไปสำหรับเวกเตอร์ / เมทริกซ์ขนาดใหญ่ที่ยอมรับไม่ได้ jacobiPฟังก์ชั่นเป็นจริงส่วนหนึ่งของสัญลักษณ์กล่องเครื่องมือและการประเมินผลของพหุนามจะรอให้เครื่องยนต์สัญลักษณ์ซึ่งธุรกิจการค้าความเร็วเพื่อความแม่นยำโดยพลการ การดำเนินการด้วยตนเองของชื่อพหุนาม Jacobi จึงจำเป็น

เนื่องจากพารามิเตอร์ของฟังก์ชัน Jacobi นั้นเป็นค่าลบทั้งหมด (α=ม., β=0, n* * * *=(n-ม./2)) เราสามารถใช้นิพจน์ต่อไปนี้ (ดูWikipediaโปรดทราบว่าฉันเติมค่าไว้สำหรับs)

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

ใน MATLAB นี่แปลว่า (Jacobi p olice d epartment P olynomial การใช้ ' D oub')

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);

หมายเหตุ: คำตอบด้วยตนเองนี้เป็นเพียงวิธีแก้ปัญหาในทางปฏิบัติ; แท็กคำตอบอื่นที่อธิบายว่าทำไมจึงทำงานได้อย่างอิสระ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.