Lo que parece no haberse mencionado hasta ahora son los conceptos de un algoritmo inestable y un problema mal condicionado . Primero abordaré el primero, ya que parece ser un obstáculo más frecuente para los expertos en numeración novatos.
Considere el cálculo de los poderes de la proporción áurea (recíproca) φ=0.61803…
; Una forma posible de hacerlo es usar la fórmula de recursión φ^n=φ^(n-2)-φ^(n-1)
, comenzando con φ^0=1
y φ^1=φ
. Si ejecuta esta recursividad en su entorno informático favorito y compara los resultados con potencias evaluadas con precisión, encontrará una erosión lenta de cifras significativas. Esto es lo que sucede, por ejemplo, en 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}
El resultado pretendido para φ^41
tiene el signo incorrecto, e incluso antes, los valores calculados y reales para φ^39
compartir sin dígitos en común ( 3.484899258054952
* ^ - 9 for the computed version against the true value
7.071019424062048 *^-9
). El algoritmo es, por lo tanto, inestable, y uno no debe usar esta fórmula de recursión en aritmética inexacta. Esto se debe a la naturaleza inherente de la fórmula de recursión: hay una solución "en descomposición" y "creciente" para esta recursión, y tratar de calcular la solución "en descomposición" mediante una solución directa cuando hay una solución alternativa "creciente" está rogando por pena numérica. Por lo tanto, uno debe asegurarse de que sus algoritmos numéricos sean estables.
Ahora, con el concepto de un problema mal condicionado : aunque puede haber una forma estable de hacer algo numéricamente, es muy posible que el problema que tiene no pueda ser resuelto por su algoritmo. Esto es culpa del problema en sí, y no del método de solución. El ejemplo canónico en numéricos es la solución de ecuaciones lineales que involucran la llamada "matriz de Hilbert":
La matriz es el ejemplo canónico de una matriz mal acondicionada : tratar de resolver un sistema con una gran matriz de Hilbert podría devolver una solución inexacta.
Aquí hay una demostración de Mathematica : compare los resultados de la aritmética exacta
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}}
y aritmética inexacta
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}}
(Si lo probó en Mathematica , notará algunos mensajes de error que advierten sobre la aparición de problemas).
En ambos casos, simplemente aumentar la precisión no es una cura; solo retrasará la inevitable erosión de las figuras.
Esto es a lo que te puedes enfrentar. Las soluciones pueden ser difíciles: para el primero, puede volver al tablero de dibujo o leer revistas / libros / lo que sea para encontrar si alguien más ha encontrado una solución mejor que usted; para el segundo, te rindes o reformulas tu problema a algo más manejable.
Te dejo con una cita de Dianne O'Leary:
La vida puede arrojarnos algunos problemas mal condicionados, pero no hay una buena razón para conformarse con un algoritmo inestable.