Fundamentos · Tema 18

Experimentación computacional

Cómo usar programas para formular preguntas, generar datos, explorar parámetros y someter conjeturas a pruebas exigentes sin confundir la evidencia numérica con una demostración matemática.

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/2 por 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.

01 · PREGUNTAR

Delimitar

Formular qué comportamiento queremos conocer.

02 · MODELAR

Representar

Traducir variables, reglas y supuestos a un programa.

03 · EJECUTAR

Variar

Elegir casos y parámetros de manera sistemática.

04 · ANALIZAR

Comparar

Usar tablas, gráficos, errores y resúmenes.

05 · REVISAR

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.

Capas que pueden explicar una diferencia entre resultado y expectativa.
CapaPregunta de controlEjemplo 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.

Pruebas de sensibilidad numérica.
Cambio de configuraciónQué compruebaSeñal de alerta
Duplicar muestrasResolución espacial o paramétrica.La forma cambia por completo.
Duplicar iteracionesDuración del transitorio.El diagnóstico anterior se invierte.
Reducir el pasoSensibilidad del método numérico.Los resultados no se acercan entre sí.
Aumentar precisión mostradaEfecto del redondeo.Una meseta escondía pequeñas variaciones.
Usar otro algoritmoDependencia 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ó.

Pregunta e hipótesisQué se busca y qué comportamiento se espera antes de observar los resultados.
Versión y configuraciónCódigo utilizado, parámetros, estado inicial, tolerancias y cantidad de pasos.
Entorno y semillaVersión del lenguaje, dependencias y semilla si interviene pseudoazar.
Datos sin procesarResultados originales además de promedios, gráficos o conclusiones derivadas.
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.

observar casosformular patrónbuscar contraejemplosrefinar condicionesdemostrar o acotar

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.

EXPERIMENTO 18

Cambiar una condición, observar una trayectoria

xₙ₊₁ = q · xₙ

Los resultados aparecen debajo del gráfico.
Estado final0,000008
Mínimo observado0,000008
Máximo observado0,8
DiagnósticoSe acerca a cero

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

  1. En la multiplicación repetida, buscá los cambios de comportamiento alrededor de q=−1 y q=1.
  2. En la atracción a un punto fijo, probá varios estados iniciales con el mismo parámetro. ¿Comparten el valor final?
  3. En el mapa logístico, compará parámetros cercanos a 2, 3.2 y 3.9. ¿Aparece un valor estable, un ciclo o irregularidad?
  4. 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.