• No se han encontrado resultados

Tema 14: Métodos numéricos usando MATLAB.

N/A
N/A
Protected

Academic year: 2021

Share "Tema 14: Métodos numéricos usando MATLAB."

Copied!
34
0
0

Texto completo

(1)

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), ordinarias (ode45, ode23s), resolución de sistemas no lineales (fsolve),

(2)

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.

(3)

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,

>> ezplot('cos(x)-x', [0,1])

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.

(4)

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.

(5)

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:

>> 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:

>> 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

(6)

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)')

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”.

(7)
(8)

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) >> a = fzero(@humps,-0.2,options) fzero retorna

a =

-0.1316

Los puntos terminales del intervalo en cada iteración se listan bajo el

(9)
(10)

[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

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.

(11)

[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

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

(12)

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.

(13)

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)

Minimizando funciones de una función de una variable Ejemplo:

Probar con:

(15)

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.

→ x = 1.0e-004 *

-0.4582 -0.4717, fval = 2.1635e-009

(16)

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

f

(

x

,

y

,

z

)

=

x

2

+

2

.

5

sin(

y

)

z

2

x

2

y

2

(17)
(18)

>> y = [ 0 1 2 ]; z = trapz(y) retorna z = 2

Aproximando una integral

(19)

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.

>> 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 como f = @(x) 1./(x.^3-2*x-5)

(20)

Aproximando una integral

(21)

Resolución numérica de ecuaciones diferenciales ordinarias Encontrar la solución de

en conjunto con la condición inicial

(22)

>> [t, y] = ode23('odefun', [0 pi/2], 1) 2 / 0 , 1 ) 0 ( ), sin( ) (t = − t y = ≤ t

π

y dt d t = 0 y = 1.0000

(23)

Resolución numérica de ecuaciones diferenciales ordinarias

Dado el siguiente diagrama de reacciones:

(24)

Resolución numérica de ecuaciones diferenciales ordinarias

Dado el siguiente diagrama de reacciones:

(25)

Resolución numérica de ecuaciones diferenciales ordinarias Ejemplo (cont.):

denotamos las

concentraciones de cada especie como

[ ]

[

]

[ ]

[ ]

[

]

,

[ ]

,

[ ]

, , , , , 2 7 6 2 5 4 3 2 2 1 O x O x O H x NO x OH x NO x H x = = = = = = = el sistema se reescribe como , , 2 6 2 3 2 5 x x k x k dx x k dt dx − = = , , 2 1 1 2 3 6 3 2 1 1 1 x x k dt dx x x k x x k dt dx − = + − = reescribe como , , 3 6 3 7 3 6 3 2 3 2 6 x x k dt dx x x k x k dt = − = , , 2 1 1 4 3 6 3 2 3 2 2 1 1 3 x x k dt dx x x k x k x x k dt dx = − − = Se plantea el sistema

))

(

,

(

)

(

t

F

t

y

t

x

dt

d

=

x

(

t

)

=

(

x

1

,

x

2

,

x

3

,

x

4

,

x

5

,

x

6

,

x

7

)

)

,

,

,

,

,

,

(

))

(

,

(

3 6 3 3 6 3 2 3 2 2 3 2 2 1 1 3 6 3 2 3 2 2 1 1 2 1 1 3 6 3 2 1 1

+

=

x

x

k

x

x

k

x

k

x

k

x

x

k

x

x

k

x

k

x

x

k

x

x

k

x

x

k

x

x

k

t

x

t

F

el cual se complementa con

las condiciones iniciales

(

0

)

(

4

.

5

10

,

5

.

6

10

,

0

,

0

,

0

,

0

,

0

)

(26)

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

(27)

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]');

(28)

Ejemplo:       =       − + − − − =       = 0 0 ) exp( 2 ) exp( 2 ) , , ( 2 2 1 1 2 1 2 1 2 1 ax x x ax x x f f a x x F >> a = -1; x = [1;1] Resolución de sistemas de ecuaciones no lineales

Función “fsolve”

(29)

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'); 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

(30)

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');

(31)

Ejemplo:

La variable y almacena un conjunto de datos medidos a diferentes valores de tiempo t, según la siguiente tabla t y 0.0 0.82 0.3 0.72 0.8 0.63 1.1 0.60 1.6 0.55 2.3 0.50 La idea es modelar los datos usando una

función exponencial decreciente del tipo

t

e

c

c

t

y

(

)

=

1

+

2x = [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]

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

2 1

+

=

c

c

(32)

Ejemplo (cont.):

Reorganizando la ultima ecuación se tiene

el sistema lineal siguiente:





=

2 1

)

3

.

2

exp(

1

)

6

.

1

exp(

1

)

1

.

1

exp(

1

)

8

.

0

exp(

1

)

3

.

0

exp(

1

)

0

.

0

exp(

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

.

0

1

0

.

1

1

72

.

0

82

.

0

=

1003

.

0

1

2019

.

0

1

3329

.

0

1

4493

.

0

1

7408

.

0

1

A

=

50

.

0

55

.

0

60

.

0

63

.

0

72

.

0

b





=

2 1

c

c

c

b

Ac

=

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.4760 0.3413 c = A \ b

Esto se logra usando la solución de mínimos

(33)

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.): modelo t

e

t

y

(

)

=

0

.

4760

+

0

.

3413

− t = (0:.1:10)'; y = 10+5*exp(-t)+0.3*randn(size(t)) Otros datos para probar

(34)

Ejemplo (cont.):

Referencias

Documento similar

Realice el diagrama de flujo de una función que calcule el valor x y siendo x un número real y siendo y un número entero que puede ser positivo, negativo o cero.. Punto x

La derivada de la función f(x) en el punto x = a es el valor del límite, si existe, de la tasa de variación media cuando el incremento de la variable (h o