BDF vs waktu Runge Kutta implisit melangkah

16

Apakah ada alasan mengapa seseorang harus memilih Runge Kutta (IMRK) implisit tingkat tinggi dari waktu ke waktu melangkah? BDF tampaknya lebih mudah bagi saya karena stage IMRK membutuhkan linear solves per step waktu. Stabilitas untuk BDF dan IMRK tampaknya menjadi titik perdebatan. Saya tidak dapat menemukan sumber daya yang membandingkan / membedakan steppers waktu implisit.qq

Jika itu membantu, tujuan akhirnya adalah saya memilih stepper waktu implisit tingkat tinggi untuk PDE adveksi-difusi.

pengguna107904
sumber

Jawaban:

34

Ya, tidak ada banyak sumber daya untuk ini karena suatu alasan. Untuk waktu yang sangat lama, goto standar adalah "cukup gunakan metode BDF". Mantra ini dibuat menjadi batu karena beberapa alasan historis: karena satu kode Gear adalah pemecah kaku pertama yang tersedia secara luas, dan untuk yang lain suite MATLAB tidak / tidak termasuk metode RK implisit. Namun, heuristik ini tidak selalu benar, dan saya akan mengatakan dari pengujian biasanya salah. Biarkan saya jelaskan secara mendetail.

Metode BDF memiliki biaya tetap yang tinggi

Adaptif timestepping dan urutan adaptif dalam metode BDF memiliki biaya yang sangat tinggi. Koefisien harus dihitung ulang, atau nilai-nilai perlu diinterpolasi ke waktu yang berbeda. Ada banyak pekerjaan yang harus dilakukan untuk membuat kode BDF saat ini lebih baik di sini (ada dua "bentuk" yang terkenal untuk implementasi yang mencoba menangani masalah ini secara berbeda), tetapi sebenarnya itu hanya masalah rekayasa perangkat lunak yang sangat sulit. Karena itu, sebenarnya sebagian besar kode BDF adalah semua keturunan dari kode asli Gear: Gear, vode, lsoda, CVODE Sundial, bahkan pemecah DAE DASKR dan DASSL adalah keturunan dari kode yang sama.

Artinya, jika masalah Anda "terlalu kecil", biaya tetap yang tinggi benar-benar penting dan metode RK Implisit akan lebih baik.

Metode BDF orde tinggi sangat tidak stabil untuk nilai eigen kompleks

Metode BDF memungkinkan Anda untuk mengontrol urutan maksimum dan membuatnya lebih konservatif karena suatu alasan: metode BDF urutan tinggi tidak dapat menangani bahkan nilai eigen kompleks "sedang" dengan sangat baik. Jadi dalam kasus ini, agar stabil, mereka harus menghentikan pesanan mereka. Ini adalah alasan mengapa metode BDF urutan ke-6, walaupun secara teknis stabil, sering diabaikan karena bahkan urutan ke-5 sudah memiliki masalah di sini (dan urutan ke-6 bahkan lebih tidak stabil). Hanya sampai urutan ke-2 yang merupakan A-stable, sehingga selalu dapat mundur ke sana, tetapi kemudian melangkah didominasi kesalahan.

Jadi ketika menggunakan kode BDF pada masalah non-sepele, Anda tidak mendapatkan urutan ke-5 sepanjang waktu. Osilasi menyebabkan urutannya turun.

Metode BDF memiliki biaya awal yang tinggi

iττ

Metode BDF, sebagai metode multistep, memiliki penskalaan terbaik

fradau

Benchmark apa yang tersedia?

Buku Hairer dan DiffEqBenchmarks (dijelaskan di bawah) mungkin adalah yang terbaik dalam hal diagram presisi kerja yang mudah tersedia. Persamaan Diferensial Diferensial Biasa Hairer II memiliki banyak diagram presisi-kerja pada halaman 154 dan 155. Hasil dari masalah yang ia pilih cocok dengan yang saya nyatakan di atas karena alasan yang saya nyatakan di atas: RK implisit akan lebih efisien jika masalahnya tidak "Cukup besar". Hal lain yang menarik untuk dicatat adalah bahwa metode Rosenbrock urutan tinggi keluar sebagai yang paling efisien dalam banyak tes (seperti Rodas) di rezim mana kesalahan lebih tinggi, dan RK implisit radau5adalah yang paling efisien pada kesalahan yang lebih rendah. Tapi masalah tesnya sebagian besar bukan diskresi PDE besar, jadi pertimbangkan poin-poin di atas.

Bagaimana Anda menguji / benchmark?

Saya suka menguji ini dengan DifferentialEquations.jl di Julia (disclaimer: Saya adalah salah satu pengembang). Ini di Julia. Bahasa pemrograman harus benar-benar mendapatkan catatan di sini. Ingatlah bahwa ketika biaya pemanggilan fungsi meningkat, metode BDF lebih baik. Dalam R / MATLAB / Python, fungsi pengguna adalah satu-satunya kode R / MATLAB / Python yang benar-benar harus digunakan oleh pemecah yang dioptimalkan: jika Anda menggunakan pembungkus SciPy atau Sundials, itu semua adalah kode C / Fortran kecuali untuk fungsi yang Anda lewati . Ini berarti bahwa, dalam bahasa dinamis (yang bukan Julia), metode BDF melakukan lebih baik daripada biasanya karena pemanggilan fungsi sangat tidak dioptimalkan (ini mungkin alasan mengapa Shampine disertakan ode15sdalam suite MATLAB, tetapi tidak ada metode RK implisit) .

fODEProblem

@time sol = solve(prob,CVODE_BDF())
@time sol = solve(prob,radau())

di mana yang pertama menggunakan Sundials CVODE(metode BDF), dan yang kedua menggunakan Hairer's radau(RK implisit).

Untuk apa pun ODEProblem, Anda dapat menggunakan alat pembandingan untuk melihat bagaimana skala algoritma yang berbeda untuk toleransi adaptif yang berbeda. Beberapa hasil diposting di DiffEqBenchmarks.jl . Sebagai contoh, pada masalah ROBER (sistem 3 ODE kaku) Anda dapat melihat bahwa Sundial sebenarnya tidak stabil dan menyimpang dengan toleransi yang cukup tinggi (sedangkan metode lain menyatu dengan baik), menunjukkan catatan di atas tentang masalah stabilitas. Pada masalah Van Der Pol , Anda dapat melihatnya lebih merupakan pencucian. Saya memiliki lebih banyak daripada yang belum saya posting, tetapi mungkin tidak akan sampai sampai saya menyelesaikan beberapa metode Rosenbrock tingkat tinggi (Rodas adalah versi Fortran dari mereka).

(Catatan: tolok ukur yang kaku perlu diperbarui. Untuk satu, teks perlu diperbarui karena untuk beberapa alasan metode ODE.jl berbeda ...)

Metode ekstrpolasi dan RKC

Ada juga metode ekstrapolasi seperti seulexyang dibuat untuk masalah kaku. Ini adalah "urutan adaptif yang tak terbatas", tetapi itu hanya berarti bahwa mereka asimopik baik ketika Anda mencari kesalahan yang sangat rendah (yaitu mencari untuk memecahkan masalah kaku di lebih rendah 1e-10atau lebih, dalam hal ini Anda mungkin dapat menggunakan metode eksplisit sekalipun) . Namun, dalam banyak kasus mereka tidak seefisien dan harus dihindari.

Runge-Kutta Chebyschev adalah metode eksplisit yang juga berfungsi pada masalah kaku yang harus Anda pertimbangkan. Saya tidak memilikinya dibungkus dengan DifferentialEquations.jl jadi saya sendiri tidak memiliki bukti keras tentang bagaimana pameran itu.

Metode lain yang perlu dipertimbangkan: metode khusus untuk PDE kaku

Seharusnya mungkin membuat catatan bahwa metode Rosenbrock tingkat tinggi sangat baik, bahkan berkali-kali lebih baik, untuk masalah kaku berukuran kecil-menengah ketika Anda dapat dengan mudah menghitung Jacobian. Namun, untuk beberapa PDE, saya percaya masalah adveksi-difusi termasuk dalam kategori ini, Rosenbrock dapat kehilangan beberapa urutan akurasi. Juga, mereka membutuhkan Jacobian yang sangat akurat untuk menjaga akurasi mereka. Dalam Julia ini mudah karena pemecah datang dengan simbolik dan autodifferensiasi yang dapat benar untuk mesin epsilon. Namun, hal-hal seperti MATLABode23sdapat memiliki masalah karena implementasi ini menggunakan differencing hingga. Untuk BDF dan metode RK implisit, kesalahan dalam Jacobian menyebabkan konvergensi lebih lambat, sedangkan untuk Rosenbrock, karena ini bukan persamaan implisit dan lebih merupakan metode RK dengan inversi Jacobian di sana, ini hanya kehilangan urutan akurasi.

Metode lain untuk dilihat adalah metode RK eksponensial, perbedaan waktu eksponensial (ETD), faktor integrasi implisit (IIF), dan metode Rosenbrock eksponensial. Tiga yang pertama memanfaatkan fakta bahwa, dalam banyak diskresi PDE,

kamut=SEBUAHkamu+f(kamu)

dimana SEBUAH adalah operator linier, dan linieritas ini memungkinkan Anda untuk menyelesaikan SEBUAHkamubagian operator. Kelemahannya adalah, metode yang dihasilkan harus digunakaneSEBUAH yang padat bahkan jika SEBUAHjarang, dan ada banyak pekerjaan dalam metode Krylov. Namun, ini adalah metode A-stable yang menghindari persamaan implisit dan sehingga mereka bisa sangat efisien untuk diskritisasi PDE.

Metode Rosenbrock eksponensial tidak memerlukan SEBUAH, dan sebagai gantinya dibagi Jkamu+g(kamu) dimana J adalah Jacobian, dan f=Jkamu+g, tapi itu ide yang sama.

Masih ada metode lain: kreasi terbaru

Metode yang sepenuhnya implisit jelas baik untuk persamaan kaku Jika PDE tidak cukup besar, Anda tidak dapat secara efektif "memparalelkan dalam ruang" cukup untuk menggunakan HPC. Sebagai gantinya, Anda dapat membuat diskresiisasi paralel-dalam-waktu yang sepenuhnya tersirat dan dengan demikian bagus untuk persamaan kaku, namun paralel untuk memanfaatkan sepenuhnya perangkat keras. XBraid adalah pemecah yang menggunakan teknik seperti ini, dan metode utamanya adalah metode PFFAST dan parareal. DifferentialEquations.jl sedang mengembangkan metode neural net yang bekerja serupa.

Sekali lagi, ini optimal ketika Anda tidak memiliki diskritisasi spasial yang cukup besar untuk secara paralel melakukan paralelisasi, tetapi memiliki sumber daya untuk komputasi paralel yang tersedia.

Kesimpulan: ambil pertimbangan asimptotik dengan sebutir garam

Untuk waktu yang sangat lama dalam sejarah numerik diffeq, ada gagasan bahwa metode ekstrapolasi adalah yang terbaik karena mereka secara teknis dapat mencapai urutan apa pun. Ini berarti, untuk yang cukup kecilΔt, mereka akan menjadi yang paling efisien (jadi, jika Anda mencari solusi yang sangat tepat, ya!). Namun, hampir tidak ada yang benar-benar bekerja dalam rezim di mana ini efisien, itulah sebabnya orang umumnya tidak menggunakan metode ekstrapolasi lagi. Ini kata peringatan: ambil pertimbangan asimptotik dengan sebutir garam

Metode BDF asimtotik adalah yang terbaik, tetapi dalam kebanyakan kasus Anda mungkin tidak bekerja di rezim itu. Tetapi jika diskritisasi spasial memiliki cukup poin, metode BDF dapat secara efisien memaralelkan dalam ruang (dengan memparalelkan penyelesaian linear) dan akan memiliki pemanggilan fungsi yang paling sedikit, dan dengan demikian akan melakukan yang terbaik. Tetapi jika diskresi PDE Anda tidak cukup besar, perhatikan baik-baik metode implisit RK, Rosenbrock, RK eksponensial, dll. Menggunakan rangkaian perangkat lunak seperti DifferentialEquations.jl yang membuatnya mudah untuk bertukar antara metode yang berbeda dapat sangat membantu bagi Anda untuk memahami metode apa yang paling baik untuk domain masalah Anda, karena dalam banyak kasus tidak dapat diketahui sebelumnya.

[Jika Anda memiliki contoh masalah yang ingin Anda tambahkan ke suite pengujian, silakan bantu mendapatkan sesuatu di sana. Saya ingin menyimpan sumber daya yang sangat komprehensif dalam hal ini. Saya berharap memiliki semua tolok ukur Hairer dalam bentuk notebook runnable "segera", dan ingin masalah lain yang mewakili bidang ilmiah. Bantuan apa pun dihargai!]

Chris Rackauckas
sumber
3
Ini adalah respons yang sangat terperinci, saya memiliki beberapa petunjuk baru untuk dilihat! Saya sangat menghargai waktu Anda.
user107904
3
Jawaban terbaik untuk setiap pertanyaan di forum ini untuk sementara waktu!
Wolfgang Bangerth