Şimdiye kadar bahsedilmemiş gibi görünen şey, kararsız bir algoritma ve koşulsuz bir problemin kavramlarıdır . İlkine hitap edeceğim, çünkü acemi sayısalcılar için daha sık görülen bir sorun.
(Karşılıklı) altın oranın güçlerinin hesaplanmasını düşünün φ=0.61803…
; Bunu yapmanın bir yolu, özyinelemeyi ve φ^n=φ^(n-2)-φ^(n-1)
ile başlayan formülünü kullanmaktır . Bu özyinelemeyi en sevdiğiniz bilgisayar ortamınızda yaparsanız ve sonuçları doğru bir şekilde değerlendirilmiş güçlerle karşılaştırırsanız, önemli rakamların yavaşça erozyonunu görürsünüz. Mathematica’da örneğin olanlar :φ^0=1
φ^1=φ
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}
Bunun için φ^41
öngörülen sonuç yanlış işarete sahip ve daha önce hesaplanan ve hesaplanan gerçek değerler φ^39
ortak rakamları paylaşmıyor ( 3.484899258054952
* ^ - 9 for the computed version against the true value
7.071019424062048 *^-9
). Bu nedenle algoritma kararsızdır ve bu özyineleme formülünü tam olmayan aritmetik olarak kullanmamalısınız. Bu, özyinelemenin doğasında var olan doğası gereğidir: bu özyinelemede "çürüyen" ve "büyüyen" bir çözüm vardır ve alternatif bir "büyüyen" çözüm dilendiğinde "çürüyen" çözümü ileriye doğru çözerek hesaplamaya çalışmaktır. sayısal keder için. Dolayısıyla, sayısal algoritmalarının kararlı olmasını sağlamalıdır.
Şimdi, koşulsuz bir sorun kavramı üzerine : sayısal olarak bir şeyi yapmanın kararlı bir yolu olsa da, problemin algoritmanız tarafından çözülememesi çok iyi olabilir. Bu, çözüm yönteminin değil sorunun kendisinin hatasıdır. Nümerikteki kanonik örnek, "Hilbert matrisi" olarak adlandırılan doğrusal denklemlerin çözümüdır:
Matris bir kanonik örneğidir kötü koşullanmış bir yanlış çözüm döndürebilir büyük Hilbert matris ile bir sistemi çözmeye çalışmak: matriksi.
İşte bir Mathematica gösterisi: Kesin aritmetiğin sonuçlarını karşılaştır
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}}
ve tam olmayan aritmetik
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}}
( Mathematica'da denediyseniz , kötü görünen şartlara dair bir kaç hata mesajı bulunduğunu not edersiniz.)
Her iki durumda da, kesinliği arttırmak bir tedavi değildir; yalnızca rakamların kaçınılmaz aşınmasını geciktirir.
Bununla karşılaşabileceğin şey bu. Çözümler zor olabilir: birincisi, çizim tahtasına geri dönersiniz ya da dergilerden / kitaplardan geçtiniz ya da bir başkasının sizden daha iyi bir çözüm getirip getirmediğini bulmak için ne olursa olsun; ikincisi, sorununuzu daha izlenebilir bir şeye bırakmanız ya da bırakmanız.
Seni Dianne O'Leary'den bir teklifle bırakacağım:
Yaşam bize bazı rahatsız edici sorunları atlatabilir, ancak dengesiz bir algoritmaya razı olmak için iyi bir neden yoktur.