f = @(x)(1 + (x.^3 - 4*x) + log(1+x.^2));
xs = linspace(-3.5,2.5,100);
ys = f(xs);
plot(xs,ys)
Curiosidad: Mostramos en qué raíz termina el método de Newton (cuando termina), dependiendo del punto de inicio.
Combinando métodos como los anteriores, se obtienen métodos prácticos como el de Brent.
python
: Lee la documentación oficial de scipy sobre optimización de funciones escalares: busca el método recomendado.
matlab
: Lee la documentación oficial de matlab sobre optimización de funciones escalares: averigüa qué metodo numérico usa.
En la documentación oficial de matlab para fzero
, averigüa:
- Si f(a) y f(b) tienen signos opuestos $\Rightarrow$ f tiene una raíz en el intervalo [a,b]
Tiene un equivalente teórico en varias variables, pero no tiene aplicación práctica general.
- Si $g:[a,b]\rightarrow [a,b]$ $\Rightarrow$ g tiene un punto fijo en el intervalo [a,b]
En varias variables, teorema del punto fijo de Brouwer:
- Si $g:[a,b]\rightarrow [a,b]$ y $|g'(x)|\leq k < 1$, $\Rightarrow$
- $g$ tiene un único punto fijo $x^*$ en [a,b]
- $x_{n+1}=g(x_n)$ converge a $x^*$, para cualquier punto inicial $x_0$.
- $|x_n - x^*| < \frac{k^n}{1-k}|x_1-x_0|$
Cierto, casi sin cambios, en varias variables:
Si $g:\mathbb{R}^n\rightarrow\mathbb{R}^n$, tenemos, por el teorema fundamental del cálculo, para $y=x+h$:
$$ g(y)-g(x)=\left(\int _{0}^{1}Dg(x+th)\cdot h\,dt\right)$$luego si $\Vert D g(x) \Vert \leq k$ para todo $x$, tenemos que
$$ \begin{split} \Vert g(y) - g(x)\Vert &=\left\Vert\int _{0}^{1}Dg(x+th)\cdot h\,dt\right\Vert\\ &\leq \int _{0}^{1} \Vert Dg(x+th)\cdot h\Vert\,dt\\ &\leq k\int _{0}^{1} \Vert h\Vert\,dt \leq k \Vert y-x\Vert \end{split} $$Por tanto, si $\Vert D g(x)\Vert\leq k < 1$, aplicar g reduce distancias.
Nota: No hemos hablado aún de las normas matriciales, $\Vert D g(x) \Vert$, pero veremos más adelante que para una norma adecuada, $\Vert D g(x) \Vert \leq k\Rightarrow \Vert D g(x)\cdot v \Vert \leq k\Vert v\Vert$.
Una aplicación tal que $\Vert g(y)-g(x)\Vert \leq k\Vert y- x\Vert$, para $k<1$, se llama contractiva, y la imagen de un conjunto se reduce hasta que converge a un punto.
Definimos la sucesión $x_{n+1} = g(x_n)$, comenzando con un punto cualquiera $x_0$:
$$\Vert x_{n+1} - x_n\Vert = \Vert g(x_n) - g(x_{n-1})\Vert \leq k \Vert x_n-x_{n-1}\Vert $$y del mismo modo que en una variable:
$$\Vert x_n - x^*\Vert < k^n\Vert x_0-x^\ast\Vert$$o tb:
$$\Vert x_n - x^*\Vert < \frac{k^n}{1-k}\Vert x_1-x_0\Vert$$Los problemas de encontrar raíces y de minimizar (o maximizar) funciones son parecidos: $$f:\mathbb{R}^n\rightarrow\mathbb{R}^n$$ $$h:\mathbb{R}^n\rightarrow\mathbb{R}$$
En funciones convexas, minimizar f y encontrar raíces de f' es equivalente (incluso "si f no es diferenciable").
Sin embargo, hay una diferencia importante:
Una función continua siempre alcanza su valor máximo y un mínimo en un conjunto "cerrado" y acotado.
También conocido como Teorema de los valores extremos
Problemas:
Si una función tiene muchos mínimos locales, un algoritmo de búsqueda de mínimos puede "quedarse atascado" en un mínimo local, y no alcanzar el mínimo absoluto...
f = @(x)((x - 2) .* x .* (x + 2) .* (x + 3));
xs = linspace(-3.5,2.5,100);
ys = f(xs);
plot(xs,ys)
res1 = fminbnd(f, -3, 0);
res2 = fminbnd(f, 0, 2);
minima = [res1, res2];
f = @(x)((x - 2) .* x .* (x + 2) .* (x + 3));
xs = linspace(-3.5,2.5,100);
ys = f(xs);
hold on
plot(xs,ys)
plot(minima, f(minima), 'og')
hold off
fminbnd
y fminsearch
en la documentación oficial de matlab
.fminsearch(f, -4)
fminsearch(f, -2)
def f(x):
return (x - 2) * x * (x + 2)* (x+3)*(1+(x-1)**2)
res1 = fminsearch(f, -4);
print(res1.x, res1.fun)
res2 = fminbnd(f, -3, -1);
print(res2.x, res2.fun)
xs = np.linspace(-3.5,2.5,100)
ys = f(xs)
fig, ax = plt.subplots(figsize=(9,5))
ax.plot(xs,ys)
ax.plot([res1.x, res2.x], [res1.fun, res2.fun], 'go')
ax.set_ybound(-50,50)
plt.show()
- El método de Newton busca raíces de f(x), iterando $$x_{n+1}=x_{n} - \frac{f(x_n)}{f'(x_{n})}$$
El método de Newton en varias variables usa esta iteración: $$x_{n+1}=x_{n} - \left(\nabla f(x_n)\right)^{-1}f(x_n)$$
Para encontrar raíces de funciones $f:\mathbb{R}^n\rightarrow\mathbb{R}^n$ hay muchos métodos (matlab):
scipy.optimize.root
(scipy.optimize)
method : str, optional
Type of solver. Should be one of
‘hybr’ ‘lm’ ‘broyden1’ ‘broyden2’ ‘anderson’ ‘linearmixing’ ‘diagbroyden’ ‘excitingmixing’ ‘krylov’ ‘df-sane’
Para encontrar raíces de funciones $f:\mathbb{R}^n\rightarrow\mathbb{R}^n$ hay muchos métodos:
Algunas ideas importantes:
Para acercarte a un mínimo de $f$, avanza un poco en la dirección $-\nabla f(x)$
(el objetivo es maximizar la función)
Combina varias ideas de inspiración biológica:
scipy.optimize.minimize
'Nelder-Mead' 'Powell' 'CG' 'BFGS' 'Newton-CG' 'L-BFGS-B' 'TNC' 'COBYLA' 'SLSQP' 'trust-constr' 'dogleg' 'trust-ncg' 'trust-krylov' 'trust-exact'
¡No es necesario que lo programéis!
Queremos determinar el flujo de agua a través de una tubería.
Encuentra el factor de fricción de Darcy que resuelve la ecuación de Colebrook - White
$${\displaystyle {\frac {1}{\sqrt {f}}}=-2\log \left({\frac {\varepsilon }{3.7D_{\mathrm {h} }}}+{\frac {2.51}{\mathrm {Re} {\sqrt {f}}}}\right)} $$con los siguientes datos:
8e-2
2e5
2e-4
Encuentra una solución, si la hay, del sistema de ecuaciones: $$ \begin{array}{rr} x^2 - y^2 &= 2\\ xy&=2 \end{array} $$ Prueba al menos un par de métodos distintos. ¿Encuentras siempre la misma solución?
Busca un mínimo global de la función de Rosenbrock de dos variables:
$$f(x,y)=(a-x)^{2}+b(y-x^{2})^{2}$$para a=1, b=100, usando al menos dos métodos distintos.
Consideramos la aplicación $F(x,y) = \left(\frac{y}{2}, \frac{-x}{2} + 10 \right)$. El profesor te garantiza que es contractiva con constante $k=\frac{1}{2}$ (es la composición de una rotación, una homotecia de factor 1/2 y un desplazamiento).
Repite el ejercicio anterior para $$F(x,y) = \left(\cos\left(\frac{y}{2}\right)+5, \frac{x+y}{3} + 1 \right)$$