Apa yang tampaknya belum disebutkan sejauh ini adalah konsep dari algoritma yang tidak stabil dan masalah yang dikondisikan . Saya akan membahas yang pertama, karena tampaknya menjadi perangkap yang lebih sering untuk numeric pemula.
Pertimbangkan perhitungan kekuatan rasio emas (timbal balik) φ=0.61803…
; salah satu cara yang mungkin dilakukan adalah dengan menggunakan rumus rekursi φ^n=φ^(n-2)-φ^(n-1)
, dimulai dengan φ^0=1
dan φ^1=φ
. Jika Anda menjalankan rekursi ini di lingkungan komputasi favorit Anda dan membandingkan hasilnya dengan kekuatan yang dievaluasi secara akurat, Anda akan menemukan erosi lambat dari angka-angka penting. Inilah yang terjadi misalnya di Mathematica :
ph = N[1/GoldenRatio];
Nest[Append[#1, #1[[-2]] - #1[[-1]]] & , {1, ph}, 50] - ph^Range[0, 51]
{0., 0., 1.1102230246251565*^-16, -5.551115123125783*^-17, 2.220446049250313*^-16,
-2.3592239273284576*^-16, 4.85722573273506*^-16, -7.147060721024445*^-16,
1.2073675392798577*^-15, -1.916869440954372*^-15, 3.1259717037102064*^-15,
-5.0411064211886014*^-15, 8.16837916750579*^-15, -1.3209051907825398*^-14,
2.1377864756200182*^-14, -3.458669982359108*^-14, 5.596472721011714*^-14,
-9.055131861349097*^-14, 1.465160458236081*^-13, -2.370673237795176*^-13,
3.835834102607072*^-13, -6.206507137114341*^-13, 1.004234127360273*^-12,
-1.6248848342954435*^-12, 2.6291189633497825*^-12, -4.254003796798193*^-12,
6.883122762265558*^-12, -1.1137126558640235*^-11, 1.8020249321541067*^-11,
-2.9157375879969544*^-11, 4.717762520172237*^-11, -7.633500108148015*^-11,
1.23512626283229*^-10, -1.9984762736468268*^-10, 3.233602536479646*^-10,
-5.232078810126407*^-10, 8.465681346606119*^-10, -1.3697760156732426*^-9,
2.216344150333856*^-9, -3.5861201660070964*^-9, 5.802464316340953*^-9,
-9.388584482348049*^-9, 1.5191048798689004*^-8, -2.457963328103705*^-8,
3.9770682079726053*^-8, -6.43503153607631*^-8, 1.0412099744048916*^-7,
-1.6847131280125227*^-7, 2.725923102417414*^-7, -4.4106362304299367*^-7,
7.136559332847351*^-7, -1.1547195563277288*^-6}
Hasil yang diklaim φ^41
memiliki tanda yang salah, dan bahkan lebih awal, nilai yang dihitung dan aktual untuk φ^39
saham tidak memiliki digit yang sama ( 3.484899258054952
* ^ - 9 for the computed version against the true value
7.071019424062048 *^-9
). Algoritma demikian tidak stabil, dan orang tidak boleh menggunakan rumus rekursi ini dalam aritmatika yang tidak tepat. Hal ini disebabkan oleh sifat inheren formula rekursi: ada solusi "peluruhan" dan "tumbuh" untuk rekursi ini, dan mencoba menghitung solusi "peluruhan" dengan solusi maju ketika ada alternatif "tumbuh" solusi yang meminta. untuk kesedihan numerik. Dengan demikian seseorang harus memastikan bahwa algoritma numeriknya stabil.
Sekarang, ke konsep masalah yang tidak terkondisikan : meskipun mungkin ada cara yang stabil untuk melakukan sesuatu secara numerik, mungkin saja masalah yang Anda miliki tidak dapat diselesaikan dengan algoritma Anda. Ini adalah kesalahan dari masalah itu sendiri, dan bukan metode solusinya. Contoh kanonik dalam angka adalah solusi persamaan linear yang melibatkan apa yang disebut "matriks Hilbert":
Matriks adalah contoh kanonik dari matriks yang tidak terkondisikan : mencoba memecahkan suatu sistem dengan matriks Hilbert yang besar mungkin menghasilkan solusi yang tidak akurat.
Berikut ini adalah demonstrasi Mathematica : bandingkan hasil aritmatika yang tepat
Table[LinearSolve[HilbertMatrix[n], HilbertMatrix[n].ConstantArray[1, n]], {n, 2, 12}]
{{1, 1}, {1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1,
1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1,
1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}
dan aritmatika yang tidak tepat
Table[LinearSolve[N[HilbertMatrix[n]], N[HilbertMatrix[n].ConstantArray[1, n]]], {n, 2, 12}]
{{1., 1.}, {1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1., 1.},
{1., 1., 1., 1., 1., 1.}, {1., 1., 1., 1., 1., 1., 1.},
{1., 1., 1., 1., 1., 1., 1., 1.}, {1., 1., 1., 1., 1., 1., 1., 1., 1.},
{1., 1., 1., 0.99997, 1.00014, 0.999618, 1.00062, 0.9994, 1.00031,
0.999931}, {1., 1., 0.999995, 1.00006, 0.999658, 1.00122, 0.997327,
1.00367, 0.996932, 1.00143, 0.999717}, {1., 1., 0.999986, 1.00022,
0.998241, 1.00831, 0.975462, 1.0466, 0.94311, 1.04312, 0.981529,
1.00342}}
(Jika Anda mencobanya di Mathematica , Anda akan mencatat beberapa pesan kesalahan yang mengingatkan akan kondisi buruk yang muncul.)
Dalam kedua kasus, hanya meningkatkan presisi bukanlah obat; itu hanya akan menunda erosi angka yang tak terelakkan.
Inilah yang mungkin Anda hadapi. Solusinya mungkin sulit: untuk yang pertama, Anda kembali ke papan gambar, atau membaca jurnal / buku / apa pun untuk menemukan jika orang lain telah menemukan solusi yang lebih baik daripada yang Anda miliki; untuk yang kedua, Anda menyerah, atau merumuskan kembali masalah Anda menjadi sesuatu yang lebih bisa ditelusuri.
Saya akan meninggalkan Anda dengan penawaran dari Dianne O'Leary:
Hidup mungkin melemparkan kita beberapa masalah yang tidak terkondisikan, tetapi tidak ada alasan bagus untuk menerima algoritma yang tidak stabil.