# Perspectiva de un ignorante - preguntas a la IA - Non Linear Model Predictive Control

## ¿Qué problema se resuelve en un solver de MPC no lineal?

  
Un **solver de MPC no lineal (Nonlinear Model Predictive Control, NMPC)** resuelve un **problema de optimización no lineal restringido**, cuyo objetivo es encontrar la **secuencia óptima de acciones de control** que lleven al sistema a un comportamiento deseado, respetando tanto la **dinámica no lineal del sistema** como las **restricciones impuestas** (por ejemplo, límites en estados o entradas).

---

### 💡 Problema que resuelve el solver NMPC:

Dado un modelo dinámico no lineal:

<span class="katex">$\\dot{x}(t) = f(x(t), u(t))$</span>

o en forma discreta:

<span class="katex">$x\_{k+1} = f(x\_k, u\_k)$</span>

y una **función de costo** a minimizar del tipo:

<span class="katex">$J = \\sum\_{k=0}^{N-1} \\ell(x\_k, u\_k) + \\ell\_f(x\_N)$</span>

sujeta a:

- Dinámica del sistema: <span class="katex">$x\_{k+1} = f(x\_k, u\_k)$</span>
- Restricciones en los estados: <span class="katex">$x\_k \\in \\mathcal{X}$</span>
- Restricciones en las entradas: <span class="katex">$u\_k \\in \\mathcal{U}$</span>

El solver NMPC resuelve el siguiente problema de optimización en cada instante de control:

---

### ✅ **Problema de optimización no lineal restringido (NLP):**

<span class="katex">$\\min\_{u\_0, u\_1, ..., u\_{N-1}} \\quad \\sum\_{k=0}^{N-1} \\ell(x\_k, u\_k) + \\ell\_f(x\_N)$</span>

sujeto a:

- <span class="katex">$x\_{k+1} = f(x\_k, u\_k), \\quad \\forall k = 0,...,N-1$</span>
- <span class="katex">$x\_k \\in \\mathcal{X}, \\quad u\_k \\in \\mathcal{U}$</span>
- <span class="katex">$x\_0 = x\_{\\text{actual}}$</span> (condición inicial)

---

### 🧩 ¿Qué hace el solver exactamente?

1. **Predice** la evolución futura del sistema usando el modelo no lineal.
2. **Optimiza** la secuencia de controles futuros en un horizonte <span class="katex">NN</span>.
3. **Respeta** todas las restricciones dinámicas y físicas.
4. **Ejecuta solo el primer control** de la secuencia óptima.
5. **Repite el proceso** en el siguiente instante (receding horizon).

---

### Ejemplo de aplicación:

Control de un robot con dinámica compleja, como un dron o un vehículo autónomo, donde las ecuaciones de movimiento son no lineales, y se deben evitar obstáculos y respetar límites de velocidad o aceleración.

---

¿Quieres que te muestre un ejemplo numérico o código con CasADi o ACADO?

## ¿Y ese problema de optimización cómo se plantea y se resuelve matematicamente?

Excelente pregunta. Vamos a profundizar paso a paso en **cómo se plantea y se resuelve matemáticamente** el problema de optimización que enfrenta un **solver de MPC no lineal (NMPC)**.

---

## ✅ 1. **Planteamiento del problema matemático (NLP)**

El problema se plantea como un **problema de optimización no lineal restringido (NLP)**, donde se desea encontrar la secuencia de controles <span class="katex">{u0,u1,...,uN−1}\\{u\_0, u\_1, ..., u\_{N-1}\\}</span> que minimiza un costo sujeto a restricciones dinámicas y físicas.

### 📌 Formulación estándar (discreta):

<span class="katex">min⁡{xk,uk}J=∑k=0N−1ℓ(xk,uk)+ℓf(xN)\\min\_{\\{x\_k, u\_k\\}} \\quad J = \\sum\_{k=0}^{N-1} \\ell(x\_k, u\_k) + \\ell\_f(x\_N)</span>

sujeto a:

1. **Dinámica del sistema** (no lineal):
    
    <span class="katex">xk+1=f(xk,uk),∀k=0,...,N−1x\_{k+1} = f(x\_k, u\_k), \\quad \\forall k = 0, ..., N-1</span>
2. **Restricciones de estado y control**:
    
    <span class="katex">xk∈X⊂Rn,uk∈U⊂Rmx\_k \\in \\mathcal{X} \\subset \\mathbb{R}^n, \\quad u\_k \\in \\mathcal{U} \\subset \\mathbb{R}^m</span>
3. **Condición inicial**:
    
    <span class="katex">x0=xmedidox\_0 = x\_{\\text{medido}}</span>

---

## ✅ 2. **Discretización del sistema dinámico**

El modelo continuo <span class="katex">x˙(t)=f(x(t),u(t))\\dot{x}(t) = f(x(t), u(t))</span> se **discretiza** en el tiempo usando algún método de integración:

- **Euler explícito**:
    
    <span class="katex">xk+1=xk+Δt⋅f(xk,uk)x\_{k+1} = x\_k + \\Delta t \\cdot f(x\_k, u\_k)</span>
- **Runge-Kutta** (RK4 es muy común en NMPC):
    
    <span class="katex">xk+1=Φ(xk,uk)x\_{k+1} = \\Phi(x\_k, u\_k)</span>

Esto convierte el modelo en un conjunto de **igualdades algebraicas no lineales**.

---

## ✅ 3. **Reescritura como NLP (con todas las variables)**

Una vez discretizado, se agrupan todas las variables:

- Variables de decisión:
    
    <span class="katex">z={x1,...,xN,u0,...,uN−1}z = \\{x\_1, ..., x\_N, u\_0, ..., u\_{N-1}\\}</span>
- Función objetivo:
    
    <span class="katex">J(z)=∑k=0N−1ℓ(xk,uk)+ℓf(xN)J(z) = \\sum\_{k=0}^{N-1} \\ell(x\_k, u\_k) + \\ell\_f(x\_N)</span>
- Restricciones de igualdad:
    
    <span class="katex">h(z)=xk+1−f(xk,uk)=0h(z) = x\_{k+1} - f(x\_k, u\_k) = 0</span>
- Restricciones de desigualdad:
    
    <span class="katex">g(z)≤0(por ejemplo, lıˊmites en xk,uk)g(z) \\leq 0 \\quad \\text{(por ejemplo, límites en } x\_k, u\_k \\text{)}</span>

Entonces, el problema se convierte en:

<span class="katex">min⁡zJ(z)sujeto ah(z)=0g(z)≤0\\begin{aligned} \\min\_{z} &amp; \\quad J(z) \\\\ \\text{sujeto a} &amp; \\quad h(z) = 0 \\\\ &amp; \\quad g(z) \\leq 0 \\end{aligned}</span>

---

## ✅ 4. **Resolución del problema (técnicas)**

Este NLP se resuelve con métodos de **optimización numérica no lineal**, como:

### 🔹 Métodos de punto interior (IPM)

- Utilizados por **IPOPT**, **CasADi**, **FORCES Pro**.
- Introducen penalizaciones logarítmicas para desigualdades.
- Convierten el problema a un problema KKT (Karush-Kuhn-Tucker).
- Iterativamente resuelven sistemas lineales para actualizar <span class="katex">zz</span>.

### 🔹 SQP (Sequential Quadratic Programming)

- Aproximan el NLP por una **QP (programación cuadrática)** en cada iteración.
- Usan linealización de restricciones y cuadratización del costo.
- ACADO y algunas implementaciones en C usan este método.

---

## ✅ 5. **Condiciones de optimalidad (KKT)**

Para el óptimo <span class="katex">z∗z^\*</span>, se deben cumplir las **condiciones KKT**:

1. **Gradiente nulo del lagrangiano**:
    
    <span class="katex">∇zL(z∗,λ∗,μ∗)=0\\nabla\_z \\mathcal{L}(z^\*, \\lambda^\*, \\mu^\*) = 0</span>
2. **Restricciones primales**:
    
    <span class="katex">h(z∗)=0,g(z∗)≤0h(z^\*) = 0, \\quad g(z^\*) \\leq 0</span>
3. **Multiplicadores duales**:
    
    <span class="katex">μ∗≥0,μi∗gi(z∗)=0(complementariedad)\\mu^\* \\geq 0, \\quad \\mu\_i^\* g\_i(z^\*) = 0 \\quad \\text{(complementariedad)}</span>

---

## 🔁 Receding Horizon (horizonte móvil)

Una vez resuelto el problema:

1. Se **aplica solo el primer control óptimo** <span class="katex">u0∗u\_0^\*</span>.
2. Se **mide** el nuevo estado del sistema.
3. Se **replantea y resuelve** el problema nuevamente con el nuevo <span class="katex">x0x\_0</span>.

---

## 🎓 Ejemplo ilustrativo (simplificado)

Supongamos un sistema no lineal:

<span class="katex">xk+1=xk+Δt(xk2+uk)x\_{k+1} = x\_k + \\Delta t (x\_k^2 + u\_k)</span>

Costo:

<span class="katex">J=∑k=0N−1(xk2+uk2)J = \\sum\_{k=0}^{N-1} (x\_k^2 + u\_k^2)</span>

Restricciones:

- <span class="katex">−1≤uk≤1-1 \\leq u\_k \\leq 1</span>
- <span class="katex">x0=1x\_0 = 1</span>

Esto se discretiza, se plantea como NLP, y se resuelve numéricamente (por ejemplo, usando IPOPT o CasADi).

---

¿Te gustaría que resolviera este ejemplo con código para verlo en práctica? ¿O prefieres explorar un sistema realista como el péndulo invertido o un robot móvil?

<article class="text-token-text-primary w-full" data-scroll-anchor="false" data-testid="conversation-turn-5" dir="auto" id="bkmrk-%C2%BFque-son-igualdades-"><div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">  
</div></div><div class="whitespace-pre-wrap">  
</div><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***¿Que son igualdades algebraicas no lineales y como se resuelven?¿Que metodos numericos existen?***</div><div class="whitespace-pre-wrap">  
</div></div></div></div></div></div></div></div></div>Muy buena pregunta. Vamos por partes para entender **qué son las igualdades algebraicas no lineales**, **cómo se resuelven**, y **qué métodos numéricos existen**.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">---

</div></div></div></div></div></div></div></div></div>## ✅ ¿Qué son igualdades algebraicas no lineales?

Son **ecuaciones en las que intervienen variables relacionadas a través de funciones no lineales**, y **no contienen derivadas** (a diferencia de ecuaciones diferenciales).

### 🔹 Definición formal:

Una **igualdad algebraica no lineal** tiene la forma:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">f(x1,x2,...,xn)=0f(x\_1, x\_2, ..., x\_n) = 0</span>***</div></div></div></div></div></div></div></div></div>donde:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- <span class="katex">ff</span> es **no lineal** (ej. contiene términos como <span class="katex">x2,sin⁡(x),ex,x⋅yx^2, \\sin(x), e^x, x \\cdot y</span>, etc.)
- <span class="katex">x1,...,xnx\_1, ..., x\_n</span> son las variables desconocidas a resolver.

---

</div></div></div></div></div></div></div></div></div>### 📌 Ejemplos:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- <span class="katex">x2+y2−1=0x^2 + y^2 - 1 = 0</span> → ecuación de un círculo.
- <span class="katex">sin⁡(x)+x⋅y−3=0\\sin(x) + x \\cdot y - 3 = 0</span>
- <span class="katex">ex+ln⁡(y)−5=0e^x + \\ln(y) - 5 = 0</span>

---

</div></div></div></div></div></div></div></div></div>En contextos como el **NMPC**, estas igualdades suelen representar:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- Las **restricciones de dinámica discretizada**:  
    Ej: <span class="katex">xk+1=f(xk,uk)⇒xk+1−f(xk,uk)=0x\_{k+1} = f(x\_k, u\_k) \\Rightarrow x\_{k+1} - f(x\_k, u\_k) = 0</span>

---

</div></div></div></div></div></div></div></div></div>## ✅ ¿Cómo se resuelven?

El objetivo es **encontrar los valores de las variables** que satisfacen simultáneamente todas las ecuaciones:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">Encontrar x∈Rn tal que fi(x)=0,i=1,...,m\\text{Encontrar } x \\in \\mathbb{R}^n \\text{ tal que } f\_i(x) = 0, \\quad i = 1, ..., m</span>***</div></div></div></div></div></div></div></div></div>Esto se llama un **sistema de ecuaciones no lineales**.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">---

</div></div></div></div></div></div></div></div></div>## ✅ Métodos numéricos para resolverlas

Dado que la mayoría de estas ecuaciones **no tienen solución analítica**, usamos métodos numéricos **iterativos**.

### 🔷 1. **Método de Newton-Raphson**

Es el más clásico y usado.

#### Idea básica (1 variable):

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">xk+1=xk−f(xk)f′(xk)x\_{k+1} = x\_k - \\frac{f(x\_k)}{f'(x\_k)}</span>***</div></div></div></div></div></div></div></div></div>#### Multivariable (sistema no lineal):

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">xk+1=xk−Jf(xk)−1f(xk)x\_{k+1} = x\_k - J\_f(x\_k)^{-1} f(x\_k)</span>***- <span class="katex">Jf(xk)J\_f(x\_k)</span>: jacobiano de <span class="katex">ff</span> evaluado en <span class="katex">xkx\_k</span>
- Se resuelve un sistema lineal en cada iteración:
    
    <span class="katex">Jf(xk)⋅δx=−f(xk),xk+1=xk+δxJ\_f(x\_k) \\cdot \\delta x = -f(x\_k), \\quad x\_{k+1} = x\_k + \\delta x</span>

</div></div></div></div></div></div></div></div></div>🔧 **Ventajas**:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- Rápida convergencia **(cuadrática)** cerca de la solución.

</div></div></div></div></div></div></div></div></div>⚠️ **Desventajas**:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- Necesita una buena estimación inicial.
- Necesita el **jacobiano** (matriz de derivadas), que puede ser costoso de calcular.

---

</div></div></div></div></div></div></div></div></div>### 🔷 2. **Métodos de Newton modificados o cuasi-Newton**

Usan una aproximación del Jacobiano:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- **Broyden's method**
- **DFP, BFGS (usados en optimización)**

</div></div></div></div></div></div></div></div></div>Estos reducen el coste computacional cuando <span class="katex">JfJ\_f</span> es difícil de obtener.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">---

</div></div></div></div></div></div></div></div></div>### 🔷 3. **Métodos de punto fijo (fixed-point iteration)**

Si puedes reescribir la ecuación como:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">x=g(x)x = g(x)</span>***</div></div></div></div></div></div></div></div></div>entonces iteras:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">xk+1=g(xk)x\_{k+1} = g(x\_k)</span>***</div></div></div></div></div></div></div></div></div>✅ Simple, pero **lento** y depende de que <span class="katex">gg</span> sea contractivo.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">---

</div></div></div></div></div></div></div></div></div>### 🔷 4. **Métodos de homotopía o continuación**

Resuelven una familia de problemas que conecta uno fácil con el problema original.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">H(x,λ)=(1−λ)⋅f0(x)+λ⋅f(x)H(x, \\lambda) = (1 - \\lambda) \\cdot f\_0(x) + \\lambda \\cdot f(x)</span>***</div></div></div></div></div></div></div></div></div>Se empieza con <span class="katex">λ=0\\lambda = 0</span>, y se avanza hasta <span class="katex">λ=1\\lambda = 1</span>.

✅ Útiles cuando el sistema tiene múltiples soluciones o es difícil de resolver directamente.

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">---

</div></div></div></div></div></div></div></div></div>## ✅ En práctica: ¿cómo se aplican en MPC?

En MPC no lineal:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">- Las **igualdades no lineales** que surgen de la dinámica se **incluyen como restricciones** en el problema de optimización.
- El **solver del NLP** (como IPOPT, SNOPT, etc.) internamente resuelve estos sistemas con **Newton-Raphson** o variantes (ej. SQP o IPM), cada vez que necesita evaluar la factibilidad o buscar una dirección de descenso.

---

</div></div></div></div></div></div></div></div></div>## 🎓 Ejemplo breve (Newton en 2 variables)

Queremos resolver:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">***<span class="katex">{x2+y−37=0x−y2−5=0\\begin{cases} x^2 + y - 37 = 0 \\\\ x - y^2 - 5 = 0 \\end{cases}</span>***</div></div></div></div></div></div></div></div></div>Pasos:

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">1. Definir <span class="katex">f(x,y)=\[x2+y−37x−y2−5\]f(x, y) = \\begin{bmatrix} x^2 + y - 37 \\\\ x - y^2 - 5 \\end{bmatrix}</span>
2. Calcular su Jacobiano:
    
    <span class="katex">J=\[2x11−2y\]J = \\begin{bmatrix} 2x &amp; 1 \\\\ 1 &amp; -2y \\end{bmatrix}</span>
3. Iterar usando Newton hasta que <span class="katex">∥f(x,y)∥\\|f(x, y)\\|</span> sea pequeño.

---

</div></div></div></div></div></div></div></div></div>¿Te gustaría ver esto resuelto paso a paso con código (Python/NumPy) o con una herramienta como **CasADi** para usarlo en MPC?

<div class="text-base my-auto mx-auto py-5 [--thread-content-margin:--spacing(4)] @[37rem]:[--thread-content-margin:--spacing(6)] @[72rem]:[--thread-content-margin:--spacing(16)] px-(--thread-content-margin)"><div class="[--thread-content-max-width:32rem] @[34rem]:[--thread-content-max-width:40rem] @[64rem]:[--thread-content-max-width:48rem] mx-auto flex max-w-(--thread-content-max-width) flex-1 text-base gap-4 md:gap-5 lg:gap-6 group/turn-messages focus-visible:outline-hidden" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 text-start break-words whitespace-normal [.text-message+&]:mt-5" data-message-author-role="user" data-message-id="49153956-ffcb-4447-a9ab-2fe799b0a6ac" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden items-end rtl:items-start"><div class="relative max-w-[var(--user-chat-width,70%)] bg-token-message-surface rounded-3xl px-5 py-2.5"><div class="whitespace-pre-wrap">  
</div><div class="whitespace-pre-wrap">  
</div></div></div></div></div><div class="flex justify-end">  
</div></div></div></div></div></article>