Evet, bu nedenle çok fazla kaynak yok. Çok uzun bir süre, standart goto "sadece BDF yöntemlerini kullan" idi. Bu mantra birkaç tarihsel nedenden ötürü taşa yerleştirildi: bir Gear'ın kodu ilk yaygın olarak kullanılan sert çözücüdür ve diğeri için MATLAB paketi örtük bir RK yöntemi içermiyordu / içermiyordu. Ancak, bu sezgisel tarama her zaman doğru değildir ve test ederek genellikle yanlış olduğunu söyleyebilirim. Açıklayayım.
BDF yöntemlerinin sabit maliyeti yüksektir
BDF yöntemlerinde uyarlanabilir zaman aralığı ve uyarlanabilir düzen gerçekten yüksek bir maliyete sahiptir. Katsayıların yeniden hesaplanması veya değerlerin farklı zamanlara enterpole edilmesi gerekir. Mevcut BDF kodlarını burada daha iyi hale getirmek için çok fazla çalışma yapıldı (bu sorunu farklı bir şekilde ele almaya çalışan uygulama için iyi bilinen iki "form" vardır), ancak aslında çok zor bir yazılım mühendisliği problemidir. Bu nedenle, aslında BDF kodlarının çoğu Gear'ın orijinal kodunun torunlarıdır: Gear, vode, lsoda, Sundial'ın CVODE, DAE çözücüleri DASKR ve DASSL bile aynı kodun torunlarıdır.
Bunun anlamı, eğer probleminiz "çok küçük" ise, yüksek sabit maliyet gerçekten önemlidir ve Örtülü RK yöntemleri daha iyi olacaktır.
Yüksek dereceli BDF yöntemleri karmaşık özdeğerler için çok kararsızdır
BDF yöntemleri, maksimum siparişi kontrol etmenize ve bir nedenden dolayı daha muhafazakar hale getirmenize izin verir: yüksek dereceli BDF yöntemleri, "orta boy" karmaşık özdeğerleri bile çok iyi işleyemez. Bu nedenle, bu durumlarda, istikrarlı olabilmek için siparişlerini düşürmek zorundalar. 6. sıra BDF yönteminin teknik olarak kararlı olmasına rağmen çoğu zaman göz ardı edilmesidir, çünkü 5. sıra bile burada zaten sorunlara sahiptir (ve 6. sıra daha da az kararlıdır). Sadece 2. sıraya kadar A-kararlı, bu yüzden her zaman oraya geri dönebilir, ancak daha sonra adımlama hakimdir.
Bu nedenle, önemsiz olmayan problemlerde BDF kodlarını kullanırken, her zaman 5. sipariş almazsınız. Salınımlar sırasının düşmesine neden olur.
BDF yöntemlerinin başlangıç maliyeti yüksektir
ben ττ
BDF yöntemleri, çok aşamalı yöntemler olarak en iyi ölçeklendirmeye sahiptir
fradau
Hangi kriterler mevcut?
Hairer'ın kitabı ve DiffEqBenchmarks (aşağıda açıklanmıştır) muhtemelen kolayca kullanılabilen iş hassasiyeti diyagramları açısından en iyisidir. Hairer'ın Adi Diferansiyel Denklemlerin Çözümü II , sayfa 154 ve 155'de bir dizi iş hassasiyeti diyagramına sahiptir. Seçtiği sorunların sonuçları, yukarıda belirttiğim nedenlerle yukarıda belirttiğim sonuçlarla örtüşüyor: sorun, RK'nin daha etkili olmaması "Yeterince büyük". Dikkat edilmesi gereken bir başka şey, yüksek dereceli Rosenbrock yöntemlerinin Rodas
, hatanın daha yüksek olduğu rejimde testlerinin çoğunda (örneğin ) radau5
en verimli olduğu ve örtük RK'nın daha düşük hatalarda en verimli olduğu olmasıdır. Ancak test problemleri çoğunlukla büyük PDE'lerin takdiri değildir, bu nedenle yukarıdaki noktaları dikkate alın.
Nasıl test / kıyaslama yapıyorsunuz?
Bunu Julia'daki DifferentialEquations.jl ile test etmeyi seviyorum (sorumluluk reddi: Ben geliştiricilerden biriyim). Bu Julia'da. Programlama dili burada gerçekten bir not almalıdır. İşlev çağrısının maliyeti arttıkça BDF yöntemlerinin daha iyi olduğunu unutmayın. R / MATLAB / Python'da, kullanıcının işlevi, optimize edilmiş çözümleyicilerin gerçekten kullanması gereken tek R / MATLAB / Python kodudur: SciPy veya Sundials sarmalayıcıları kullanıyorsanız, geçtiğiniz işlev dışında tümü C / Fortran kodudur. . Bu, dinamik dillerde (Julia olmayan), BDF yöntemlerinin normalde olduğundan daha iyi sonuç verdiği anlamına gelir, çünkü işlev çağrıları çok optimize edilmemiştir (muhtemelen Shampine'nin ode15s
MATLAB paketine dahil edilmesinin nedeni , ancak örtülü RK yöntemi olmaması) .
fODEProblem
@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())
burada birincisi Sundials ' CVODE
(BDF yöntemi), ikincisi ise Hairer's radau
(örtülü RK) kullanır .
Herhangi biri için ODEProblem
, farklı algoritmaların farklı uyarlanabilir toleranslar için nasıl ölçeklendiğini görmek için karşılaştırma araçlarını kullanabilirsiniz. Bazı sonuçlar DiffEqBenchmarks.jl adresine gönderilir . Örneğin , ROBER probleminde (3 sert ODE sistemi), Sundials'ın aslında kararsız olduğunu ve yeterince yüksek bir toleransla (diğer yöntemler gayet iyi bir şekilde birleşir) ayrıldığını ve yukarıdaki istikrar sorunları hakkında not gösterdiğinizi görebilirsiniz. Van Der Pol probleminde bunun daha çok yıkandığını görebilirsiniz. Yayınlamadığımdan çok daha fazla şeyim var, ancak bazı yüksek dereceli Rosenbrock yöntemlerini bitirene kadar muhtemelen buna ulaşmayacak (Rodas, bunların Fortran sürümüdür).
(Not: bu katı ölçütlerin güncellenmesi gerekir. Bir nedenle, ODE.jl'in yöntemlerinin farklı olması nedeniyle metnin güncellenmesi gerekiyor ...)
Ekstrüzyon yöntemleri ve RKC
seulex
Sert sorunlar için yapılan ekstrapolasyon yöntemleri de vardır. Bunlar "sonsuz uyarlanabilir düzen" dir, ancak bu yalnızca çok düşük bir hata ararken asimtopik olarak iyi oldukları anlamına gelir (yani, sert problemleri daha düşük 1e-10
veya daha düşük bir sürede çözmek istiyorsanız, bu durumda muhtemelen açık bir yöntem kullanabilirsiniz) . Bununla birlikte, çoğu durumda etkili değildir ve kaçınılmalıdır.
Runge-Kutta Chebyschev, göz önünde bulundurmanız gereken sert problemler üzerinde de çalışan açık bir yöntemdir. Henüz DifferentialEquations.jl içine sarılmış değilim, bu yüzden kendimi nasıl fuar hakkında herhangi bir sert kanıt yok.
Dikkate alınacak diğer yöntemler: sert PDE'ler için özel yöntemler
Büyük olasılıkla yüksek dereceli Rosenbrock yöntemlerinin, Jacobian'ı kolayca hesaplayabildiğiniz küçük-orta ölçekli sert problemler için çok daha iyi, çok daha iyi olduğunu unutmayın. Bununla birlikte, bazı PDE'ler için, adveksiyon-difüzyon problemlerinin bu kategoriye girdiğine inanıyorum, Rosenbrock bazı doğruluk derecelerini kaybedebilir. Ayrıca, doğruluklarını korumak için çok doğru Jacobian'lara ihtiyaçları var. Julia'da bu kolaydır, çünkü çözücüler, epsilon işlemek için doğru olabilecek sembolik ve otomatik farklılaşma ile gelir. Ancak MATLAB'ler gibi şeylerode23s
bu uygulamalar sonlu farklar kullandığından sorun yaşayabilir. BDF ve örtük RK yöntemleri için, Jacobian'daki hatalar daha yavaş yakınsamaya neden olurken, Rosenbrock için, bunlar örtük denklemler olmadığından ve orada Jacobian inversiyonları olan RK yöntemleri olduğundan, bunlar doğruluk sırasını kaybederler.
Bakılacak diğer yöntemler, üstel RK yöntemleri, üstel zaman farkı (ETD), örtük entegrasyon faktörü (IIF) ve üstel Rosenbrock yöntemleridir. İlk üçü, birçok PDE takdirinde,
ut= A u + f( u )
birbir uebirbir
birJu + g( u )Jf= Ju + g
Yine de diğer yöntemler: en son kreasyonlar
Tamamen örtülü olan yöntemler, katı denklemler için iyi sonuç verir. PDE yeterince büyük değilse, HPC'leri kullanmak için yeterince "uzayda paralelleştirilemez". Bunun yerine, tamamen örtük ve böylece katı denklemler için iyi olan, ancak donanımı tam olarak kullanmak için paralel olan zaman içinde paralel ayrıklıklar oluşturabilirsiniz. XBraid , böyle bir teknik kullanan bir çözücüdür ve ana yöntemler PFFAST ve parareal yöntemlerdir. DifferentialEquations.jl benzer şekilde çalışan bir sinir ağı yöntemi geliştirmektedir.
Yine, verimli bir şekilde paralellik gösterecek kadar büyük bir uzamsal ayrıklığa sahip olmadığınızda, ancak paralel hesaplama için kaynaklara sahip olduğunuzda bu en uygunudur.
Sonuç: bir tuz tanesi ile asimptotik hususlar dikkate alın
Δ t
BDF yöntemleri asemptotik olarak en iyisidir, ancak çoğu durumda muhtemelen bu rejimde çalışmıyorsunuzdur. Ancak, uzamsal ayrıklaştırma yeterli noktaya sahipse, BDF yöntemleri uzayda etkin bir şekilde paralel olabilir (doğrusal çözmeyi paralelleştirerek) ve en az işlev çağrısına sahip olur ve böylece en iyisini yapar. Ancak PDE takdir yetkiniz yeterince büyük değilse, örtük RK, Rosenbrock, üstel RK, vb. Yöntemlere iyi bakın. Farklı yöntemler arasında geçiş yapmayı kolaylaştıran DifferentialEquations.jl gibi bir yazılım paketi kullanmak, sorunlu alanınız için hangi yöntemin en iyi sonucu verdiğini anlamanız için gerçekten yararlı olabilir, çünkü birçok durumda önceden bilinemez.
[Test paketine eklemek istediğiniz herhangi bir örnek sorununuz varsa, lütfen oraya bir şeyler almanıza yardımcı olmaktan çekinmeyin. Bu konuda çok kapsamlı bir kaynak tutmak istiyorum. Hairer'ın tüm ölçütlerini "yakında" çalıştırılabilir defter formlarında bulundurmayı umuyorum ve bilimsel alanları temsil eden diğer sorunları da istiyorum. Herhangi bir yardım takdir!]