FAS-multigrid doğrusal hata düzeltmeden daha mı yavaş?


9

Hem doğrusal hata düzeltme (LDC) hem de tam yaklaşım şeması (FAS) kullanarak bir V-Cycle multigrid çözücü uyguladım.

Benim sorunum şu: LDC kullanarak artık döngü başına ~ 0.03 faktör azalır. FAS uygulaması da doğrusal bir faktörle yakınsar, ancak faktör sadece ~ 0.58'dir. Bu nedenle FAS, döngü sayısının yaklaşık 20 katına ihtiyaç duyar.

Kodun çoğu paylaşılır, tek fark aşağı / yukarı hesaplamalarıdır, LDC kullanır

aşağı:u'H: =0,b'H: =benh'H(bh-Lhuh)

yukarı:uh: =uh+ben'Hhu'H

ve FAS kullanımları

aşağı:u'H: =benh'Huh,b'H: =benh'Hbh+L'Hbenh'Huh-benh'HLhuh

yukarı:uh: =uh+ben'Hh(u'H-benh'Huh)

Test ayarım Brigg'in "A Multigrid Eğitimi, İkinci Baskı", s. 64, analitik çözümü vardır

u(x,y)=(x2-x4)(y4-y2) ilex,y[0,1]2

ve denklem Laplace-Operatörü olarak tipik doğrusal 5 noktalı şablon kullanılarak . İlk tahmin .Lv=Δu=:bLv=0

Test ayarının değiştirilmesi, örneğin başlangıçtaki tahmini kullanılarak önemsiz değerine dönüştürmek , neredeyse aynı yakınsama faktörleri ile sonuçlanır.u(x,y)=0v=1

Sadece aşağı / yukarı kodu farklı olduğundan, LDC sonuçları kitaba uyuyor ve FAS en azından işe yarıyor gibi görünüyor, aynı lineer ayarda neden bu kadar yavaş olduğu konusunda hiçbir fikrim yok.

LDC ve FAS'ta açıklayamadığım tek bir garip davranış var, ancak bu sadece ilk tahmin kötü olduğunda gerçekleşir (örneğin ama aynı zamanda yeni ince ızgaraya enterpolasyonun kalıntıyı ila ): Çözüm kaba ızgaradaki makine hassasiyetine çözümlenecek şekilde düzeltme sonrası gevşeme sayısına çok yüksek bir sayıya yükselirsem, bir adım yukarı çıkarken neredeyse tüm basamakları kaybeder bir sonraki ince ızgaraya.=010-1510-1

Bir resim kelimelerden daha fazlasını söylediğinden:

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

Döngü başına yalnızca birkaç basamak kazanılıp kazanılamayacağından veya ince ızgaraya enterpolasyon sırasında bir hatayı gösterip göstermediğinden emin değilim. Eğer ikinci durum söz konusuysa, LDC her zaman 2 gevşeme kullanırken kitapta kalan ~ 0.03 kalıntı oranlarına nasıl ulaşabilir?

Yanıtlar:


7

Doğrusal olmayan problemler için multigrid yaptığım için çoğunlukla düzeltme yerine FAS kullandığım için cevabınızı doğrudan bilmiyorum, ancak bazı düşünceler bakabilirsiniz:

  • Doğrusal bir soruna doğrusal bir düzeltme şeması uyguluyorsunuz, bu yüzden çok iyi sonuç vermesi şok edici değil.

  • Sınır koşullarınızı göz önünde bulundurun: doğru yaptığınızdan emin olun ve karmaşık BC'lerin kaba ızgarada tamamen farklı görünebileceğini ve buradaki düzeltmelerin o kadar kullanışlı olmadığını unutmayın.

  • Kaynak terim için tedavinizi iki kez kontrol edin; Poisson için yazdığımda, bu terimle ilgili uzama aşamasında bir şeyi mahvettiğini hatırlıyorum.

  • En kaba ızgarada yakınsama için tekrarlama ihtiyacını hiç görmedim. Buradaki bir çözüm, ince ızgara kalıntısının doğru olmasına bağlıdır, ki bu doğru değildir. Bu hataları alan adından çıkarmaya / düzeltmeye çalışıyorsunuz. Erken bir yinelemede en kaba ızgaraya tamamen yakınsanız, çözümünüz doğal olarak doğru ince ızgara çözümünden oldukça uzaktır, çünkü orada kalanlarınız güncel değildir. Neredeyse kesinlikle artıkların uzama aşamasında yükseldiğini görmenizin nedeni budur.

  • Ayrıca, sınırlama ve uzatma operatörleri için bir gevşeme faktörünü deneyin, örneğin 0,75.

Yardımcı olursa, FAS artık geçmişim tam 7V döngüleri boyunca tek bir ızgara kullanarak bir poisson sorunu için böyle görünüyordu. Gevşeme faktörünün 0.75 olduğuna inanıyorum ve 3 aşamalı bir RK şemasını, her ızgara düzeyinde tek bir yinelemeyle daha pürüzsüz olarak kullanıyordum.

res geçmişi


Cevabınız için teşekkürler, doğrusal durum ve basit BC (kare kenarlık = 0) sadece ilk adımdır, "kolay" ayarlar çalıştıktan sonra gerçek durumların test edilmesi yapılacaktır. Kısıtlama ve uzama için bir gevşeme faktörü ile ne demek istediğinizi anladığımdan emin değilim. Şu anda uzatma için bilinear enterpolasyon ve kısıtlama için yarım ağırlık kullanıyorum.
Silpion

Gevşeme ile, Uzatma için bunu şu şekilde değiştirin: burada bir gevşeme faktörüdür. Genellikle çözüm ne kadar karmaşıksa, bu faktörün o kadar düşük olması gerekir. Çok fazla süreksizliği olan çözümlerde bazen bunu yaklaşık 0,6'ya düşürmek zorunda kalıyorum, ancak genellikle 0,75-0,85 işe yarıyor. uh: =uh+αben'Hh(u'H-benh'Huh)0<α<1
Aurelius

Bunu bildiğim iyi oldu. Benim ayarımda bu sadece yakınsama oranını yavaşlatır ama daha karmaşık verileri test ederken bunu aklımızda tutacağım. (1-α)
Silpion

@Aurelius, kaba ızgarada birleşmenin gerekli olmadığını belirtiyorsunuz. Akıl yürütmenize katılıyorum, ancak literatürdeki yakınsama kanıtları (doğrusal durum için) kaba ızgara çözümünün kesin olduğunu varsayar. Ben kaba ızgara çözmek kesin olmamalıdır belirtilen ve bunun için bir referans alıntı olabilir eğer merak edildi herhangi bir referans (doğrusal veya doğrusal olmayan durum için) farkında değil misiniz? Bunu kendim görmek çok isterdim
Keeran Brabazon

@KeeranBrabazon Bunun için de bir referansım yok ve dürüstçe multigrid için yakınsama kanıtlarının ayrıntılarına yakından aşina değilim. Bu gevşeme faktörünü tanıtan herhangi bir erken literatür aramanızı öneririm. Bu faktör, gördüğüm tüm modern çoklu-enerji uygulamaları için ortaktır ve sezgisel olarak doğru kurs çözümlerinin gerekli / arzu edilir olması gerekmediği doğrudur. Sezgisel bir kanıt için, sadece en kaba ızgara için en kaba ızgara için sınır koşullarının nasıl göründüğünü hayal ediyorum. Çok farklı çözümler ürettiklerini hayal etmek kolaydır.
Aurelius

6

Tepe merkezli bir ayrıklaştırma kullanıyorsanız, durum kısıtlaması, kullandığınız gibi görünen tam ağırlıklı artık kısıtlama yerine enjeksiyon olmalıdır. Yani, değiştirinbenh'H ile ben^h'Hdevleti kısıtlarken. Durum için tam ağırlıklı kısıtlamanın kullanılması, durumun uygulandıktan sonra yüksek frekanslı bileşenlerinin örtüşmesini sağlar.uhuh(u'H-benh'Huh)kaba düzeltmeden önceki ile aynı ölçekte yeni gürültü ile sonuçlanır (sınır koşulları bu etki için özellikle muhtemel suçlulardır). Enjeksiyon kullanın,ben^h'Huhve bu sorun ortadan kalkmalı.

Spektral olarak, devlet kısıtlamasının yalnızca yüksek ikincil düzene (düşük frekansların doğru şekilde korunması) ihtiyacı vardır, ancak birincil düzenin (yüksek frekansların yumuşatılması) önemli değildir. Enjeksiyon birincil sıra 0 ve sonsuz ikincil sıraya sahiptir. Bu arada, artık kısıtlamanın pozitif (en azından) olması için hem birincil hem de ikincil düzene ihtiyacı vardır. Bkz. Achi Brandt'ın Multigrid Kılavuzu bölüm 4.3 .

MG yöntemlerini tasarlarken, artıklardan ziyade hataya bakmak ve normu uygun şekilde ağırlıklandırdığınızdan emin olmak da iyidir.


Güzel noktalar, ve ben bu çizgiler boyunca bir şeyden bahsetmemiştim. Multigrid'in pratik kullanımının önemli bir yönü daha yumuşak seçimdir: yüksek frekans hatalarını mümkün olduğunca hızlı bir şekilde azaltan ve tanımladığınız sorunu ele alan bir şey istersiniz.
Aurelius

@Aurelius Sağlanan günlükten, daha pürüzsüz bir sorun olmadığını görebilirsiniz. Silpion'un, düzgün bir şekilde yakınlaşan kusur düzeltme MG'si ile aynı pürüzsüzlüğü kullandığını hatırlayın.
Jed Brown

Brandt'ın Multigrid Rehberine bağlantı için teşekkürler, Brigg'in Multigrid Eğitimini bitirdikten sonra baştan sona okuyacağım. Sorunu şimdi çözdüm (diğer cevaba bakınız), ancak şu anda hem devlet hem de artık kısıtlama için tam ağırlık kullanıyorum. Enjeksiyon kullanmak ortamımda çalışmıyor gibi görünüyor, kalan oranlar>0.8ve hem artık hem de hata L2 normları çok yakında azalmayı bırakır. Enjeksiyonun neden başarısız olduğu hakkında bir fikrin var mı?
Silpion

1

Şimdi problemle çözdüm. DepoladımuÖld'H=benh'Huh V döngüsü sırasında inip daha sonra tekrar kullandığınızda

uhuh+ben'Hh(u'H-benh'Huh)=uh+ben'Hh(u'H-uÖld'H).

Sorun tekrar aşağı gitmeden önceydi 'H için 2'H, uÖld'Hgevşetilmişken yerde . Bir kopyayı gevşeme adımlarından önce saklamak yardımcı oldu. Dan beriuÖld'H yalnızca FAS için gerekliydi, doğrusal hesaplamalarda görünmedi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.