|
|
## 1. 📄 Resumen: Ajuste No Lineal de Señales por Mínimos Cuadrados en Python
|
|
|
|
|
|
|
|
|
|
|
|
Este código realiza un ajuste por mínimos cuadrados no lineales para estimar los parámetros de una señal compuesta por una suma de funciones coseno. El modelo de señal es:
|
|
|
|
|
|
|
|
|
|
|
|
$$
|
|
|
|
|
|
x(t) = \sum_{i=0}^{N} \alpha_i \cdot \cos(\omega_i t + \phi_i)
|
|
|
|
|
|
$$
|
|
|
|
|
|
|
|
|
|
|
|
donde los parámetros $\alpha_i$ (amplitud), $\omega_i$ (frecuencia) y $\phi_i$ (fase) son desconocidos y deben ser estimados.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 1.1. 🔧 Objetivo
|
|
|
|
|
|
|
|
|
|
|
|
A partir de una muestra de la señal $x(t)$, recuperar los parámetros de cada coseno usando mínimos cuadrados no lineales con `scipy.optimize.curve_fit`.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 1.2. 🧱 Estructura del Código
|
|
|
|
|
|
|
|
|
|
|
|
**1. Definición de parámetros verdaderos**
|
|
|
|
|
|
|
|
|
|
|
|
Se definen las amplitudes, frecuencias y fases de la señal original que queremos simular.
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
alpha_true = [2.0, 1.5, 1.0]
|
|
|
|
|
|
omega_true = [1.5, 3.2, 5.0]
|
|
|
|
|
|
phi_true = [0.1, -0.5, 1.2]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**2. Generación de la malla temporal**
|
|
|
|
|
|
|
|
|
|
|
|
Se crean $n$ muestras en el intervalo $[0, 2\pi]$.
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
t = np.linspace(0, 2*np.pi, n_muestras)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**3. Generación de la señal**
|
|
|
|
|
|
|
|
|
|
|
|
Se suma cada coseno con sus parámetros reales:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
x(t) = \sum \alpha_i \cdot \cos(\omega_i t + \phi_i)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**4. Modelo para ajuste**
|
|
|
|
|
|
|
|
|
|
|
|
Se define una función que toma un vector plano de parámetros y devuelve la señal modelada:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
def modelo(t, *params):
|
|
|
|
|
|
for i in range(0, len(params), 3):
|
|
|
|
|
|
a = params[i]
|
|
|
|
|
|
w = params[i+1]
|
|
|
|
|
|
p = params[i+2]
|
|
|
|
|
|
x += a * np.cos(w * t + p)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**5. Inicialización de parámetros**
|
|
|
|
|
|
|
|
|
|
|
|
Se eligen valores iniciales para los parámetros del modelo.
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
params_iniciales = [1.0, 2.0, 0.0, 1.0, 3.0, 0.0, 1.0, 4.0, 0.0]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**6. Ajuste con `curve_fit`**
|
|
|
|
|
|
|
|
|
|
|
|
Se aplica el método de mínimos cuadrados no lineales:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
popt, _ = curve_fit(modelo, t, x, p0=params_iniciales)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**7. Extracción de parámetros estimados**
|
|
|
|
|
|
|
|
|
|
|
|
Los parámetros ajustados se separan en amplitudes, frecuencias y fases:
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
alpha_est = popt[::3]
|
|
|
|
|
|
omega_est = popt[1::3]
|
|
|
|
|
|
phi_est = popt[2::3]
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**8. Comparación de resultados**
|
|
|
|
|
|
|
|
|
|
|
|
Se imprime la comparación entre parámetros reales y estimados.
|
|
|
|
|
|
|
|
|
|
|
|
**9. Gráfico de validación**
|
|
|
|
|
|
|
|
|
|
|
|
Se grafican las señales original y ajustada para visualizar la calidad del ajuste.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 1.3. ✅ Conclusiones
|
|
|
|
|
|
|
|
|
|
|
|
* Este método permite ajustar señales compuestas por cosenos sin necesidad de conocer las frecuencias de antemano.
|
|
|
|
|
|
* La clave es usar un modelo no lineal y una buena inicialización.
|
|
|
|
|
|
* El ajuste es preciso si los datos no tienen mucho ruido y las condiciones iniciales son razonables.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 1.4. 📚 Requisitos
|
|
|
|
|
|
|
|
|
|
|
|
Este código requiere las siguientes bibliotecas de Python:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
pip install numpy scipy matplotlib
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
¿Querés que este resumen lo exporte directamente a un archivo `.docx` listo para descargar? |