levmar merupakan implementasi dari nonlinear Levenberg Marquardt-kuadrat algoritma di C / C ++.
The lmder rutin dari Minpack, dilaksanakan di awal '80 -an di Argonne National Lab, yang mungkin yang paling banyak digunakan implementasi bebas dari algoritma LM. lmder ditulis dalam Fortran77 dan selama bertahun-tahun telah terbukti menjadi bagian yang dapat diandalkan perangkat lunak. Mengingat bahwa rutinitas FORTRAN dapat dipanggil dari C / C ++, orang mungkin bertanya-tanya tentang motivasi untuk menulis versi LM di C. Nah, masalahnya adalah bahwa ketika FORTRAN disebut dari C, programmer harus menyadari (dan sesuai dengan ) beberapa aturan mengenai nama mangling, argumen lewat, multidimensi tata letak memori array, konvensi linkage, dll, yang tidak wajar dibandingkan dengan aturan C biasa. Alasan kedua adalah bahwa pendekatan ini menerima begitu saja bahwa compiler FORTRAN untuk lingkungan pemrograman sasaran tersedia, yang mungkin belum tentu terjadi. Alasan lain berkaitan dengan kegagalan untuk memahami cara kerja di dalam implementasi FORTRAN: Kadang-kadang, jika diperlukan untuk secara tepat memahami apa kode FORTRAN tidak, potongan tertentu mungkin tampak dipahami programmer tanpa pengetahuan tentang FORTRAN. FORTRAN otomatis ke C penerjemah (misalnya f2c) tidak memecahkan masalah karena kode C yang dihasilkan cukup terbaca untuk "belum tahu" manusia. Selain itu, dokumentasi yang menggambarkan matematika di mana pelaksanaannya didasarkan mungkin tidak jelas atau tidak dapat diakses. Last but not least, implementasi calon LM di C harus bebas dan teknis suara. Misalnya, varian C dari algoritma LM disajikan dalam "Numerical Recipes" buku (yaitu mrqmin), tidak selalu pilihan yang layak: Selain yang sedang cipta, itu terkenal kurang ketahanan
. Untuk alasan di atas, saya telah mengembangkan paket levmar yang meliputi implementasi C dari LM rasa yang juga dapat digunakan dengan C ++. levmar termasuk ganda dan tunggal implementasi presisi LM, baik dengan analitik dan terbatas perbedaan diperkirakan Jacobians. Hal ini disediakan secara gratis, di bawah ketentuan GNU General Public License. Teori matematika di balik levmar tak terbatas dijelaskan secara rinci dalam catatan kuliah Metode berhak untuk Non-Linear Kuadrat Terkecil Masalah, oleh K. Madsen, HB Nielsen dan O. Tingleff, Technical University of Denmark; Matlab implementasi dari algoritma yang disajikan dalam catatan kuliah juga tersedia. Namun perlu dicatat bahwa rumusan masalah minimisasi diadopsi di sini sedikit berbeda dari yang dijelaskan dalam catatan kuliah
Fungsi ini Gunakan:.
Levmar menawarkan beberapa fungsi-pengguna callable mematuhi Berikut konvensi penamaan: Huruf pertama (d atau s) menentukan presisi ganda atau tunggal dan akhiran (_der atau _dif) menunjukkan analitik atau perkiraan Jacobian. Jika ada, lec, bc dan komponen blec menyiratkan persamaan linear, kotak dan kotak simultan dan kendala persamaan linier, masing-masing. Lebih khusus, levmar meliputi fungsi-fungsi di bawah ini:
optimasi Yang tanpa
dlevmar_der (): presisi ganda, Jacobian analitik
dlevmar_dif (): presisi ganda, beda hingga didekati Jacobian
slevmar_der (): presisi tunggal, analisis Jacobian
slevmar_dif (): presisi tunggal, beda hingga didekati Jacobian
optimasi Dibatasi
dlevmar_lec_der () : presisi ganda, kendala persamaan linear, Jacobian analitik
dlevmar_lec_dif (): presisi ganda, kendala persamaan linear, beda hingga didekati Jacobian
slevmar_lec_der (): presisi tunggal, kendala persamaan linear, analisis
Jacobian slevmar_lec_dif (): presisi tunggal, kendala persamaan linear, beda hingga didekati Jacobian
dlevmar_bc_der (): presisi ganda, kendala kotak, Jacobian analitik
dlevmar_bc_dif (): presisi ganda, kendala kotak, terbatas Perbedaan didekati Jacobian
slevmar_bc_der (): presisi tunggal, kendala kotak, analitik Jacobian
slevmar_bc_dif (): presisi tunggal, kendala kotak, beda hingga didekati Jacobian
dlevmar_blec_der (): ganda presisi, kotak & kendala persamaan linear, analisis Jacobian
dlevmar_blec_dif (): presisi ganda, kotak & kendala persamaan linear, beda hingga didekati Jacobian
slevmar_blec_der (): presisi tunggal, kotak & persamaan linier kendala, Jacobian analitik
slevmar_blec_dif (): presisi tunggal, kotak & persamaan linier kendala, beda hingga didekati Jacobian
Perhatikan bahwa menggunakan perbedaan terbatas untuk mendekati hasil Jacobian dalam evaluasi berulang fungsi yang akan dipasang. Bertujuan untuk mengurangi jumlah evaluasi tersebut, fungsi xxxxxxx_dif menerapkan pendekatan garis potong untuk Jacobian menggunakan peringkat satu update Broyden itu. Semua fungsi memecahkan masalah yang sama, yaitu mereka mencari p parameter vektor yang paling tepat menggambarkan (dalam hal norma L2) pengukuran vektor x. Lebih tepatnya, mengingat fungsi vektor f: R ^ m -> R ^ n dengan n> = m, mereka menghitung ap sehingga f (p) ~ = x, yaitu norma kuadrat || e || ^ 2 = | | xf (p) || ^ 2 diminimalkan. Juga, kendala kotak bentuk lb [i]
Apa yang baru dalam rilis ini:
- Versi ini menambahkan dukungan untuk skala diagonal ke xlevmar_bc_der (), yang dapat meningkatkan konvergensi ketika titik awal adalah jauh dari minimizer benar.
- Sebuah sistem pemecah linear mendukung Cholesky dekomposisi paralel dengan PLASMA, perpustakaan aljabar linear untuk prosesor multi-core.
- pemecah Linear telah diperbaiki sehingga mereka beroperasi pada segitiga yang lebih rendah dari matriks simetris, yang menghasilkan kinerja cache yang lebih baik.
- File-file konfigurasi CMake untuk membangun proyek tersebut telah direvisi.
- Beberapa perubahan kecil lainnya telah dibuat.
Apa yang baru di versi 2.5:
- PERHATIAN UNTUK VERSI SEBELUMNYA PENGGUNA: Untuk konsistensi dan menghindari lebih baik konflik, nama file header levmar diubah dari lm.h untuk levmar.h; perbarui file sumber yang sesuai.
- Ditambahkan dukungan untuk meminimalkan bawah kotak simultan, persamaan dan ketidaksetaraan linier kendala (lihat fungsi xlevmar_bleic_der () & xlevmar_bleic_dif ()).
- Diimplementasikan pembungkus kenyamanan xlevmar_bleic_der () & xlevmar_bleic_dif () menangani kasus dibatasi sederhana, misalnya xlevmar_blic_der () & xlevmar_blic_dif () dukungan minimalisasi bawah kotak dan kendala ketimpangan linier saja.
- Ditambahkan sistem pemecah linear berdasarkan dekomposisi UDUt (yaitu, sqrt bebas Cholesky).
- Dihapus beberapa menyalin memori yang tidak perlu dari sebagian besar pemecah linier.
- Ditambahkan data-pas masalah tes baru (Osborne).
- Membuat beberapa perubahan kecil lainnya.
Apa yang baru di versi 2.4:
- PERHATIAN UNTUK VERSI SEBELUMNYA PENGGUNA: Ukuran info argumen (yaitu, LM_INFO_SZ) meningkat sebesar satu untuk mengakomodasi bidang pengembalian baru (misalnya, info [9]) yang sesuai dengan jumlah sistem linear diselesaikan selama minimalisasi. Indeks bidang dikembalikan sebelumnya info array tetap tidak berubah.
- Diimplementasikan cache hemat skema yang lebih untuk menghitung perkiraan Goni J ^ T * J dan J ^ T * e untuk masalah minimisasi berukuran kecil.
- Memastikan bahwa setiap memori kerja dipertahankan antara doa dari pemecah linear dilepaskan pada penghentian rutinitas levmar.
- Memastikan bahwa pemecah linear mempekerjakan minimal jumlah yang diperlukan memori tambahan, menghindari sesekali over-alokasi.
- Diimplementasikan skema lingkaran membuka gulungan untuk mempercepat perhitungan e = x-hx.
- Fixed beberapa masalah dengan keselarasan memori pada sistem 64 bit .
- Ditambahkan fungsi untuk perhitungan koefisien determinasi.
- Berurusan dengan beberapa masalah kecil.
Komentar tidak ditemukan