Saya akan mulai bekerja di perpustakaan perangkat lunak pemecah ODE numerik , dan saya berjuang dengan cara merumuskan tes untuk implementasi pemecah. Ambisi saya adalah bahwa perpustakaan, akhirnya, akan mencakup pemecah untuk kedua masalah nonstiff dan kaku, dan setidaknya satu pemecah implisit (kurang lebih setara dengan kemampuan yang ode
rutin di Matlab ), sehingga kebutuhan metodologi tes untuk mencerminkan berbagai jenis masalah dan kriteria untuk pemecah yang berbeda.
Masalah saya sekarang adalah bahwa saya tidak tahu harus mulai dari mana dengan pengujian ini. Saya dapat memikirkan beberapa cara berbeda untuk menguji output suatu algoritma:
Tes untuk masalah yang memiliki solusi analitis, dan periksa bahwa solusi numerik berada dalam level toleransi untuk semua titik data yang dikembalikan. Ini membutuhkan pengetahuan tentang sejumlah masalah analitis yang menunjukkan semua sifat yang saya inginkan untuk diselesaikan oleh berbagai solver (kekakuan, masalah implisit, dll.), Yang tidak saya miliki, setidaknya tidak lepas dari pikiran saya.
Metode ini menguji hasil metode solver. Jadi, tidak ada jaminan bahwa solver benar-benar berfungsi, hanya saja ia berfungsi untuk masalah tes yang diberikan . Oleh karena itu, saya menduga sejumlah besar masalah tes diperlukan untuk memastikan bahwa pemecah berhasil.
Secara manual menghitung solusi untuk beberapa langkah waktu menggunakan algoritma yang ingin saya terapkan, dan kemudian melakukan hal yang sama dengan solver dan memeriksa hasilnya hasilnya sama. Ini tidak memerlukan pengetahuan tentang solusi yang sebenarnya untuk masalah tersebut, tetapi pada gilirannya membutuhkan banyak pekerjaan langsung.
Metode ini, di sisi lain, hanya menguji algoritme , yang baik bagi saya - jika orang lain telah membuktikan bahwa urutan ke- 4 Runge-Kutta berfungsi, saya tidak merasa perlu untuk melakukannya. Namun, saya khawatir bahwa akan sangat merepotkan untuk merumuskan kasus uji, karena saya tidak tahu metode yang baik untuk menghasilkan data uji (kecuali mungkin dengan tangan, yang akan banyak pekerjaan ...).
Kedua metode di atas memiliki keterbatasan serius bagi saya dengan pengetahuan saya saat ini - Saya tidak tahu satu set masalah pengujian yang baik untuk yang pertama, dan saya tidak tahu metode yang baik untuk menghasilkan data uji untuk yang kedua.
Apakah ada cara lain untuk memverifikasi pemecah ODE numerik? Apakah ada kriteria lain tentang implementasi yang harus diverifikasi? Apakah ada sumber daya (gratis) yang bagus untuk menguji pemecah ODE di luar sana 1 ?
EDIT:
Karena pertanyaan ini sangat luas, saya ingin menjelaskan sedikit. Test suite yang ingin saya buat akan memenuhi dua tujuan utama:
Memverifikasi bahwa pemecah berfungsi seperti yang diharapkan, untuk masalah yang ingin mereka selesaikan. Dengan kata lain, seorang pemecah untuk masalah yang tidak kaku dibiarkan menggunakan pisang pada masalah yang kaku, tetapi harus bekerja dengan baik pada masalah yang tidak kaku. Juga, jika ada pemecah lain di perpustakaan yang menawarkan akurasi lebih tinggi, mungkin tidak perlu untuk menegakkan hasil yang sangat akurat - cukup "cukup akurat". Jadi, bagian dari pertanyaan saya adalah tes apa yang harus digunakan untuk pemecah apa; atau, paling tidak, bagaimana seseorang harus beralasan untuk memutuskan itu.
Tes kewarasan pada saat instalasi perpustakaan. Tes ini tidak perlu (tidak seharusnya) rumit atau memakan waktu; hanya dasar-dasar yang dapat dijalankan dalam waktu kurang dari 5 detik, tetapi itu akan mengingatkan pengguna jika ada sesuatu yang aneh. Jadi, saya juga membutuhkan cara untuk membuat tes yang sangat sederhana, tetapi masih memberi tahu saya tentang keadaan perpustakaan.
1 Ya, saya sudah mencari-cari di Googling, tetapi sebagian besar yang saya temukan adalah catatan kuliah dengan contoh-contoh yang sangat sepele, dengan perkecualian khusus dari rangkaian tes CWI ODE dari Bari yang saya tidak tahu jika, atau bagaimana, saya bisa digunakan untuk keperluan saya, karena itu memperlakukan pemecah jauh lebih canggih daripada yang saya ingin menguji ...
Jawaban:
Ini adalah pertanyaan yang sangat luas dan saya akan memberi Anda beberapa hal untuk dipikirkan (beberapa sudah dimasukkan dalam posting Anda, tetapi mereka diulangi di sini untuk kelengkapan).
Lingkup Masalah
Rekomendasi masalah
Ini tidak unik. Jika Anda melihat buku "Metode Numerik untuk Optimasi Tanpa Batas dan Persamaan Nonlinier" oleh Dennis dan Schnabel, Lampiran B, "Masalah Uji", Anda dapat melihat bagaimana mereka melakukannya. Setelah mengembangkan salah satu dari set algoritma yang paling indah dari penulisan yang pernah saya lihat, mereka melempar kumpulan masalah yang membuatnya menjadi gila. Anda harus men-tweak di sana-sini! Mereka termasuk lima masalah yang sangat berbeda dan patologis yang menekan kemampuan para pemecah. Ini telah mengajarkan saya bahwa kita dapat terus melempar masalah pada algoritma yang tidak mampu mereka tangani karena berbagai alasan. Catatan, mereka bahkan meminjam serangkaian masalah ini dari More ', Garbow dan Hillstrom (Anda juga dapat mencari referensi itu dan mungkin ada orang lain yang dapat Anda gunakan sebagai panduan).
Dengan kata lain, ini bukan tugas sepele. Anda memerlukan kasus Uji Jawaban yang Diketahui yang selalu memungkinkan Anda menguji validitas pembaruan dan tidak merusak barang. Yaitu, serangkaian masalah yang berulang dan luas dari rendah ke tinggi, dari yang mudah ke yang sulit, dari yang mungkin ke yang tidak mungkin, ... Anda juga membutuhkan sekumpulan masalah yang tidak bisa ditangani oleh pemecah Anda agar benar-benar memahami keterbatasannya.
sumber
Satu pemeriksaan kewarasan yang saya jalankan terhadap pemecah ODE saya adalah dengan hanya memeriksanya pada sistem linear yang lebih kecil melalui penghitungan eksponensial dari matriks sistem secara tepat. yaitu diberikan
periksa kesalahan dalam
Hanya saja, jangan menghitung eksponensial dengan salah satu dari stepper waktu Anda (yaitu metode meragukan nomor 6 :) http://www.cs.cornell.edu/cv/researchpdf/19ways+.pdf )
sumber
Anda dapat mencoba menyelidiki "Metode Solusi yang Diproduksi", yang merupakan metodologi umum yang digunakan untuk menguji implementasi kode yang memecahkan PDE (ini dapat digunakan untuk menemukan kesalahan matematis dan pengkodean). Saya membayangkan itu bisa diadaptasi untuk bekerja untuk memecahkan ODE, jika metodologi solusi Anda cukup umum.
http://prod.sandia.gov/techlib/access-control.cgi/2000/001444.pdf
sumber