01 · Punto de partida
Programar también puede ser una forma de investigar
Una computadora permite realizar miles de cálculos, repetir un proceso con distintos valores y visualizar resultados en segundos. Esa capacidad convierte al código en un laboratorio: podemos explorar una pregunta antes de conocer su respuesta definitiva.
Por ejemplo, al iterar la regla xₙ₊₁ = xₙ/2 + 1 desde distintos valores iniciales, las tablas parecen acercarse a 2. El experimento sugiere una conjetura: “para cualquier valor inicial, la sucesión converge a 2”. A partir de allí surgen mejores preguntas:
- ¿también ocurre con valores iniciales negativos o muy grandes?
- ¿cuán rápido se acerca?
- ¿qué cambia si reemplazamos
1/2por otro parámetro? - ¿el patrón observado puede justificarse algebraicamente?
- ¿una limitación numérica podría estar simulando estabilidad?
02 · Un método para explorar
Del problema a una nueva pregunta
La experimentación funciona como un ciclo. Los resultados rara vez cierran el problema de inmediato; suelen revelar una excepción, una escala relevante o una pregunta más precisa.
Delimitar
Formular qué comportamiento queremos conocer.
Representar
Traducir variables, reglas y supuestos a un programa.
Variar
Elegir casos y parámetros de manera sistemática.
Comparar
Usar tablas, gráficos, errores y resúmenes.
Refinar
Buscar explicaciones, excepciones y nuevas pruebas.
Una pregunta útil es concreta y observable. “¿Qué hace esta sucesión?” es demasiado amplia. “¿Para qué valores de q la iteración xₙ₊₁=q·xₙ se acerca a cero desde x₀=1?” define una regla, un parámetro, un estado inicial y un comportamiento que puede medirse.
03 · La realidad y su representación
Todo experimento depende de un modelo
Si investigamos una fórmula matemática, el programa implementa una representación numérica de esa fórmula. Si simulamos un fenómeno físico, económico o biológico, agregamos además supuestos sobre la realidad.
| Capa | Pregunta de control | Ejemplo de problema |
|---|---|---|
| Fenómeno | ¿Qué queremos estudiar? | La situación real incluye variables omitidas. |
| Modelo matemático | ¿Qué supuestos usamos? | Se supone crecimiento ilimitado donde hay capacidad finita. |
| Método numérico | ¿Cómo aproximamos? | El paso es demasiado grande. |
| Implementación | ¿El código expresa el método? | Índice desplazado o condición incorrecta. |
| Representación | ¿Cómo almacenamos y mostramos? | Redondeo o pérdida de precisión. |
Que el programa se ejecute sin errores no prueba que el modelo sea adecuado ni que el algoritmo esté bien implementado. Validar un experimento incluye probar casos conocidos, revisar unidades y comparar con otra formulación cuando sea posible.
04 · Qué se modifica y qué se mide
Parámetros, controles y observables
Un diseño claro separa los elementos del experimento:
- Parámetro
- Valor que define una familia de casos, como una tasa, un tamaño de paso o una tolerancia.
- Condición inicial
- Estado desde el cual comienza un proceso iterativo o una simulación.
- Variable de control
- Cantidad que mantenemos fija mientras estudiamos el efecto de otra.
- Observable
- Resultado registrado: error, tiempo, cantidad de iteraciones, máximo o estado final.
En xₙ₊₁=q·xₙ, podemos variar q, mantener x₀ y la cantidad de pasos fijos, y observar |xₙ|. Si cambiamos simultáneamente q, x₀ y los pasos, será difícil atribuir el resultado a una causa.
05 · Explorar sin elegir solo casos cómodos
Barridos de parámetros y casos frontera
Probar únicamente q=0.5 muestra un caso, no el comportamiento de toda la familia. Un barrido evalúa una secuencia ordenada de parámetros y registra el mismo observable:
function iterarGeometrica(q, inicial = 1, pasos = 50) {
let x = inicial;
for (let n = 0; n < pasos; n += 1) x *= q;
return x;
}
const resultados = [];
for (let q = -1.2; q <= 1.2; q += 0.05) {
resultados.push({
q: Number(q.toFixed(2)),
estadoFinal: iterarGeometrica(q)
});
}
console.table(resultados);
Los casos cercanos a q=−1, q=0 y q=1 son especialmente informativos porque separan regímenes: convergencia, alternancia, constancia o crecimiento. También conviene incluir:
- cero, valores negativos y extremos permitidos;
- puntos apenas a cada lado de un umbral;
- entradas muy pequeñas y muy grandes;
- casos con respuesta conocida para comprobar el código;
- valores aleatorios, después de cubrir los casos diseñados.
06 · Verificar que el patrón no sea un artefacto
Resolución, cantidad de pasos y precisión
Un resultado experimental depende de cuánto y cómo calculamos. Aumentar la resolución puede revelar una oscilación antes oculta; aumentar las iteraciones puede mostrar que una aparente estabilidad era transitoria.
| Cambio de configuración | Qué comprueba | Señal de alerta |
|---|---|---|
| Duplicar muestras | Resolución espacial o paramétrica. | La forma cambia por completo. |
| Duplicar iteraciones | Duración del transitorio. | El diagnóstico anterior se invierte. |
| Reducir el paso | Sensibilidad del método numérico. | Los resultados no se acercan entre sí. |
| Aumentar precisión mostrada | Efecto del redondeo. | Una meseta escondía pequeñas variaciones. |
| Usar otro algoritmo | Dependencia del método. | Dos métodos confiables discrepan mucho. |
No siempre “más” produce una respuesta mejor. Más pasos acumulan costo y, en algunos cálculos, error de redondeo. La verificación consiste en estudiar cómo cambia el resultado y justificar una configuración suficiente para la pregunta.
07 · Poder repetir el recorrido
Registrar condiciones y resultados
Un experimento es reproducible cuando otra ejecución puede reconstruir sus condiciones. Guardar solamente el resultado final impide explicar por qué apareció.
const registro = {
experimento: 'iteracion-geometrica',
fecha: new Date().toISOString(),
parametros: { q: 0.75, inicial: 10, pasos: 40 },
observable: 'valor absoluto final',
resultado: Math.abs(iterarGeometrica(0.75, 10, 40))
};
console.log(JSON.stringify(registro, null, 2));
Registrar antes la hipótesis reduce la tentación de presentar como predicción un patrón descubierto después de mirar los datos. Descubrir patrones es valioso, pero debe distinguirse de confirmarlos con nuevos casos.
08 · De observar a afirmar con cuidado
Conjeturas, contraejemplos y demostraciones
Una conjetura es una afirmación plausible basada en indicios. Miles de ejemplos compatibles aumentan la confianza práctica, pero una afirmación universal puede ser falsa por un único caso no probado.
Si probamos que n²+n+41 es primo para varios enteros no negativos, podríamos conjeturar que siempre lo es. Pero en n=40 obtenemos 40²+40+41=1681=41². El contraejemplo no vuelve inútiles las observaciones: muestra que la afirmación necesitaba revisión.
Una buena estrategia intenta romper la conjetura:
- probar límites y valores de transición;
- buscar entradas con una estructura diferente de las iniciales;
- usar mayor rango y precisión;
- construir casos adversos deliberadamente;
- derivar consecuencias que puedan verificarse por otra vía.
09 · Experimentos con variabilidad
Pseudoazar, semillas y repeticiones
En una simulación aleatoria, dos ejecuciones pueden producir resultados distintos. Una sola corrida no describe la distribución. Conviene repetir, resumir y mostrar la variabilidad mediante media, mediana, cuantiles o intervalos.
Math.random() no permite fijar una semilla de forma estándar. Para reproducibilidad puede usarse un generador explícito:
function crearGenerador(semilla) {
let estado = semilla >>> 0;
return function aleatorio() {
estado = (1664525 * estado + 1013904223) >>> 0;
return estado / 2 ** 32;
};
}
const aleatorio = crearGenerador(20260921);
console.log(aleatorio(), aleatorio(), aleatorio());
// La misma semilla reproduce la misma secuencia.
Un generador reproducible facilita depuración y comparación. No implica que sea adecuado para criptografía. Además, repetir siempre una única semilla verifica reproducibilidad, pero no robustez: hay que ensayar varias semillas registradas.
10 · Exploración
Laboratorio: experimentar con procesos iterativos
Elegí una regla, un parámetro, una condición inicial y la cantidad de pasos. El gráfico muestra el estado en cada iteración y el diagnóstico resume lo observado, no una propiedad demostrada para todos los casos.
Cambiar una condición, observar una trayectoria
xₙ₊₁ = q · xₙ
Con |q| menor que 1, la magnitud disminuye geométricamente.
El eje horizontal representa la iteración y el vertical el estado. La clasificación utiliza solamente los datos generados y puede cambiar al aumentar los pasos.
Preguntas para explorar
- En la multiplicación repetida, buscá los cambios de comportamiento alrededor de
q=−1yq=1. - En la atracción a un punto fijo, probá varios estados iniciales con el mismo parámetro. ¿Comparten el valor final?
- En el mapa logístico, compará parámetros cercanos a 2, 3.2 y 3.9. ¿Aparece un valor estable, un ciclo o irregularidad?
- En la aproximación de una raíz, aumentá el objetivo y cambiá
x₀. ¿Cuántos pasos parecen necesarios?
11 · Separar el motor del análisis
Construir un ejecutor de experimentos
Una función general puede recibir la regla, el estado inicial y la cantidad de pasos. Separar esta lógica de la interfaz facilita pruebas y reutilización:
function ejecutarIteracion({ siguiente, inicial, pasos, detener }) {
const trayectoria = [inicial];
let estado = inicial;
for (let n = 1; n <= pasos; n += 1) {
const nuevo = siguiente(estado, n);
trayectoria.push(nuevo);
if (!Number.isFinite(nuevo)) {
return { trayectoria, motivo: 'valor no finito' };
}
if (detener?.(nuevo, estado, n)) {
return { trayectoria, motivo: 'criterio alcanzado' };
}
estado = nuevo;
}
return { trayectoria, motivo: 'máximo de pasos' };
}
const prueba = ejecutarIteracion({
inicial: 10,
pasos: 100,
siguiente: x => 0.75 * x,
detener: (actual, anterior) => Math.abs(actual - anterior) < 1e-8
});
El objeto devuelto conserva la trayectoria y el motivo de finalización. Esto permite distinguir “alcanzó la tolerancia” de “se agotaron las iteraciones”, diferencia esencial para interpretar el resultado.
Ejecutar una matriz de configuraciones
function barrer(parametros, iniciales, ejecutar) {
return parametros.flatMap(parametro =>
iniciales.map(inicial => ({
parametro,
inicial,
...ejecutar(parametro, inicial)
}))
);
}
const casos = barrer(
[0.25, 0.5, 0.9, 1, 1.1],
[-10, 1, 100],
(q, inicial) => ({ final: iterarGeometrica(q, inicial, 50) })
);
Una matriz explícita impide olvidar combinaciones y produce datos adecuados para agrupar, filtrar o exportar. Para experimentos costosos conviene agregar tiempos, identificadores y resultados parciales.
12 · Comprensión
Confusiones frecuentes
«Muchos ejemplos equivalen a una demostración»
Los ejemplos aportan evidencia y permiten descubrir patrones. Una afirmación universal necesita un argumento general; un caso excepcional puede quedar fuera de cualquier muestra finita.
«Si el programa terminó, el experimento fue exitoso»
Terminar sin excepciones solo indica que la ejecución completó su recorrido. Todavía hay que validar modelo, implementación, datos y criterio de análisis.
«Cambiar varios parámetros acelera la investigación»
Puede generar más datos, pero dificulta atribuir efectos. Deben controlarse variables o registrar sistemáticamente todas las combinaciones.
«Una curva estable prueba convergencia»
Puede tratarse de un transitorio largo, redondeo, resolución insuficiente o estancamiento numérico. Hay que ampliar pasos y verificar una condición independiente.
«Una corrida aleatoria representa el comportamiento típico»
Una realización puede ser atípica. Se necesitan repeticiones, semillas registradas y medidas de variabilidad.
«Guardar el gráfico alcanza para reproducir el resultado»
La imagen no conserva necesariamente código, parámetros, datos originales, semilla ni versión del entorno.
13 · Práctica guiada
Ejercicios de comprensión
Ejercicio 1: diseñar el experimento
Queremos estudiar cuándo xₙ₊₁=q·xₙ se acerca a cero. Identificá parámetro, condición inicial, controles y observable.
Ver solución razonada
q es el parámetro; x₀, la condición inicial. Podemos mantener fijos x₀ y la cantidad de pasos mientras variamos q. Un observable posible es |xₙ| al final, acompañado por toda la trayectoria y una tolerancia para clasificar cercanía a cero.
Ejercicio 2: refutar una conjetura
Alguien afirma que n²+n+41 siempre es primo para enteros no negativos porque lo comprobó hasta 39. Buscá un contraejemplo.
Ver solución
Para n=40, el valor es 1600+40+41=1681=41², que no es primo. Un solo contraejemplo refuta la afirmación universal.
Ejercicio 3: prueba de sensibilidad
Un método devuelve 1.42 con paso 0.1 y 1.415 con paso 0.05. ¿Qué experimento realizarías después?
Ver solución
Repetiría con pasos 0.025 y 0.0125, conservaría más cifras internas y compararía diferencias sucesivas. Si los resultados se estabilizan, estimaría el orden del error; si no, revisaría el método, el intervalo y posibles inestabilidades.
Ejercicio 4: reproducibilidad
Indicá qué falta en el informe: “Ejecutamos una simulación aleatoria cien veces y el promedio fue 0.73”.
Ver solución
Faltan, entre otros datos, la pregunta, el modelo, el código o versión, parámetros, distribución usada, semillas, observable exacto, resultados individuales y una medida de dispersión. El promedio solo no permite reproducir ni valorar la variabilidad.
Ejercicio 5: barrido de parámetros
Generá resultados de xₙ=qⁿ para q desde 0 hasta 1.2 con paso 0.1 y n=30.
Ver solución y código
const resultados = Array.from({ length: 13 }, (_, indice) => {
const q = indice / 10;
return { q, valor: q ** 30 };
});
console.table(resultados);
// Para q < 1 los valores disminuyen; q = 1 permanece;
// para q > 1 crecen, aunque 30 pasos no demuestran el caso general.
14 · Síntesis
Ideas para recordar
- Un experimento computacional comienza con una pregunta concreta y observable.
- El resultado depende del modelo, el método numérico, la implementación y la representación.
- Parámetros, condiciones iniciales, controles y observables deben distinguirse.
- Los barridos sistemáticos y casos frontera son más informativos que ejemplos cómodos.
- Cambiar resolución, pasos o método ayuda a detectar artefactos numéricos.
- Reproducir exige registrar código, configuración, entorno, semillas y datos originales.
- Los experimentos sugieren conjeturas; no demuestran por sí solos afirmaciones universales.
- Buscar contraejemplos fortalece o refina una hipótesis.
- Los experimentos aleatorios necesitan repeticiones y medidas de variabilidad.
- Un diagnóstico debe distinguir criterio alcanzado, límite de recursos y fallo numérico.
En el próximo tema estudiaremos criterios de parada y tolerancia: cómo decidir cuándo una aproximación es suficientemente buena sin terminar demasiado pronto ni iterar indefinidamente.