FAS-multigrid chậm hơn sửa lỗi khiếm khuyết tuyến tính?


9

Tôi đã triển khai một bộ giải đa biến V-Chu kỳ bằng cách sử dụng cả hiệu chỉnh sai số tuyến tính (LDC) và sơ đồ xấp xỉ đầy đủ (FAS).

Vấn đề của tôi là như sau: Sử dụng LDC, phần dư giảm đi 3% mỗi chu kỳ. Việc triển khai FAS cũng hội tụ với một yếu tố tuyến tính, nhưng hệ số này chỉ ~ 0,58. Do đó FAS cần khoảng 20 lần số chu kỳ.

Hầu hết các mã được chia sẻ, sự khác biệt duy nhất là tính toán xuống / lên, LDC sử dụng

xuống: bạnH: =0,bH: =TôihH(bh-Lhbạnh)

lên: bạnh: =bạnh+TôiHhbạnH

và FAS sử dụng

xuống: bạnH: =TôihHbạnh,bH: =TôihHbh+LHTôihHbạnh-TôihHLhbạnh

lên: bạnh: =bạnh+TôiHh(bạnH-TôihHbạnh)

Cài đặt thử nghiệm của tôi là từ "Hướng dẫn đa luồng, Ấn bản thứ hai" của Brigg, tr. 64, có giải pháp phân tích

bạn(x,y)= =(x2-x4)(y4-y2)với x,y[0,1]2

và phương trình là bằng cách sử dụng điển hình tuyến tính stencil 5 điểm như Laplace-Operator L . Dự đoán ban đầu là v = 0 .Lv= =Δbạn=:bLv= =0

Thay đổi cài đặt thử nghiệm, ví dụ: tầm thường ( x , y ) = 0 bằng cách sử dụng dự đoán ban đầu là v = 1 dẫn đến các yếu tố hội tụ gần như giống nhau.bạn(x,y)= =0v= =1

Vì chỉ có mã giảm / giảm khác nhau, kết quả LDC tuân thủ cuốn sách và ít nhất FAS dường như cũng hoạt động, tôi không biết tại sao nó lại chậm hơn nhiều trong cùng một cài đặt tuyến tính.

Có một hành vi kỳ lạ trong cả LDC và FAS mà tôi không thể giải thích được nêu ra mà chỉ xảy ra nếu đoán ban đầu là xấu (ví dụ mà còn trong các thí nghiệm multigrid đầy đủ của tôi nơi suy cho lưới điện tốt mới làm tăng còn sót lại từ 10 - 15 đến 10 - 1 ): Nếu tôi tăng số lần thư giãn hiệu chỉnh bài lên một số rất cao sao cho giải pháp được giải quyết với độ chính xác của máy trên lưới thô, nó sẽ mất gần như tất cả các chữ số khi đi lên một bước tới lưới mịn tiếp theo.=01015101

Vì một bức tranh nói nhiều hơn lời nói:

// first cycle, levels 0-4
// DOWN
VCycle top 4, start               res_norm 3.676520e+02 // initial residual
VCycle top 4, cycle 0, current 4, res_norm 3.676520e+02
VCycle top 4, cycle 0, current 4, res_norm 1.520312e+02 // relaxed (2 iterations)
VCycle tau_norm 2.148001e+01 (DEBUG calculation)
VCycle top 4, cycle 0, current 3, res_norm 1.049619e+02 // restricted
VCycle top 4, cycle 0, current 3, res_norm 5.050392e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 2, res_norm 3.518764e+01 // restricted
VCycle top 4, cycle 0, current 2, res_norm 1.759372e+01 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 1, res_norm 1.234398e+01 // restricted
VCycle top 4, cycle 0, current 1, res_norm 4.728777e+00 // relaxed (2 iterations)
VCycle top 4, cycle 0, current 0, res_norm 3.343750e+00 // restricted
// coarsest grid
VCycle top 4, cycle 0, current 0, res_norm 0.000000e+00 // solved
// UP
VCycle top 4, cycle 0, current 1, res_norm 3.738426e+00 // prolonged
VCycle top 4, cycle 0, current 1, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 2, res_norm 1.509429e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 2, res_norm 2.512148e-15 // relaxed (many iterations)
VCycle top 4, cycle 0, current 3, res_norm 4.695979e+01 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 3, res_norm 0.000000e+00 // relaxed (many iterations)
VCycle top 4, cycle 0, current 4, res_norm 1.469312e+02 // prolonged (loosing digits)
VCycle top 4, cycle 0, current 4, res_norm 9.172812e-24 // relaxed (many iterations)

Tôi không chắc chắn nếu chỉ có thể có một vài chữ số đạt được trong mỗi chu kỳ hoặc nếu điều này chỉ ra lỗi trong quá trình nội suy vào lưới mịn. Nếu là trường hợp sau, làm thế nào LDC có thể đạt được tỷ lệ còn lại trong sách ~ 0,03 khi sử dụng luôn 2 lần thư giãn?

Câu trả lời:


7

Tôi không trực tiếp biết câu trả lời của bạn vì tôi chủ yếu sử dụng FAS thay vì chỉnh sửa vì tôi thực hiện nhiều vấn đề phi tuyến, nhưng một số suy nghĩ bạn có thể xem xét:

  • Bạn đang áp dụng sơ đồ hiệu chỉnh tuyến tính cho một vấn đề tuyến tính, vì vậy nó không gây sốc khi nó hoạt động rất tốt.

  • Xem xét các điều kiện biên của bạn: đảm bảo rằng bạn đang thực hiện chúng một cách chính xác và cũng lưu ý rằng các BC phức tạp có thể trông hoàn toàn khác nhau trên lưới thô, khiến việc chỉnh sửa ở đó không hữu ích lắm.

  • Kiểm tra lại việc điều trị của bạn về thuật ngữ nguồn; Tôi nhớ lại việc làm hỏng một cái gì đó trong giai đoạn kéo dài liên quan đến thuật ngữ đó khi tôi viết nó cho poisson.

  • Tôi chưa bao giờ thấy sự cần thiết phải lặp lại để hội tụ trên lưới thô nhất. Một giải pháp ở đó phụ thuộc vào phần dư của lưới là chính xác, điều đó không đúng. Bạn đang cố gắng đẩy những lỗi đó ra khỏi miền / xóa chúng đi. Nếu bạn đã hội tụ đầy đủ vào lưới thô nhất trong một lần lặp đầu tiên, thì giải pháp của bạn hoàn toàn khác xa với giải pháp lưới chính xác vì phần dư của bạn không cập nhật. Đây gần như chắc chắn là lý do tại sao bạn nhìn thấy phần dư nhảy lên trong giai đoạn kéo dài.

  • Ngoài ra, hãy thử một yếu tố thư giãn cho cả toán tử hạn chế và kéo dài, giả sử 0,75.

Nếu nó có ích, đây là lịch sử còn lại của FAS của tôi đối với sự cố poisson khi sử dụng lưới đơn qua các chu kỳ 7V đầy đủ. Tôi tin rằng hệ số thư giãn là 0,75 và tôi đã sử dụng sơ đồ RK 3 giai đoạn để mượt mà hơn với một lần lặp duy nhất ở mỗi cấp độ lưới.

lịch sử


Cảm ơn câu trả lời của bạn, trường hợp tuyến tính và BC đơn giản (viền vuông = 0) chỉ là bước đầu tiên, việc kiểm tra các trường hợp thực tế sẽ được thực hiện sau khi cài đặt "dễ dàng" hoạt động. Tôi không chắc nếu tôi hiểu ý của bạn với yếu tố thư giãn để hạn chế và kéo dài. Tôi hiện đang sử dụng phép nội suy song tuyến để kéo dài và giảm nửa trọng số cho hạn chế.
Silpion

bạnh: =bạnh+αTôiHh(bạnH-TôihHbạnh)0<α<1

(1-α)

@Aurelius bạn đề cập rằng việc hội tụ trên lưới thô là không cần thiết. Tôi đồng ý với lý luận của bạn, nhưng bằng chứng hội tụ trong tài liệu (đối với trường hợp tuyến tính) cho rằng giải quyết lưới thô là chính xác. Tôi không biết về bất kỳ tài liệu tham khảo nào (đối với trường hợp tuyến tính hoặc phi tuyến) trong đó nói rằng giải quyết lưới thô không nên chính xác, và tự hỏi liệu bạn có thể trích dẫn một tài liệu tham khảo cho điều này không? Tôi sẽ rất thích thú khi nhìn thấy điều này bản thân mình
Keeran Brabazon 14/11/13

@KeeranBrabazon Tôi cũng không có tài liệu tham khảo cho điều này, và tôi thực sự không quen thuộc lắm với các chi tiết về bằng chứng hội tụ cho multigrid. Tôi khuyên bạn nên tìm kiếm bất kỳ tài liệu sớm nào giới thiệu yếu tố thư giãn đó. Yếu tố đó là phổ biến đối với tất cả các triển khai đa luồng hiện đại mà tôi đã thấy, và theo trực giác thì sẽ không cần thiết nếu các giải pháp khóa học chính xác là cần thiết / mong muốn. Để chứng minh trực quan, tôi chỉ cần tưởng tượng các điều kiện biên trông như thế nào đối với lưới thô nhất so với lưới tốt nhất. Thật dễ dàng để tưởng tượng họ tạo ra các giải pháp rất khác nhau.
Aurelius

6

TôihHTôi^hHbạnhbạnh(bạnH-TôihHbạnh)Tôi^hHbạnh

Nhìn chung, hạn chế trạng thái chỉ cần thứ tự cao thứ cấp (bảo toàn chính xác tần số thấp), nhưng thứ tự chính (răng cưa của tần số cao) không quan trọng. Tiêm có thứ tự chính 0 và thứ tự vô hạn thứ cấp. Trong khi đó, hạn chế còn lại cần cả thứ tự chính và thứ cấp là tích cực (ít nhất). Xem phần 4.3 của Hướng dẫn đa điểm của Achi Brandt .

Khi thiết kế các phương pháp MG, cũng tốt khi xem xét lỗi thay vì dư và để đảm bảo bạn cân nhắc định mức phù hợp.


Điểm tốt, và tôi đã không đề cập đến một cái gì đó dọc theo những dòng đó. Một khía cạnh quan trọng của việc sử dụng multigrid thực tế là sự lựa chọn mượt mà hơn: bạn muốn một lỗi làm giảm các lỗi tần số cao càng nhanh càng tốt, giải quyết vấn đề bạn mô tả.
Aurelius

@Aurelius Từ nhật ký được cung cấp, bạn có thể thấy rằng mượt mà hơn không phải là vấn đề. Hãy nhớ lại rằng Silpion đang sử dụng mượt mà hơn đối với MG hiệu chỉnh khuyết tật, hội tụ đúng.
Jed Brown

>0,8

1

bạnotôidH= =TôihHbạnh

bạnhbạnh+TôiHh(bạnH-TôihHbạnh)= =bạnh+TôiHh(bạnH-bạnotôidH)

H2HbạnotôidHbạnotôidH

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.