57. Máximos y mínimos

Los máximos y mínimos identifican los valores más altos o más bajos que alcanza una función en un punto o intervalo.

57.1 Introducción

Al analizar una función, muchas veces interesa saber dónde alcanza su valor más alto o más bajo. Esos puntos se llaman máximos y mínimos.

En programación, esta idea aparece al optimizar costos, detectar picos en datos, encontrar el mejor resultado posible o localizar valores extremos en una simulación.

57.2 Máximo

Un máximo es un valor de la función que es mayor o igual que otros valores considerados.

f(a) es máximo si f(a) ≥ f(x) para los x considerados

El máximo puede analizarse dentro de un intervalo o en todo el dominio.

57.3 Mínimo

Un mínimo es un valor de la función que es menor o igual que otros valores considerados.

f(a) es mínimo si f(a) ≤ f(x) para los x considerados

También puede ser local, global o estar limitado a un intervalo específico.

57.4 Tipos de extremos

Tipo Descripción Alcance
Máximo local Mayor que los valores cercanos Vecindad del punto
Mínimo local Menor que los valores cercanos Vecindad del punto
Máximo global Mayor valor de todo el intervalo o dominio Todo el conjunto analizado
Mínimo global Menor valor de todo el intervalo o dominio Todo el conjunto analizado

57.5 Función con mínimo

La función cuadrática f(x) = x² tiene un mínimo en x = 0.

function f(x) {
  return x * x;
}

for (let x = -3; x <= 3; x++) {
  console.log({ x, y: f(x) });
}

57.6 Función con máximo

La función f(x) = -x² tiene un máximo en x = 0.

function f(x) {
  return -x * x;
}

for (let x = -3; x <= 3; x++) {
  console.log({ x, y: f(x) });
}

57.7 Buscar mínimo en puntos

Si tenemos una lista de puntos, podemos recorrerla y conservar el menor valor encontrado.

function buscarMinimo(puntos) {
  let minimo = puntos[0];

  for (const punto of puntos) {
    if (punto.y < minimo.y) {
      minimo = punto;
    }
  }

  return minimo;
}

const puntos = [
  { x: -2, y: 4 },
  { x: -1, y: 1 },
  { x: 0, y: 0 },
  { x: 1, y: 1 },
  { x: 2, y: 4 }
];

console.log(buscarMinimo(puntos));

57.8 Buscar máximo en puntos

El procedimiento para buscar un máximo es equivalente, pero comparando valores mayores.

function buscarMaximo(puntos) {
  let maximo = puntos[0];

  for (const punto of puntos) {
    if (punto.y > maximo.y) {
      maximo = punto;
    }
  }

  return maximo;
}

const puntos = [
  { x: -2, y: -4 },
  { x: -1, y: -1 },
  { x: 0, y: 0 },
  { x: 1, y: -1 },
  { x: 2, y: -4 }
];

console.log(buscarMaximo(puntos));

57.9 Extremos locales

Un extremo local se detecta comparando un punto con los valores cercanos. Si está por encima de ambos vecinos, es máximo local. Si está por debajo, es mínimo local.

y anterior < y actual > y siguiente → máximo local y anterior > y actual < y siguiente → mínimo local

57.10 Detectar extremos locales

function extremosLocales(puntos) {
  const extremos = [];

  for (let i = 1; i < puntos.length - 1; i++) {
    const anterior = puntos[i - 1];
    const actual = puntos[i];
    const siguiente = puntos[i + 1];

    if (actual.y > anterior.y && actual.y > siguiente.y) {
      extremos.push({ ...actual, tipo: "máximo local" });
    }

    if (actual.y < anterior.y && actual.y < siguiente.y) {
      extremos.push({ ...actual, tipo: "mínimo local" });
    }
  }

  return extremos;
}

const puntos = [
  { x: 0, y: 0 },
  { x: 1, y: 3 },
  { x: 2, y: 1 },
  { x: 3, y: 4 },
  { x: 4, y: 2 }
];

console.log(extremosLocales(puntos));

57.11 Extremos globales en un intervalo

Una función puede no tener máximo o mínimo global en todo su dominio, pero sí tenerlos dentro de un intervalo cerrado.

Analizar f(x) entre x = -2 y x = 4 puede dar extremos distintos que analizar todo el dominio.

57.12 Buscar extremos por muestreo

Podemos muestrear una función en un intervalo y buscar el mayor y menor valor entre las muestras.

function muestrear(funcion, desde, hasta, paso) {
  const puntos = [];

  for (let x = desde; x <= hasta; x += paso) {
    puntos.push({ x, y: funcion(x) });
  }

  return puntos;
}

function f(x) {
  return x * x - 4 * x + 3;
}

const puntos = muestrear(f, -1, 5, 1);

console.log(puntos);

57.13 Encontrar mínimo por muestreo

Este enfoque aproxima el mínimo dentro del intervalo elegido.

function f(x) {
  return x * x - 4 * x + 3;
}

function buscarMinimoMuestreado(desde, hasta, paso) {
  let minimo = { x: desde, y: f(desde) };

  for (let x = desde; x <= hasta; x += paso) {
    const punto = { x, y: f(x) };
    if (punto.y < minimo.y) {
      minimo = punto;
    }
  }

  return minimo;
}

console.log(buscarMinimoMuestreado(-1, 5, 0.5));

57.14 Precisión del muestreo

Cuanto menor sea el paso, más precisa puede ser la aproximación, pero se hacen más cálculos.

function cantidadMuestras(desde, hasta, paso) {
  return Math.floor((hasta - desde) / paso) + 1;
}

console.log(cantidadMuestras(-10, 10, 1));
console.log(cantidadMuestras(-10, 10, 0.1));
console.log(cantidadMuestras(-10, 10, 0.01));

57.15 Vértice de una cuadrática

Para una función cuadrática ax² + bx + c, la coordenada x del vértice se calcula con:

x = -b / (2a)

Si a es positivo, el vértice es un mínimo. Si a es negativo, es un máximo.

57.16 Calcular vértice en JavaScript

function verticeCuadratica(a, b, c) {
  const x = -b / (2 * a);
  const y = a * x * x + b * x + c;
  const tipo = a > 0 ? "mínimo" : "máximo";

  return { x, y, tipo };
}

console.log(verticeCuadratica(1, -4, 3));
console.log(verticeCuadratica(-1, 4, 3));

57.17 Aplicación en optimización

Muchos problemas de programación consisten en maximizar una utilidad o minimizar un costo.

function costo(tamaño) {
  return tamaño * tamaño - 10 * tamaño + 40;
}

function buscarMejorTamaño() {
  let mejor = { tamaño: 0, costo: costo(0) };

  for (let tamaño = 1; tamaño <= 10; tamaño++) {
    const actual = { tamaño, costo: costo(tamaño) };
    if (actual.costo < mejor.costo) {
      mejor = actual;
    }
  }

  return mejor;
}

console.log(buscarMejorTamaño());

57.18 Máximos en datos

En datos reales, encontrar máximos permite detectar picos de demanda, tráfico, temperatura o ventas.

function maximoDato(valores) {
  let indiceMaximo = 0;

  for (let i = 1; i < valores.length; i++) {
    if (valores[i] > valores[indiceMaximo]) {
      indiceMaximo = i;
    }
  }

  return {
    indice: indiceMaximo,
    valor: valores[indiceMaximo]
  };
}

console.log(maximoDato([10, 14, 13, 20, 18]));

57.19 Mínimos en datos

Encontrar mínimos sirve para ubicar caídas, puntos de menor costo o valores críticos bajos.

function minimoDato(valores) {
  let indiceMinimo = 0;

  for (let i = 1; i < valores.length; i++) {
    if (valores[i] < valores[indiceMinimo]) {
      indiceMinimo = i;
    }
  }

  return {
    indice: indiceMinimo,
    valor: valores[indiceMinimo]
  };
}

console.log(minimoDato([10, 14, 8, 20, 18]));

57.20 Aplicaciones en programación

  • Buscar el menor costo de una operación.
  • Encontrar el mayor rendimiento en una configuración.
  • Detectar picos y caídas en series de datos.
  • Optimizar parámetros de una simulación.
  • Ubicar el punto más alto o bajo de una trayectoria.

57.21 Errores comunes

  • Confundir máximo local con máximo global.
  • Buscar extremos solo en muestras demasiado separadas.
  • No considerar los extremos del intervalo analizado.
  • Olvidar que algunas funciones no tienen máximo o mínimo global.
  • Comparar valores con ruido sin suavizar o validar los datos.

57.22 Qué debes recordar de este tema

  • Un máximo es un valor alto respecto de otros valores considerados.
  • Un mínimo es un valor bajo respecto de otros valores considerados.
  • Los extremos pueden ser locales o globales.
  • En una cuadrática, el vértice indica máximo o mínimo según el signo de a.
  • En programación, los extremos se buscan recorriendo datos o muestreando funciones.

57.23 Conclusión

Los máximos y mínimos permiten identificar puntos importantes de una función o conjunto de datos. Son esenciales para optimización, análisis de rendimiento, detección de picos y toma de decisiones basada en valores extremos.