Ir al contenido
Background Image

Optimización Numérica en Ingeniería Mecánica con Python

1828 palabras·9 mins·
Tabla de contenido
Métodos Numéricos - Este artículo es parte de una serie.
Parte 3: Este artículo

🥇 Módulo 3: Optimización Numérica
#


🚀 Optimización Numérica: Buscando el Óptimo en Ingeniería
#

¡Bienvenido al tercer módulo! La Optimización Numérica es quizás la aplicación más práctica de los métodos numéricos en la ingeniería. Su objetivo principal es encontrar los valores de un conjunto de variables de diseño que maximizan una característica deseada (ej. rendimiento, ganancia) o minimizan una característica no deseada (ej. costo, error, peso, energía).

La optimización transforma los desafíos de diseño en un problema matemático de encontrar los extremos (máximos o mínimos) de una función objetivo \(f(x)\).

Conceptos Teóricos: Extremos y Puntos Críticos
#

El fundamento de la optimización se basa en el cálculo diferencial:

  1. Función Objetivo (o de Costo): Es la función \(f(x)\) que queremos minimizar o maximizar.
  2. Punto Crítico (1D): Un extremo (máximo o mínimo local) ocurre donde la pendiente de la función es cero. $$\text{Punto Crítico: } f'(x) = 0$$
  3. Condición de Segundo Orden (1D): Para determinar si el punto crítico \(x\) es un máximo o un mínimo:
    • Si \(f''(x) > 0\), es un Mínimo Local.
    • Si \(f''(x) < 0\), es un Máximo Local.

En optimización numérica, buscamos la raíz de la derivada, \(f'(x)=0\), lo que convierte el problema de optimización en un problema de búsqueda de raíces (como en el módulo anterior).


🛠️ Métodos de Optimización Unidimensional (1D)
#

Cuando la función objetivo \(f(x)\) depende de una sola variable, se utilizan métodos especializados para encontrar el óptimo dentro de un intervalo definido.

1. Método de la Sección Dorada (Golden Section Search) #

El método de la Sección Dorada es el algoritmo de búsqueda de intervalos más robusto para optimización. Es la analogía directa del método de Bisección para la búsqueda de raíces.

Este método es ideal para encontrar el extremo de una función unimodal (una función con un solo pico o valle) dentro de un intervalo \([a, b]\). El algoritmo garantiza la reducción del intervalo de búsqueda en un factor constante en cada iteración, utilizando la razón áurea \(\phi \approx 1.618\) (y su recíproco \(R \approx 0.618\)).

Pseudocódigo: Método de la Sección Dorada (Minimización)
#

funcion seccion_dorada(f, a, b, tol, max_iter):
    R = 0.61803398875  // (sqrt(5) - 1) / 2
    
    // Inicialización de los puntos interiores
    x1 = a + (1 - R) * (b - a)
    x2 = a + R * (b - a)
    f1 = f(x1)
    f2 = f(x2)
    
    PARA i DESDE 1 HASTA max_iter HACER
        SI abs(b - a) < tol ENTONCES
            RETORNAR (a + b) / 2  // Solución encontrada
        FIN SI
        
        SI f1 < f2 ENTONCES
            // El mínimo está en [a, x2]. Descartar [x2, b]
            b = x2
            x2 = x1
            f2 = f1
            // Calcular el nuevo x1 y su f1
            x1 = a + (1 - R) * (b - a)
            f1 = f(x1)
        SINO
            // El mínimo está en [x1, b]. Descartar [a, x1]
            a = x1
            x1 = x2
            f1 = f2
            // Calcular el nuevo x2 y su f2
            x2 = a + R * (b - a)
            f2 = f(x2)
        FIN SI
    FIN PARA
    
    RETORNAR (a + b) / 2

2. Método de Newton para Optimización
#

Este método aplica el algoritmo de Newton-Raphson directamente a la condición de optimalidad: \(f'(x)=0\).

$$\text{Iteración: } x_{i+1} = x_i - \frac{f'(x_i)}{f''(x_i)}$$
  • Ventaja: Converge muy rápido (convergencia cuadrática) cerca del óptimo.
  • Desventaja: Requiere el cálculo de la primera y segunda derivadas (\(f'(x)\) y \(f''(x)\)).

🌌 Introducción a la Optimización Multivariable
#

En ingeniería, la mayoría de los problemas de optimización dependen de múltiples variables de diseño, \(\mathbf{x} = (x_1, x_2, \dots, x_n)\).

$$\text{Minimizar/Maximizar: } f(x_1, x_2, \dots, x_n)$$

La condición de optimización requiere que el gradiente sea cero:

$$\text{Punto Crítico: } \nabla f(\mathbf{x}) = \mathbf{0}$$

Los métodos numéricos más avanzados para este tipo de problemas se basan en el concepto de Descenso de Gradiente (Gradient Descent), donde se mueve en la dirección opuesta al gradiente para alcanzar el mínimo más rápido.


💻 Herramientas de Python: scipy.optimize
#

La librería SciPy ofrece las funciones más robustas y flexibles para resolver problemas de optimización, tanto unidimensionales como multivariables, y con o sin restricciones.

1. Optimización Unidimensional (minimize_scalar)
#

Para encontrar el mínimo de una función de una sola variable en un intervalo.

import numpy as np
from scipy.optimize import minimize_scalar

# Función objetivo: f(x) = x^2 - 4x + 3
def funcion_objetivo_1d(x):
    return x**2 - 4*x + 3

# El mínimo analítico es x=2
resultado = minimize_scalar(funcion_objetivo_1d, bounds=(-5, 5), method='bounded')

print(f"Mínimo encontrado en x: {resultado.x:.4f}")
# Resultado: Mínimo encontrado en x: 2.0000

2. Optimización General y con Restricciones (minimize)
#

La función minimize es la herramienta de propósito general para la optimización y es fundamental para problemas de ingeniería con múltiples restricciones y variables (utilizando métodos como SLSQP o COBYLA).


🌍 Casos Aplicados en Ingeniería (Resuelto con Código Python)
#

1. Diseño Estructural: Optimización de un Tubo Anular (Con 3 Restricciones)
#

El objetivo es minimizar el área de la sección transversal (\(A\)) de un tubo anular (y, por lo tanto, el peso) variando sus diámetros exterior (\(D_e\)) e interior (\(D_i\)).

Parámetros y Condiciones:

Parámetro Símbolo/Valor Descripción
Carga Axial \(P = 1000 \text{ N}\) Carga máxima que debe soportar el tubo.
Esfuerzo Máximo Permitido \(\sigma_{max} = 100 \text{ MPa}\) Límite de tensión en el material (\(\sigma = P/A\)).
Diámetro Exterior Máximo \(D_{e, max} = 150 \text{ mm}\) Restricción geométrica/de espacio.
Espesor Mínimo \(t_{min} = 0.5 \text{ mm}\) Mínimo espesor de pared para fabricación.

Formulación del Problema:

  • Variables de Diseño: \(\mathbf{x} = [D_e, D_i]\)
  • Función Objetivo (Minimizar Área): \(f(D_e, D_i) = \frac{\pi}{4} (D_e^2 - D_i^2)\)
Restricción Condición Forma Requerida (\(\mathbf{g(\mathbf{x}) \ge 0}\))
1. Esfuerzo \(\frac{1000}{A} \le 100\) \(g_1 = 100 - \frac{1000}{A} \ge 0\)
2. Diámetro Máximo \(D_e \le 150\) \(g_2 = 150 - D_e \ge 0\)
3. Espesor Mínimo \(\frac{D_e - D_i}{2} \ge 0.5\) \(g_3 = D_e - D_i - 1 \ge 0\)
import numpy as np
from scipy.optimize import minimize

# --- Constantes y Parámetros ---
PI = np.pi
P_CARGA = 1000          # Carga axial [N]
SIGMA_MAX = 100         # Esfuerzo máximo permitido [MPa]
D_MAX_PERMITIDO = 150   # Diámetro exterior máximo permitido [mm]
T_MIN = 0.5             # Espesor mínimo requerido [mm]

# 1. Función Objetivo (Minimizar el Área)
def funcion_objetivo_area(x):
    De, Di = x
    return (PI / 4) * (De**2 - Di**2)

# 2. Definición de Restricciones (g(x) >= 0)
# R1: Esfuerzo (100 - 1000/A >= 0)
def g1_esfuerzo(x):
    De, Di = x
    Area = (PI / 4) * (De**2 - Di**2)
    if Area <= 1e-6:
        return -1e10
    return SIGMA_MAX - (P_CARGA / Area)

# R2: Diámetro Máximo (150 - De >= 0)
def g2_diametro_max(x):
    De, _ = x
    return D_MAX_PERMITIDO - De

# R3: Espesor Mínimo (De - Di - 1 >= 0)
def g3_espesor_min(x):
    De, Di = x
    return De - Di - (2 * T_MIN)

# Recopilación de restricciones para SciPy
restricciones = [
    {'type': 'ineq', 'fun': g1_esfuerzo},
    {'type': 'ineq', 'fun': g2_diametro_max},
    {'type': 'ineq', 'fun': g3_espesor_min}
]

# 3. Límites de las Variables (Diámetros positivos)
limites = [(1.0, D_MAX_PERMITIDO), (0.0, D_MAX_PERMITIDO - 1.0)]

# 4. Estimación inicial [De, Di]
x0 = np.array([50.0, 48.0])

# 5. Resolver el problema
resultado_tubo = minimize(
    funcion_objetivo_area, 
    x0, 
    method='SLSQP', 
    bounds=limites,
    constraints=restricciones
)

# 6. Mostrar Resultados (simplificado)
# print("--- Resultados de Optimización de Diseño Estructural ---")
# ... (Los resultados se muestran después de la ejecución del script)

2. Análisis de un Circuito Hidráulico Simple (Optimización 1D)
#

Este problema busca el valor de flujo (\(Q\)) que minimiza el exceso de costo en un circuito hidráulico, modelado por una función cuadrática:

$$\text{Minimizar: } f(Q) = -100 Q^2 - 50 Q + 1400$$

Usaremos el método minimize_scalar para encontrar el mínimo global de la función.

from scipy.optimize import minimize_scalar

# Definir la función para el problema hidráulico
def circuito_func(Q):
    return -100 * Q**2 - 50 * Q + 1400

# Buscamos el mínimo en el intervalo [0, 5]
Q_sol = minimize_scalar(circuito_func, bounds=(0, 5), method='bounded')

# print("\n--- 2. Optimización de Circuito Hidráulico ---")
# print(f"El flujo (Q) que MINIMIZA el valor de la función es: {Q_sol.x:.4f} m^3/s")

3. Ejemplo de Optimización Multivariable: Función de Rosenbrock
#

Este ejemplo clásico de optimización sin restricciones busca el mínimo de la Función de Rosenbrock, conocida por su valle estrecho.

$$\text{Minimizar: } f(x, y) = (1-x)^2 + 100(y-x^2)^2$$

El mínimo global es \((x, y) = (1, 1)\), donde \(f(1, 1) = 0\).

import numpy as np
from scipy.optimize import minimize

# 1. Definir la Función Objetivo (Función de Rosenbrock)
def rosenbrock(x):
    return (1 - x[0])**2 + 100 * (x[1] - x[0]**2)**2

# 2. Estimación inicial (Lejos del óptimo)
x0_rosenbrock = np.array([-1.2, 1.0])

# Resolver el problema de optimización con el método BFGS
resultado_rosenbrock = minimize(
    rosenbrock, 
    x0_rosenbrock, 
    method='BFGS'
)

# print("\n--- 3. Optimización Multivariable (Rosenbrock) ---")
# print(f"Óptimo encontrado en (x, y): {resultado_rosenbrock.x}")

📝 Ejercicios Propuestos
#

A. Optimización Unidimensional (1D)
#

  1. Costo de un Cable Eléctrico: El costo \(C(x)\) de instalar un cable desde una planta en tierra hasta un punto en el mar es modelado por \(C(x) = 200\sqrt{x^2 + 40^2} + 120(100 - x)\), donde \(x\) es la distancia del punto de amarre en tierra.

    • Utiliza el método minimize_scalar con bounds=(0, 100) para encontrar la distancia \(x\) (el punto de amarre) que minimiza el costo total.
    • Verifica tu respuesta utilizando las condiciones de primer y segundo orden (\(C'(x)=0\)).
  2. Eficiencia de Reacción Química: La eficiencia \(E(T)\) de un reactor químico en función de la temperatura \(T\) (en grados Celsius) es \(E(T) = -0.05 T^3 + 2 T^2 - 10 T\).

    • Implementa el Método de la Sección Dorada (usando el pseudocódigo o una función manual) para encontrar la temperatura \(T\) en el intervalo \([5, 30]\) que maximiza la eficiencia (Recuerda que maximizar \(f(x)\) es igual a minimizar \(-f(x)\)).

B. Optimización Multivariable Sin Restricciones
#

  1. Ajuste de Parámetros (Mínimos Cuadrados): Una función \(f(x, y) = 10(x - y)^2 + (y - 5)^2\) representa el error cuadrático entre un modelo y datos observados. Queremos encontrar los parámetros \(x\) y \(y\) que minimizan el error.
    • Utiliza scipy.optimize.minimize con el método BFGS o Nelder-Mead para encontrar el mínimo global.
    • Usa el punto inicial \(\mathbf{x}_0 = \begin{pmatrix} 0 \\ 0 \end{pmatrix}\).

C. Optimización Multivariable Con Restricciones
#

  1. Diseño de un Contenedor Cilíndrico: Se necesita diseñar un tanque cilíndrico abierto en la parte superior. La función objetivo es minimizar el área de superficie (costo de material) \(A(r, h) = \pi r^2 + 2\pi r h\).

    • Restricción de Volumen: El volumen \(V = \pi r^2 h\) debe ser igual a 50 \(\text{m}^3\).
    • Variables: \(r\) (radio) y \(h\) (altura).
    • Tarea: Utiliza scipy.optimize.minimize con el método SLSQP y una restricción de igualdad (type: 'eq') para encontrar las dimensiones óptimas (\(r\) y \(h\)).
    $$\text{Restricción: } g(r, h) = \pi r^2 h - 50 = 0$$
  2. Ampliación del Problema 1 (Tubo Anular): Retoma el Problema 1. Agrega una restricción de costo lineal donde la suma de los diámetros no puede exceder 80 mm.

    • Nueva Restricción: \(D_e + D_i \le 80\).
    • Tarea: Modifica el código del Caso Aplicado 1, añadiendo esta restricción de desigualdad. Observa cómo cambia la solución óptima y el esfuerzo calculado.
Métodos Numéricos - Este artículo es parte de una serie.
Parte 3: Este artículo