지금까지 언급되지 않은 것은 불안정한 알고리즘 의 개념 과 조건 이 잘못된 문제 입니다. 나는 초보 수치 주의자들에게 더 빈번한 함정 인 것처럼 보이기 때문에 전자를 먼저 다룰 것이다.
(역수) 황금비의 거듭 제곱의 계산을 고려하십시오 φ=0.61803…
. 한 가지 가능한 방법은 and로 φ^n=φ^(n-2)-φ^(n-1)
시작 하는 재귀 수식을 사용하는 것입니다 . 선호하는 컴퓨팅 환경에서이 재귀를 실행하고 결과를 정확하게 평가 된 검정력과 비교하면 중요한 수치가 느리게 침식됩니다. Mathematica 에서 예를 들면 다음과 같습니다 .φ^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}
추출 된 결과에 φ^41
잘못된 부호가 있으며 심지어 이전에는 계산 된 값과 실제 값 φ^39
이 공통으로 숫자 를 공유하지 않습니다 ( 3.484899258054952
* ^-9 for the computed version against the true value
7.071019424062048 *^-9
). 따라서 알고리즘이 불안정하므로이 재귀 공식을 부정확 한 산술에 사용해서는 안됩니다. 이것은 재귀 공식의 고유 한 특성 때문입니다.이 재귀에는 "부패"및 "성장"솔루션이 있으며, 대안적인 "성장"솔루션이있을 때 포워드 솔루션으로 "부패"솔루션을 계산하려고합니다. 수치적인 슬픔을 위해. 따라서 수치 알고리즘이 안정적인지 확인해야합니다.
이제는 조건 이 잘못된 문제 의 개념으로, 수치 적으로 무언가를 수행하는 안정적인 방법이있을지라도 알고리즘으로는 해결할 수없는 문제 일 수 있습니다. 이것은 해결책 자체가 아니라 문제 자체의 결함입니다. 숫자의 표준 예는 소위 "Hilbert matrix"와 관련된 선형 방정식의 솔루션입니다.
이 행렬은 조건 이 잘못된 행렬의 정식 예입니다. 힐버트 행렬이 큰 시스템을 해결하려고하면 부정확 한 솔루션이 반환 될 수 있습니다.
다음은 Mathematica 데모입니다. 정확한 산술 결과를 비교하십시오.
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}}
부정확 한 산술
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 에서 사용해 보았을 경우 , 잘못된 상태가 표시 된다는 경고 메시지가 나타납니다.)
두 경우 모두, 단순히 정밀도를 높이는 것은 치료법이 아닙니다. 피할 수없는 수치의 침식 만 지연시킬 것입니다.
이것이 당신이 직면 할 수있는 것입니다. 해결책은 어려울 수 있습니다. 첫째, 드로잉 보드로 돌아가거나 저널 / 책 / 책을 통해 다른 사람이 자신보다 더 나은 솔루션을 찾았는지 찾아보십시오. 두 번째로, 당신은 문제를 더 다루기 쉬운 것으로 포기하거나 재구성합니다.
Dianne O'Leary의 인용문을 남겨 드리겠습니다.
인생은 우리에게 문제가되는 몇 가지 문제를 던져 줄 수도 있지만 불안정한 알고리즘을 해결해야 할 이유는 없습니다.