tema 14: métodos numéricos usando matlab
TRANSCRIPT
Resolución de sistemas lineales (\), ceros de una función de una variable
(fzero), integración (quad), resolución de ecuaciones diferenciales
ordinarias (ode45, ode23s), resolución de sistemas no lineales (fsolve),
Tema 14: Métodos numéricos usando MATLAB.
Prof. Saúl. Buitrago y Oswaldo Jiménez
ordinarias (ode45, ode23s), resolución de sistemas no lineales (fsolve),
interpolación polinómica (interp1).
14. Métodos numéricos usando MATLAB
Los métodos numéricos son en muchos casos la única alternativa posible
para la resolución de frecuentes problemas no lineales muchas veces
intratables analíticamente.
El hecho de que puede accederse a computadoras altamente eficientes a un
costo cada más bajo, permite el uso de métodos numéricos para la resolución
Prof. Saúl. Buitrago y Oswaldo Jiménez
costo cada más bajo, permite el uso de métodos numéricos para la resolución
de problemas altamente complejos.
Determinación de los ceros de una función de una variable
MATLAB dispone de la función “fzero” para intentar determinar un cero de una función “fun” de una variable cerca de un punto “x0” dado.
x = fzero(fun, x0)
>> fzero('cos(x)-x', 0) → retorna ans = 0.7391
Dado que “fzero” busca puntos donde la función cambia de signo, este no funciona para ceros de multiplicidad par. Cuando “fzero” falla,
14. Métodos numéricos usando MATLAB
>> ezplot('cos(x)-x', [0,1])
Prof. Saúl. Buitrago y Oswaldo Jiménez
este no funciona para ceros de multiplicidad par. Cuando “fzero” falla, esta retorna un NaN.
>> fzero('x^2 + 4*x + 4', 0) → retorna ans = NaN
>> fzero('cos(x)-x', [ 0, 1 ]) → retorna ans = 0.7391
Si “x0” es un vector de 2 elementos, tal que fun(x0(1)) y fun(x0(2)) tienen signos opuestos, “fzero” trabaja en el intervalo definido por x0.
>> ezplot('x^2 + 4*x + 4', [-2,2])
Determinación de los ceros de una función de una variable
>> [x, fval] = fzero('x-tan(x)',1)
→ retorna
x = 1.5708
“fzero” adicionalmente puede retornar el valor de la función en la raíz x calculada: [ x, fval ] = fzero(fun, x0).
Esto permite determinar casos atípicos.
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
x = 1.5708
fval = 1.2093e+015
>> [x, fval] = fzero('x-tan(x)', [-1 1])
→ retorna
x = 0 fval = 0
>> ezplot('x-tan(x)', [-pi,pi]) π/2
Graficación de la familia de curvas cos(a+x) - (a+x) para diferentes valores de ay cálculo de los ceros de cada curva:
>> a=0; ezplot(@(x) myfun(x,a),[0,1]);
function f = myfun(x,a)f = cos(a+x) - (a+x);
end
Definimos la función de 2 parámetros myfunc
Determinación de los ceros de una función de una variable
Ejemplo:
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> a=0; ezplot(@(x) myfun(x,a),[0,1]);>> hold on>> x = fzero(@(x) myfun(x,a),1);
>> a=0.1; ezplot(@(x) myfun(x,a),[0,1]);>> x = fzero(@(x) myfun(x,a),1);
>> a=0.2; ezplot(@(x) myfun(x,a),[0,1]);x = fzero(@(x) myfun(x,a),1)
>> grid on>> legend('\it a=0','a=0.1','a=0.2',3);
Determinación de los ceros de una función de una variable
Ejemplo:
>> ezplot(@humps,[-1,2])>> axis([-1,2,-20,100])>> grid
El gráfico de la función “humps” indica que la función es negativa en x = -1 y positiva en x = 1.Por lo tanto se usa [-1 1] como el
h = inline('1./((x-0.3).^2+0.01) + 1./((x-0.9).^2+0.04)')
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Por lo tanto se usa [-1 1] como el intervalo inicial para “fzero”.
El algoritmo iterativo que tiene fzero determina subintervalos más pequeños de [-1 1]. Para cada intervalo, el signo de “humps” cambia en los extremos. A medida que los extremos de los intervalos se acercan, ellos convergen a el cero de “humps”. Para mostrar el progreso en cada iteración, se activa la opción “iter” usando la función “optimset”.
>> options = optimset('Display','iter');seguidamente se invoca “fzero” así:>> a = fzero(@humps,[-1 1],options)
Determinación de los ceros de una función de una variable
Ejemplo (cont.):
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Determinación de los ceros de una función de una variable
Ejemplo (cont.):Supongamos que no se conoce 2 puntos a los cuales la función “humps” cambia de signo. En este caso, se escoge un punto x0 como punto inicial para “fzero”. fzero primero busca un intervalo alrededor de x0 en el cual la función cambia de signo. Si “fzero” encuentra el intervalo, la función procede con el algoritmo para la búsqueda de la solución. Si no es posible determinar este intervalo, “fzero” retorna NaN.
>> a = fzero(@humps,-0.2,options)
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> a = fzero(@humps,-0.2,options)fzero retorna
a =-0.1316
Los puntos terminales del intervalo en cada iteración se listan bajo el encabezado a y b, mientras los valores correspondientes a “humps” en los puntos terminales se listan bajo f(a) y f(b), respectivamente.
Determinación de los ceros de una función de una variable
Ejemplo (cont.):
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
[x,fval] = fminbnd(fun,x1,x2)Trata de encontrar el mínimo local x de la función fun en el intervalo [x1,x2]. El valor mínimo alcanzado retorna en fval.
[x,fval] = fminsearch('fun',x0)Minimización no lineal multidimensional sin restricciones basado en el método de Nelder-Mead, de la función fun con punto inicial x0. Retorna el punto mínimo x y su valor mínimo fval.
z = trapz(y)
Calcula una aproximación de la integral de y vía el método de trapecios (usa espaciamiento uniforme de 1). Para calcular la integral para un espaciamiento uniforme diferente de 1, multiplicamos z por el espaciamiento.
Otras funciones en Matlab
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
q = quad(fun,a,b)Trata de aproximar la integral de la función fun entre a y b con un error de 10-6 usando el método recursivo adaptativo de cuadratura de Simpson.
[t,y] = ode23(odefun,[t0 tfinal],y0)
Integra numéricamente el sistema de ecuaciones diferenciales y’=f(t,y) desde t0 hasta tfinal con la condición inicial y0. odefun(t,y) corresponde a la función f(t,y). Está basado en el método de Runge-Kutta de orden 2 y 3.
[t,y] = ode45(odefun,[t0 tfinal],y0)
Integra numéricamente el sistema de ecuaciones diferenciales y’=f(t,y) desde t0 hasta tfinal con la condición inicial y0. odefun(t,y) corresponde a la función f(t,y). Está basado en el método de Runge-Kutta de orden 4 y 5.
[x,fval] = fsolve(F,x0,…)Intenta resolver un sistema de la forma F(x)=0, donde x es un vector, comenzando en el vector x0. Retorna en x el vector solución y en fval los valores de F en x.
pcg(A,b,tol,maxit)
Trata de resolver el sistema Ax=b, para A una matriz n×n simétrica y definida positiva, b un vector columna de longitud n, tol la tolerancia del método, y maxit el número máximo de iteraciones. pcg usa el método de gradiente conjugado precondicionado.
Interpola los puntos dados por x, y para determinar el valor yi para el valor dado xi, usando el algoritmo especificado por
Otras funciones en Matlab
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
yi = interp1 (x,y,xi,'metodo')para el valor dado xi, usando el algoritmo especificado por ‘metodo’, por ejemplo: linear, cubic, splines, nearest. La opción por defecto es ‘linear’.
Minimizando funciones de una función de una variable
Dada una función de 1 variable codificada en un archivo tipo M, se puede usar la función de MATLAB fminbnd para encontrar su mínimo en un intervalo dado.
Ejemplo: determinar un mínimo de la función “humps” en el intervalo (0.3, 1)>> x = fminbnd(@humps,0.3,1)el cual retorna
x = 0.6370
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
y = humps(x) es una función con máximos cerca dex = .3 y x = .9.
>> ezplot(@humps,0.3,1)
Determinar estos máximos.Usar f = @(x) -1*humps(x)
Ejemplo:
>> [x,fval] = fminbnd('sin(x)-cos(x)', -pi, pi)
retorna
x = -0.7854,
fval = -1.4142
Minimizando funciones de una función de una variable
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> ezplot('sin(x)-cos(x)', [-pi,pi])
Minimizando funciones de una función de una variable
Ejemplo:
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Probar con:[x,fval] = fminbnd(@humps,0.3,1,optimset(‘Display’,’iter’))
Ejemplo:
>> [x,fval] = fminsearch('fminfun',[1 1])
→ x = 1.0e-004 *
Minimización de funciones de varias variables
La función “fminsearch” es similar a “fminbnd”, excepto que esta maneja funciones de varias variables. Se especifica el vector inicial x0, en lugar de un intervalo. “fminsearch” intenta retornar un vector x que corresponde al mínimo local de la función cercano al vector inicial.
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
→ x = 1.0e-004 *-0.4582 -0.4717,
fval = 2.1635e-009
>> ezmesh('x^2+y^2-x*y')
fminfun.m
Minimización de funciones de varias variables
Se crea la función “three_var” de 3 variables x, y, z.
Ejemplo:
Determinar el mínimo de 2222 )sin(5.2),,( yxzyxzyxf −+=cercano al punto (-0.6, 1.2, 0.135).
three_var.m
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> v = [-0.6, -1.2, 0.135];>> [a,fval] = fminsearch(@three_var,v)
a =0.0000 -1.5708 0.1803
fval =-2.5000
Minimización de funciones de varias variables
Ejemplo:
Determinar el mínimo de )12424(),( 22122
2121
1 ++++= xxxxxexxf x
cercano al punto (-1, 1).
x =0.1290 -0.5323
>> objfun=@(x) exp(x(1))*(4*x(1)^2+2*x(2)^2+x(1)*x(2)+2*x(2));>> [x fval] = fminsearch(objfun, [-1 1])
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> ezmesh('exp(x)*(4*x^2+2*y^2+x*y+2*y)',[-1,1]);
0.1290 -0.5323fval =
-0.5689
>> y = [ 0 1 2 ]; z = trapz(y) retorna z = 2
Aproximando una integral
Calcula una aproximación de la integral de y, vía el método de trapecios
Función trapz
Ejemplo:
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
(espaciamiento uniforme de 1)
>> x = [0,3,10]; y = [ 0 1 2 ]; z = trapz(x,y)retorna z = 12
(espaciamiento no uniforme)
Aproximando una integral
Trata de aproximar la integral de la función “fun” entre a y b con un error de 10-6 usando el método recursivo adaptativo de cuadratura de Simpson.
Función quad
Ejemplo:
Sintaxis: q = quad(fun,a,b,tol)
fun: función a integrar, [a,b] intervalo de integración, tol: tolerancia para el error.
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> q = quad('1./(x.^3-2*x-5)', 0, 1);
→ q = -0.1745
>> ezplot('1./(x.^3-2*x-5)', [0, 1])
Ejemplo:
Obs. Se puede definir la función comof = @(x) 1./(x.^3-2*x-5)
o f = inline('1./(x.^3-2*x-5)')
>> ezplot( f, [0, 1])
Aproximando una integral
Ejemplo: Aproximar las integrales siguientes:
∫ +
1
041
1dx
x
= 0.9270
∫π
0
sindx
x
x
= 1.8519
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
f = inline('sin(x)./x')q = quad(f,0,pi)
comparar con q = quad(f,realmin,pi)
f = inline('1./sqrt(1+x.^4)')q = quad(f,0,1)
Resolución numérica de ecuaciones diferenciales ordinarias
Encontrar la solución de
en conjunto con la condición inicial
btatytftydt
d ≤≤= )),(,()(
00 )( yty =
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> [t, y] = ode23('odefun', [0 pi/2], 1)
2/0,1)0(),sin()( π≤≤=−= tyttydt
d
t =0
y =1.0000
Resolución numérica de ecuaciones diferenciales ordinarias
Ejemplo:
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
00.15710.31420.47120.62830.78540.94251.09961.25661.41371.5708
1.00000.98770.95110.89100.80900.70710.58780.45400.30900.1564
-0.0000
>> plot(t,y); grid on
Resolución numérica de ecuaciones diferenciales ordinarias
Dado el siguiente diagrama de reacciones:
HOOHO
OOHOHOH
NOOHNOH
k
k
k
+→+
+→+
+→+
2
2
2
3
2
1Ejemplo:
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Resolución numérica de ecuaciones diferenciales ordinarias
Dado el siguiente diagrama de reacciones:
HOOHO
OOHOHOH
NOOHNOH
k
k
k
+→+
+→+
+→+
2
2
2
3
2
1
Ejemplo:
[ ] [ ][ ] [ ][ ][ ] [ ][ ][ ]
,
,
212
321
NOHkdt
NOd
OHOkNOHkdt
Hd
−=
+−=
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
se tiene el sistema de ecuaciones ordinarias asociado siguiente:
[ ] [ ][ ] [ ][ ] [ ][ ][ ] [ ][ ][ ] [ ][ ][ ] [ ][ ] [ ][ ][ ] [ ][ ],
,
,
,
,
32
32
22
21
3221
OHOkdt
Od
OHOkOHOHkdt
Od
OHOHkdt
HOd
NOHkdt
NOd
OHOkOHOHkNOHkdt
OHddt
=
−=
=
=
−−=
Resolución numérica de ecuaciones diferenciales ordinarias
Ejemplo (cont.):denotamos las concentraciones de cada especie como
[ ] [ ] [ ] [ ][ ] [ ] [ ],,,
,,,,
27625
43221
OxOxOHx
NOxOHxNOxHx
=======
el sistema se reescribe como ,
,
26
232
5
xxkxkdx
xkdt
dx
−=
=,
,
2112
3632111
xxkdt
dx
xxkxxkdt
dx
−=
+−=
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
reescribe como
,
,
3637
363232
6
xxkdt
dx
xxkxkdt
=
−=
,
,
2114
363232211
3
xxkdt
dx
xxkxkxxkdt
dx
=
−−=
Se plantea el sistema
))(,()( tytFtxdt
d =),,,,,,()( 7654321 ′= xxxxxxxtx
),,,,
,,())(,(
363363232
232211363
232211
211363211
′−−−
−+−=
xxkxxkxkxkxxkxxkxkxxk
xxkxxkxxktxtF
el cual se complementa con las condiciones iniciales
)0,0,0,0,0,106.5,105.4()0( 1010 ′⋅⋅= −−x
[ ]01.0,0∈t
Resolución numérica de ecuaciones diferenciales ordinarias
Ejemplo (cont.):
Función que evalúa F (término de la derecha en la EDO)
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
El sistema es rígido (“stiff”). Se usará la función “ode23s” de MATLAB
>> [t,y] = ode23s(@cinetica, [0:0.0001:0.01], [4.5e-10,5.6e-10,0,0,0,0,0]);
Resolución numérica de ecuaciones diferenciales ordinarias
Ejemplo (cont.):
se procede a graficar los valores de las concentraciones en el tiempo>> plot(t,y(:,1),'r', t,y(:,2),'g', t,y(:,3),'b', t,y(:,4),'y', ...
t,y(:,5),'c', t,y(:,6),'m', t,y(:,7),'k');Se agregan los títulos>> title('Cinetica Quimica (EDOs)');>> xlabel('tiempo');
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> ylabel('concentracion');>> legend('[H]', '[NO2]', '[OH]', …
'[NO]', '[H2O]', '[O]', '[O2]');
cinetica_driver.m
Ejemplo:
=
−+−−−
=
=
0
0
)exp(2
)exp(2),,(
221
121
2
121 axxx
axxx
f
faxxF
>> a = -1; x = [1;1]
Resolución de sistemas de ecuaciones no lineales
Función “fsolve”
Intenta resolver un sistema de la forma F(x)=0, donde x es un vector, comenzando en el vector x0. Retorna en x el vector solución y en fval los valores de F en x.
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
>> a = -1; % definimos el parámetro a>> x = fsolve(@(x) myfunc(x,a),[-5;-5])x =
0.56710.5671
−+−
0)exp(2 2212 axxxf
function F = myfunc(x,a)F = [ 2*x(1,:) - x(2,:) - exp(a*x(1,:)); ...
-x(1,:) + 2*x(2,:) - exp(a*x(2,:))];end
>> a = -1; x = [1;1]>> myfunc(x,a)ans =
0.63210.6321
>> a = -1; x = [1,2;1,2]>> myfunc(x,a)ans =
0.6321 1.86470.6321 1.8647
Interpolación en una dimensión para un conjunto de datos
Función “interp1”
Interpola los puntos dados por los vectores x, y, con el propósito de determinar el valor yi para un valor dado xi, usando el algoritmo especificado por “metodo”, por ejemplo:
linear, cubic, splines, nearest. La opción por defecto es ‘linear’.
Sintaxis: yi = interp1(x, y, xi, ‘metodo');
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Sintaxis: yi = interp1(x, y, xi, ‘metodo');
>> x=[2, 3, 5, 7, 8]; abscisas de puntos (x,y)>> y=[3.2, 4.1, 5.8, 6.4, 6.3]; ordenadas de los puntos>> z=3.2; valor para interpolar, z puede ser un vector>> u=interp1(x,y,z,’linear’) resultado de la interpolación lineal
Ejemplo:
Ejemplo:
A partir de algunos datos de la función seno, usar la función de MATLAB interp1 para generar la curva de la función seno.
plot(x,y,'o',xi,y1,'r',xi,y2,'b',xi,y3,'k');legend('\it puntos','linear','cubic','spline',4);grid on;
x = 0:10; y = sin(x); xi = 0:.25:10;y1 = interp1(x,y,xi, 'linear'); y2 = interp1(x,y,xi, ‘cubic'); y3 = interp1(x,y,xi, ‘spline');
Interpolación en una dimensión para un conjunto de datos
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
Ejemplo:
La variable y almacena un conjunto de datos medidos a diferentes valores de tiempo t, según la siguiente tabla
t y0.0 0.820.3 0.720.8 0.631.1 0.601.6 0.552.3 0.50
La idea es modelar los datos usando una función exponencial decreciente del tipo
teccty −+= 21)(x = [0.0, 0.3, 0.8, 1.1, 1.6, 2.3];y = [0.82 ,0.72 ,0.63 ,0.60 ,0.55 ,0.50]
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
donde c1 y c2 los coeficientes incógnitas.
)
3.2
6.1
1.1
8.0
3.0
0.0
exp(
1
1
1
1
1
1
50.0
55.0
60.0
63.0
72.0
82.0
21
−−−−−−
+
=
cc
Esta ecuación dice que el vector y debe aproximarse por una combinación lineal de otros 2 vectores de la misma longitud que y, el primero conteniendo puros 1, y el segundo con componentes e-t
Ejemplo (cont.):
Reorganizando la ultima ecuación se tiene el sistema lineal siguiente:
−−−−−−
=
2
1
)3.2exp(1
)6.1exp(1
)1.1exp(1
)8.0exp(1
)3.0exp(1
)0.0exp(1
50.0
55.0
60.0
63.0
72.0
82.0
c
c
Es decir, hay que resolver el sistema lineal sobredeterminado 6×2 siguiente:
7408.01
0.11
72.0
82.0
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
=
1003.01
2019.01
3329.01
4493.01
7408.01
A
=
50.0
55.0
60.0
63.0
72.0
b
=
2
1
c
ccbAc = con
La solución se obtiene como los valores de c1 y c2 que minimizan la suma de los cuadrados de la desviación de los datos del modelo.
c =0.47600.3413
c = A \ b �Esto se logra usando la solución de mínimos cuadrados obtenida usando el operador “\” de Matlab
Ahora hay que escribir un procedimiento en Matlab que lea los datos, los vectores t e y de un archivo, calcule los coeficientes c1 y c2 del modelo, calcule el error relativo entre los datos y el modelo, y grafique los datos y el modelo.
Ejemplo (cont.):
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménez
modelotety −+= 3413.04760.0)(
t = (0:.1:10)';y = 10+5*exp(-t)+0.3*randn(size(t))
Otros datos para probar el procedimiento
Ejemplo (cont.):
14. Métodos numéricos usando MATLAB
Prof. Saúl. Buitrago y Oswaldo Jiménezarchivo : ajuste_exp_decreciente.m