Những gì dường như chưa được đề cập cho đến nay là các khái niệm về một thuật toán không ổn định và một vấn đề không có điều kiện . Trước tiên tôi sẽ giải quyết vấn đề này, vì đó dường như là một cạm bẫy thường xuyên hơn đối với các nhà số học mới làm quen.
Xem xét tính toán sức mạnh của tỷ lệ vàng (đối ứng) φ=0.61803…
; một cách có thể để làm điều đó là sử dụng công thức đệ quy φ^n=φ^(n-2)-φ^(n-1)
, bắt đầu bằng φ^0=1
và φ^1=φ
. Nếu bạn chạy đệ quy này trong môi trường máy tính yêu thích của bạn và so sánh kết quả với các quyền hạn được đánh giá chính xác, bạn sẽ thấy sự ăn mòn chậm của các số liệu quan trọng. Đây là những gì xảy ra trong Mathicala :
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}
Kết quả φ^41
có ý định có dấu sai và thậm chí sớm hơn, các giá trị được tính toán và thực tế cho φ^39
chia sẻ không có chữ số chung ( 3.484899258054952
* ^ - 9 for the computed version against the true value
7.071019424062048 *^-9
). Do đó, thuật toán không ổn định và người ta không nên sử dụng công thức đệ quy này trong số học không chính xác. Điều này là do bản chất vốn có của công thức đệ quy: có một giải pháp "phân rã" và "đang phát triển" cho đệ quy này và cố gắng tính toán giải pháp "phân rã" bằng giải pháp chuyển tiếp khi có một giải pháp "tăng trưởng" thay thế đang cầu xin cho đau buồn số. Do đó, người ta phải đảm bảo rằng các thuật toán số của mình ổn định.
Bây giờ, về khái niệm của một vấn đề không có điều kiện : mặc dù có thể có một cách ổn định để làm một cái gì đó bằng số, nhưng rất có thể đó là vấn đề bạn vừa không thể giải quyết bằng thuật toán của mình. Đây là lỗi của chính vấn đề chứ không phải phương pháp giải. Ví dụ chính tắc trong số là giải pháp của các phương trình tuyến tính liên quan đến cái gọi là "ma trận Hilbert":
Ma trận là ví dụ điển hình của ma trận điều hòa : cố gắng giải một hệ thống với ma trận Hilbert lớn có thể trả về một giải pháp không chính xác.
Dưới đây là một Mathematica trình diễn: so sánh kết quả của số học chính xác
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}}
và số học không chính xác
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}}
(Nếu bạn đã dùng thử trong Mathematica , bạn sẽ lưu ý một vài thông báo lỗi cảnh báo về tình trạng điều hòa không khí xuất hiện.)
Trong cả hai trường hợp, chỉ cần tăng độ chính xác là không thể chữa khỏi; nó sẽ chỉ trì hoãn sự xói mòn không thể tránh khỏi của các số liệu.
Đây là những gì bạn có thể phải đối mặt với. Các giải pháp có thể khó khăn: lần đầu tiên, bạn quay lại bảng vẽ, hoặc lội qua các tạp chí / sách / bất cứ điều gì để tìm nếu ai đó đưa ra giải pháp tốt hơn bạn có; lần thứ hai, bạn có thể từ bỏ hoặc cải tổ vấn đề của mình thành một vấn đề dễ hiểu hơn.
Tôi sẽ để lại cho bạn một trích dẫn từ Dianne O'Leary:
Cuộc sống có thể ném cho chúng ta một số vấn đề không có điều kiện, nhưng không có lý do chính đáng để giải quyết cho một thuật toán không ổn định.