Pertimbangkan dengan hampir singular yang berarti ada nilai eigen dari yang sangat kecil. Kriteria berhenti yang biasa dari metode berulang didasarkan pada residual dan menganggap iterasi dapat berhenti ketika dengan nomor iterasi. Tetapi dalam kasus yang kami pertimbangkan, mungkin ada kesalahan besar tinggal di eigenspace yang terkait dengan nilai eigen kecil yang memberikan residu kecil . Misalkan residual awal besar, maka mungkin saja kita berhenti di tetapi kesalahan masih besar. Apa indikator kesalahan yang lebih baik dalam kasus ini? Apakah kandidat yang baik?
linear-algebra
Hui Zhang
sumber
sumber
Jawaban:
Harap tidak pernah menggunakan perbedaan antara pengulangan yang berurutan untuk menentukan kriteria berhenti. Ini salah mendiagnosis stagnasi konvergensi. Sebagian besar iterasi matriks nonsimetrik bukanlah monoton, dan bahkan GMRES dalam aritmatika yang tepat tanpa restart dapat mengalami stagnasi untuk sejumlah iterasi yang acak (hingga dimensi matriks) sebelum melakukan konvergensi secara tiba-tiba. Lihat contoh dalam Nachtigal, Reddy, dan Trefethen (1993) .
Cara yang lebih baik untuk mendefinisikan konvergensi
Kami biasanya tertarik pada keakuratan solusi kami lebih dari ukuran residu. Secara khusus, kami mungkin ingin menjamin bahwa perbedaan antara solusi perkiraan dan solusi tepat x memuaskan | x n - x | < c untuk beberapa yang ditentukan pengguna c . Ternyata dapat mencapai ini dengan menemukan x n sedemikian rupa sehingga | A x n - b | < c ϵ di mana ϵ adalah nilai singular terkecil dari A , karenaxn x
di mana kita telah menggunakan bahwa adalah nilai singular terbesar dari A - 1 (baris kedua) dan bahwa x benar-benar memecahkan A x = b1/ϵ A−1 x Ax=b (baris ketiga).
Memperkirakan nilai tunggal terkecilϵ
Perkiraan akurat dari nilai singular terkecil biasanya tidak langsung tersedia dari masalah, tetapi dapat diperkirakan sebagai produk sampingan dari gradien konjugat atau iterasi GMRES. Perhatikan bahwa meskipun estimasi nilai eigen terbesar dan nilai singular biasanya cukup baik setelah hanya beberapa iterasi, estimasi akurat nilai eigen / singular terkecil biasanya hanya diperoleh setelah konvergensi tercapai. Sebelum konvergensi, estimasi umumnya akan secara signifikan lebih besar dari nilai sebenarnya. Ini menunjukkan bahwa Anda harus benar-benar menyelesaikan persamaan sebelum Anda dapat menentukan toleransi yang benar c ϵ . Toleransi konvergensi otomatis yang menghasilkan akurasi yang disediakan pengguna cϵ cϵ c untuk solusi dan memperkirakan nilai singular terkecil dengan kondisi saat ini dari metode Krylov mungkin konvergen terlalu dini karena estimasi ϵ jauh lebih besar dari nilai sebenarnya.ϵ ϵ
Catatan
-ksp_monitor_singular_value
dengan program PETSc. Lihat KSPComputeExtremeSingularValues () untuk menghitung nilai singular dari kode.-ksp_gmres_restart 1000
dalam PETSc).sumber
Another way of looking at this problem is to consider the tools from discrete inverse problems, that is, problems which involve solvingAx=b or min||Ax−b||2 where A is very ill-conditioned (i.e. the ratio between the first and last singular value σ1/σn is large).
Here, we have several methods for choosing the stopping criterion, and for an iterative method, I would recommend the L-curve criterion since it only involves quantities that are available already (DISCLAIMER: My advisor pioneered this method, so I am definitely biased towards it). I have used this with success in an iterative method.
The idea is to monitor the residual normρk=||Axk−b||2 and the solution norm ηk=||xk||2 , where xk is the k 'th iterate. As you iterate, this begins to draw the shape of an L in a loglog(rho,eta) plot, and the point at the corner of that L is the optimal choice.
This allows you to implement a criterion where you keep an eye on when you have passed the corner (i.e. looking at the gradient of(ρk,ηk) ), and then choose the iterate that was located at the corner.
The way I did it involved storing the last 20 iterates, and if the gradientabs(log(ηk)−log(ηk−1)log(ρk)−log(ρk−1)) was larger than some threshold for 20 successive iterations, I knew that I was on the vertical part of the curve and that I had passed the corner. I then took the first iterate in my array (i.e. the one 20 iterations ago) as my solution.
There are also more detailed methods for finding the corner, and these work better but require storing a significant number of iterates. Play around with it a bit. If you are in matlab, you can use the toolbox Regularization Tools, which implements some of this (specifically the "corner" function is applicable).
Note that this approach is particularly suitable for large-scale problems, since the extra computing time involved is minuscule.
sumber