Para ampliar la respuesta de Brian Feldman, diría que puedes jugar escribiendo una biblioteca numérica de juguete.
Comience con, digamos, una función para calcular la raíz cuadrada de un número [matemática] n [/ matemática], correcta para decir, 5 lugares decimales ([matemática] \ epsilon = 0.00001 [matemática]). ¿Cómo harías esto? Quizás para empezar, podría probar cada número de 5 decimales entre 0 yn, y elegir el mejor. Ahora piense en lo eficiente que es esto. Probarás 100,000 * n números. Bueno, tu próximo paso podría ser decir, “oye, no creo que necesite probar todos estos números, tal vez sabré dentro de 1-2 iteraciones de haber llegado a mi respuesta, que he llegado a mi respuesta “. Este enfoque debería tomar aproximadamente 100,000 * sqrt (n) iteraciones, mucho mejor. A continuación, intente utilizar un truco común de búsqueda de ciencias de la computación para reducir esto a aproximadamente (n) iteraciones (los matemáticos lo llamarán “convergencia lineal”: el número de iteraciones es aproximadamente proporcional al número de dígitos de su entrada). Ahora, ponte el sombrero de matemático: ¿puedes hacerlo mucho mejor que eso? Alguien con conocimientos matemáticos de nivel de cálculo AP en realidad tiene todas las herramientas necesarias para obtener una solución que requiere aproximadamente iteraciones log (log (n)) (es decir, “convergencia cuadrática”).
Luego, tal vez podría escribir una función llamada “fPrime” que toma como entrada otra función “f” y un valor “x”, y genera f ‘(x), la derivada de f evaluada en x. ¿Qué propiedades debe tener “f” para que esto sea un problema razonable?
Pruebe cosas similares para integrales, encuentre la raíz de una ecuación polinómica, etc. A continuación, tal vez podría pasar al producto vectorial de puntos matemáticos, multiplicación de matrices, estadísticas básicas como media, varianza, etc.
Para cada uno de estos problemas, debe pensar en:
a) ¿Qué son entradas válidas e inválidas (por ejemplo: sqrt no funciona con valores negativos)? Especialmente si las entradas son funciones, ¿qué propiedades deben tener estas funciones de entrada?
b) ¿Hay partes de la recta numérica donde estas funciones se comportan de manera diferente? ¿Es su solución lo suficientemente general? (Nota: Mis soluciones sugeridas para la raíz cuadrada se rompen intencionalmente para valores menores que 1, ¿cómo solucionaría esto?).
c) Sea cual sea el tipo de datos que utilice (flotante, doble, etc.), habrá una cantidad finita de precisión: qué problemas se encuentran con respecto a la precisión numérica. ¿Qué pasa si sus entradas son realmente pequeñas o realmente grandes? Si se trata de problemas relacionados con vectores / matrices, piense en los problemas que podría encontrar si su vector tiene millones de puntos de datos. ¿Cómo cambian estos problemas su elección de algoritmo?
d) Y, por último, existe una forma mejor (más rápida) de resolver el problema.