• No se han encontrado resultados

CO 2111 Tema 14 Métodos Numéricos Usando MATLAB pdf

N/A
N/A
Protected

Academic year: 2020

Share "CO 2111 Tema 14 Métodos Numéricos Usando MATLAB pdf"

Copied!
34
0
0

Texto completo

(1)Tema 14: Métodos numéricos usando MATLAB. 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), interpolación polinómica (interp1).. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(2) 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 de problemas altamente complejos.. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(3) 14. Métodos numéricos usando MATLAB. 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 >> ezplot('cos(x)-x', [0,1]). Dado que “fzero” busca puntos donde la función cambia de signo, 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 >> ezplot('x^2 + 4*x + 4', [-2,2]). 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. >> fzero('cos(x)-x', [ 0, 1 ]) → retorna. ans = 0.7391. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(4) 14. Métodos numéricos usando MATLAB. Determinación de los ceros de una función de una variable “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. >> [x, fval] = fzero('x-tan(x)',1) → retorna 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]) Prof. Saúl. Buitrago y Oswaldo Jiménez. π/2.

(5) 14. Métodos numéricos usando MATLAB. Determinación de los ceros de una función de una variable Ejemplo: Graficación de la familia de curvas cos(a+x) - (a+x) para diferentes valores de a y cálculo de los ceros de cada curva: Definimos la función de 2 parámetros myfunc. function f = myfun(x,a) f = cos(a+x) - (a+x); end. >> 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); Prof. Saúl. Buitrago y Oswaldo Jiménez.

(6) 14. Métodos numéricos usando MATLAB. Determinación de los ceros de una función de una variable h = inline('1./((x-0.3).^2+0.01) + 1./((x-0.9).^2+0.04)'). 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 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) Prof. Saúl. Buitrago y Oswaldo Jiménez.

(7) 14. Métodos numéricos usando MATLAB. Determinación de los ceros de una función de una variable Ejemplo (cont.):. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(8) 14. Métodos numéricos usando MATLAB. 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) 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.. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(9) 14. Métodos numéricos usando MATLAB. Determinación de los ceros de una función de una variable Ejemplo (cont.):. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(10) 14. Métodos numéricos usando MATLAB. Otras funciones en Matlab [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). q = quad(fun,a,b). 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. 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.. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(11) 14. Métodos numéricos usando MATLAB. Otras funciones en Matlab. [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.. yi = interp1 (x,y,xi,'metodo'). Interpola los puntos dados por x, y para determinar el valor yi para el valor dado xi, usando el algoritmo especificado por ‘metodo’, por ejemplo: linear, cubic, splines, nearest. La opción por defecto es ‘linear’.. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(12) 14. Métodos numéricos usando MATLAB. 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. y = humps(x) es una función con máximos cerca de x = .3 y x = .9. >> ezplot(@humps,0.3,1) Determinar estos máximos. Usar f = @(x) -1*humps(x) Prof. Saúl. Buitrago y Oswaldo Jiménez.

(13) 14. Métodos numéricos usando MATLAB. Minimizando funciones de una función de una variable Ejemplo: >> [x,fval] = fminbnd('sin(x)-cos(x)', -pi, pi) retorna x = -0.7854, fval = -1.4142. >> ezplot('sin(x)-cos(x)', [-pi,pi]) Prof. Saúl. Buitrago y Oswaldo Jiménez.

(14) 14. Métodos numéricos usando MATLAB. Minimizando funciones de una función de una variable Ejemplo:. Probar con: [x,fval] = fminbnd(@humps,0.3,1,optimset(‘Display’,’iter’)) Prof. Saúl. Buitrago y Oswaldo Jiménez.

(15) 14. Métodos numéricos usando MATLAB. 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. Ejemplo: >> [x,fval] = fminsearch('fminfun',[1 1]) → x = 1.0e-004 * -0.4582 -0.4717, fval = 2.1635e-009 fminfun.m. >> ezmesh('x^2+y^2-x*y') Prof. Saúl. Buitrago y Oswaldo Jiménez.

(16) 14. Métodos numéricos usando MATLAB. Minimización de funciones de varias variables Ejemplo: 2 2 2 2 Determinar el mínimo de f ( x, y , z ) = x + 2.5 sin( y ) − z x y cercano al punto (-0.6, 1.2, 0.135).. Se crea la función “three_var” de 3 variables x, y, z.. three_var.m. >> v = [-0.6, -1.2, 0.135]; >> [a,fval] = fminsearch(@three_var,v) a= 0.0000 -1.5708 0.1803 fval = -2.5000 Prof. Saúl. Buitrago y Oswaldo Jiménez.

(17) 14. Métodos numéricos usando MATLAB. Minimización de funciones de varias variables Ejemplo:. f ( x1 , x2 ) = e 1 ( 4 x12 + 2 x22 + 4 x1 x2 + 2 x2 + 1) Determinar el mínimo de cercano al punto (-1, 1). x. >> 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]) x= 0.1290 -0.5323 fval = -0.5689. >> ezmesh('exp(x)*(4*x^2+2*y^2+x*y+2*y)',[-1,1]); Prof. Saúl. Buitrago y Oswaldo Jiménez.

(18) 14. Métodos numéricos usando MATLAB. Aproximando una integral Función trapz Calcula una aproximación de la integral de y, vía el método de trapecios Ejemplo: >> y = [ 0 1 2 ]; z = trapz(y) retorna z = 2 (espaciamiento uniforme de 1). >> x = [0,3,10]; y = [ 0 1 2 ]; z = trapz(x,y) retorna z = 12 (espaciamiento no uniforme). Prof. Saúl. Buitrago y Oswaldo Jiménez.

(19) 14. Métodos numéricos usando MATLAB. Aproximando una integral Función quad 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. Sintaxis: q = quad(fun,a,b,tol) fun: función a integrar, [a,b] intervalo de integración, tol: tolerancia para el error. Ejemplo: >> q = quad('1./(x.^3-2*x-5)', 0, 1); → q = -0.1745 >> ezplot('1./(x.^3-2*x-5)', [0, 1]) Obs. Se puede definir la función como f = @(x) 1./(x.^3-2*x-5) o f = inline('1./(x.^3-2*x-5)') >> ezplot( f, [0, 1]) Prof. Saúl. Buitrago y Oswaldo Jiménez.

(20) 14. Métodos numéricos usando MATLAB. Aproximando una integral Ejemplo: Aproximar las integrales siguientes: 1. ∫ 0. 1 1+ x4. π. sin x ∫0 x dx. dx. = 0.9270. = 1.8519. f = inline('1./sqrt(1+x.^4)') q = quad(f,0,1). f = inline('sin(x)./x') q = quad(f,0,pi) comparar con q = quad(f,realmin,pi). Prof. Saúl. Buitrago y Oswaldo Jiménez.

(21) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias. d y (t ) = f (t , y (t )), a ≤ t ≤ b dt y (t0 ) = y0 en conjunto con la condición inicial Encontrar la solución de. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(22) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias d y (t ) = − sin(t ), y (0) = 1, 0 ≤ t ≤ π / 2 Ejemplo: dt. >> [t, y] = ode23('odefun', [0 pi/2], 1) t= 0 0.1571 0.3142 0.4712 0.6283 0.7854 0.9425 1.0996 1.2566 1.4137 1.5708. y= 1.0000 0.9877 0.9511 0.8910 0.8090 0.7071 0.5878 0.4540 0.3090 0.1564 -0.0000. >> plot(t,y); grid on Prof. Saúl. Buitrago y Oswaldo Jiménez.

(23) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias Ejemplo:. k1 H + NO2 → OH + NO. Dado el siguiente diagrama de reacciones:. k2 OH + OH → H 2O + O k3 O + OH → O2 + H. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(24) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias Ejemplo: Dado el siguiente diagrama de reacciones: k1 H + NO2 → OH + NO k2 OH + OH → H 2O + O k3 O + OH → O2 + H. se tiene el sistema de ecuaciones ordinarias asociado siguiente:. d [H ] = −k1 [H ][NO2 ] + k3 [O ][OH ], dt d [NO2 ] = −k1 [H ][NO2 ], dt d [OH ] = k1 [H ][NO2 ] − k 2 [OH ][OH ] − k3 [O ][OH ], dt d [NO ] = k1 [H ][NO2 ], dt d [HO2 ] = k 2 [OH ][OH ], dt d [O ] = k 2 [OH ][OH ] − k3 [O ][OH ], dt d [O2 ] = k3 [O ][OH ], dt. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(25) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias Ejemplo (cont.): denotamos las concentraciones de cada especie como. el sistema se reescribe como. Se plantea el sistema. x1 = [H ], x2 = [NO2 ], x3 = [OH ], x4 = [NO ], x5 = [H 2O ], x6 = [O ], x7 = [O2 ],. dx1 dt dx2 dt dx3 dt dx4 dt. = −k1 x1 x2 + k3 x6 x3 , = −k1 x1 x2 , = k1 x1 x2 − k 2 x32 − k3 x6 x3 , = k1 x1 x2 ,. dx5 = k 2 x32 , dt dx6 = k 2 x32 − k3 x6 x3 , dt dx7 = k3 x6 x3 , dt. x (t ) = ( x1 , x2 , x3 , x4 , x5 , x6 , x7 )′ d x(t ) = F (t , y (t )) dt F (t , x(t )) = (−k1 x1 x2 + k3 x6 x3 ,− k1 x1 x2 , t ∈ [0,0.01] k1 x1 x2 − k 2 x32 − k3 x6 x3 , k1 x1 x2 , k 2 x32 , k 2 x32 − k3 x6 x3 , k3 x6 x3 )′. el cual se complementa con las condiciones iniciales. x(0) = ( 4.5 ⋅10 −10 ,5.6 ⋅10 −10 ,0,0,0,0,0)′. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(26) 14. Métodos numéricos usando MATLAB. Resolución numérica de ecuaciones diferenciales ordinarias Ejemplo (cont.):. Función que evalúa F (término de la derecha en la EDO). 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]);. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(27) 14. Métodos numéricos usando MATLAB. 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'); >> ylabel('concentracion'); >> legend('[H]', '[NO2]', '[OH]', … '[NO]', '[H2O]', '[O]', '[O2]');. cinetica_driver.m Prof. Saúl. Buitrago y Oswaldo Jiménez.

(28) 14. Métodos numéricos usando MATLAB. 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. Ejemplo:  f1   2 x1 − x2 − exp(ax1 )   0   =   F ( x1 , x2 , a ) =   =  f − x + 2 x − exp( ax ) 2 2   0  2  1 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; % definimos el parámetro a >> x = fsolve(@(x) myfunc(x,a),[-5;-5]) x= 0.5671 0.5671 Prof. Saúl. Buitrago y Oswaldo Jiménez. >> a = -1; x = [1;1] >> myfunc(x,a) ans = 0.6321 0.6321 >> a = -1; x = [1,2;1,2] >> myfunc(x,a) ans = 0.6321 1.8647 0.6321 1.8647.

(29) 14. Métodos numéricos usando MATLAB. 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'); Ejemplo: >> x=[2, 3, 5, 7, 8]; >> y=[3.2, 4.1, 5.8, 6.4, 6.3]; >> z=3.2; >> u=interp1(x,y,z,’linear’). abscisas de puntos (x,y) ordenadas de los puntos valor para interpolar, z puede ser un vector resultado de la interpolación lineal. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(30) 14. Métodos numéricos usando MATLAB. Interpolación en una dimensión para un conjunto de datos 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. 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');. plot(x,y,'o',xi,y1,'r',xi,y2,'b',xi,y3,'k'); legend('\it puntos','linear','cubic','spline',4); grid on;. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(31) 14. Métodos numéricos usando MATLAB. Ejemplo: La variable y almacena un conjunto de datos medidos a diferentes valores de tiempo t, según la siguiente tabla La idea es modelar los datos usando una función exponencial decreciente del tipo. y (t ) = c1 + c2 e − t 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. t 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. 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].  0.82  1  − 0.0         0.72  1  − 0.3   0.63  1  − 0.8    = c1   + c2 exp( )  0.60  1  − 1.1   0.55  1  − 1.6         0.50  1  − 2.3       . donde c1 y c2 los coeficientes incógnitas. Prof. Saúl. Buitrago y Oswaldo Jiménez.

(32) 14. Métodos numéricos usando MATLAB.  0.82  1 exp(−0.0)       0.72  1 exp(−0.3)  Reorganizando la ultima ecuación se tiene  0.63  1 exp(−0.8)  c  el sistema lineal siguiente:  1   =  0.60  1 exp(−1.1)  c2   0.55  1 exp(−1.6)  Es decir, hay que resolver el         sistema lineal sobredeterminado  0.50  1 exp(−2.3)  6×2 siguiente: 1.0   0.82  1      0.72  1 0.7408   0.63  1 0.4493   c1      b= A= Ac = b con c =    0.60  1 0.3329   c2   0.55  1 0.2019       0.50  1 0.1003      Ejemplo (cont.):. 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. Esto se logra usando la solución de mínimos c=A\b cuadrados obtenida usando el operador “\” de Matlab Prof. Saúl. Buitrago y Oswaldo Jiménez. c= 0.4760 0.3413.

(33) 14. Métodos numéricos usando MATLAB. Ejemplo (cont.): 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.. modelo. y (t ) = 0.4760 + 0.3413 e − t. Otros datos para probar el procedimiento. t = (0:.1:10)'; y = 10+5*exp(-t)+0.3*randn(size(t)). Prof. Saúl. Buitrago y Oswaldo Jiménez.

(34) 14. Métodos numéricos usando MATLAB. Ejemplo (cont.):. archivo : ajuste_exp_decreciente.m Prof. Saúl. Buitrago y Oswaldo Jiménez.

(35)

Referencias

Documento similar

 Para recibir todos los números de referencia en un solo correo electrónico, es necesario que las solicitudes estén cumplimentadas y sean todos los datos válidos, incluido el

Las actividades ilegales o criminales, sin embargo, cuando faltan víctimas, no tie- nen por qué rendir siempre forzosamente más beneficios. Más bien sucede lo contra- rio. La amenaza

La determinación molecular es esencial para continuar optimizando el abordaje del cáncer de pulmón, por lo que es necesaria su inclusión en la cartera de servicios del Sistema

(1886-1887) encajarían bien en una antología de textos históricos. Sólo que para él la literatura es la que debe influir en la historia y no a la inversa, pues la verdad litera- ria

entorno algoritmo.

Habiendo organizado un movimiento revolucionario en Valencia a principios de 1929 y persistido en las reuniones conspirativo-constitucionalistas desde entonces —cierto que a aquellas

En este sentido, puede defenderse que, si la Administración está habilitada normativamente para actuar en una determinada materia mediante actuaciones formales, ejerciendo

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de