modelos matemÁticos de dinÁmica econÓmica · ejercicio. hallar la norma de las filas de una...

63
1 MODELOS MATEMÁTICOS DE DINÁMICA ECONÓMICA INTRODUCCIÓN A LOS SISTEMAS DINÁMICOS CON MATLAB. GUÍA DE PRÁCTICAS Última modificación: 27 de Enero de 2005 Fernando Fernández Rodríguez Departamento de Métodos Cuantitativos en Economía y Gestión Universidad de Las Palmas de Gran Canaria

Upload: others

Post on 12-Jan-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

1

MODELOS MATEMÁTICOS DE

DINÁMICA ECONÓMICA

INTRODUCCIÓN A LOS SISTEMAS DINÁMICOS CON MATLAB.

GUÍA DE PRÁCTICAS Última modificación: 27 de Enero de 2005

Fernando Fernández Rodríguez Departamento de Métodos Cuantitativos en Economía y Gestión

Universidad de Las Palmas de Gran Canaria

2

CONTENIDO 1 El entorno MATLAB

1.1 Introducción de matrices en MATLAB 1.2 Algebra matricial 1.3 Matrices especiales 1.4 Rescate de elementos a partir de una matriz 1.5 Resolución de sistemas lineales

2 Funciones en MATLAB

2.1 Funciones matemáticas elementales 2.2 Funciones estadísticas elementales 2.3 La función plot 2.4 Diversas funciones de cálculo numérico (roots, poly, polyval,

fval, polyfit,quad) 3 Creación de archivos . m

3.1 Archivos “script” 3.2 Archivos “function”

4 Algoritmos 4.1 El bucle for 4.2 El bucle while 4.3 La bifurcación if

5 Sistemas dinámicos en Economía

5.1 Ecuaciones en diferencias y sistemas 5.2 Ecuaciones diferenciales 5.3 Aplicaciones a la Economía

3

INTRODUCCION DE MATRICES EN MATLAB

Dada una matriz

=

987654321

A puede ser escrita en MATLAB de cualquiera de las formas

alternativas: >>A=[1 2 3;4 5 6 ;7 8 9 ] o bien >>A=[1 , 2 , 3;4 , 5 , 6 ;7 , 8 , 9] Obsérvese que con la introducción de punto y coma al final de una variable matricial , esta quedará guardada en la memoria de trabajo pero no aparecerá explícitamente en la pantalla. Ejercicio. Escribir las siguientes matrices:

−−

=342212310

B ,

=

4231

C , ( )1932 −=D ,

−=

eE π

3.

El número π se escribe en MATLAB simplemente como pi, mientras que el número e se representa por medio de exp(1). OPERACIONES ELEMENTALES CON MATRICES Una vez introducidas las matrices en el espacio de trabajo es posible realizar operaciones elementales entre ellas, siempre que se verifiquen las condiciones de dimensionalidad adecuadas. A continuación mostramos las principales operaciones entre matrices. Suma de matrices : >> A+B Producto de matrices : >> A*B Potencia n-ésima : >> A^n Sumar un escalar a todos los elementos de una matriz: >> A+2 Multiplicar un escalar por los elementos de una matriz: >> k*A Transpuesta: >> A’ Determinante : >> det(A)

4

Inversa : >> inv(A) División izquierda : >> A\ B; (similar a inv(A)*B) División derecha: >> B/A; (similar a B*inv(A)) Producto, elemento a elemento, de dos matrices: >> A . * B Cociente, elemento a elemento, de dos matrices: >> A . / B Potencia n-ésima de los elementos de una matriz: >> A . ^ n Potencia de los elementos de una matriz a los exponentes dados por otra: >> A . ^B Cálculo de la dimensión de una matriz : >> size(A) Cálculo de la longitud de un vector : >> length(V) Valores propios o autovalores: >> eig(A) Vectores propios o autovectores : >> [ V , D ]=eig(A) Esta última instrucción da lugar a una matriz diagonal D formada por los autovalores y a una matriz V cuyas columnas son los autovectores, de modo que se verifica DVXV =−1 . Diagonal de una matriz : >> diag(A) proporciona un vector columna cuyos elementos son los de la diagonal principal de una matriz A. Diagonal k-ésima de una matriz : >> diag(A,k) proporciona un vector columna formado por los elementos de la k-ésima diagonal de la matriz A (k es un entero positivo o negativo). Matrices diagonales : >>diag(v) proporciona una matriz cuadrada, diagonal, cuya diagonal principal son los elementos del vector v. Para obtener una matriz cuadrada cuya diagonal coincida con la de determinada matriz A emplearemos la instrucción >> diag(diag(A)) Cuando v es un vector y k un número entero, >> diag(v,k) es la matriz cuadrada de orden n+abs(k) con los elementos de v en la k-ésima diagonal.

5

Matriz triangular inferior : >> tril(A) Elementos debajo de la k_ésima diagonal inferior de la matriz A : >> tril(A,k) Matriz triangular superior : >> triu(A) Elementos encima de la k_ésima diagonal superior de A : >> triu(A,k) Obsérvese que a partir de las operaciones elementales anteriores es posible calcular otros conjuntos elementos más complejos de una matriz. Por ejemplo, la norma de las columnas de una matriz A puede calcularse como >> sqrt( sum ( A.^2 ) ) Ejercicio. Hallar la norma de las filas de una matriz A haciendo uso de las operaciones anteriores. Ejercicio. Calcular las matrices que se especifican a continuación a partir de la A, B, C, D.

A=

−122013

B=

−3122

C=

103112

D= ( )12

a) 2DB b) TBC c) TDCB)(

d) )det( TAC

e) 1)( −CAT Ejercicio. Dadas las matrices A y B calcular las matrices que se especifican en los diferentes apartados

−=

021410231

A

−=

112021113

B

a) )det(,, 12 −++ BABABA TT

b) 2)(2 BAA ++

c) 11 3 −− ++ BIA . d) Autovalores de A+B e) Autovectores de B f) Matriz cuyos elementos se obtienen multiplicando los de A y B, elemento a elemento, es decir,

( ) ( )ijijij bac = . g) Matriz cuyos elementos se obtienen dividiendo los de A y B, elemento a elemento, es decir,

( ) ( )ijijij bac /= .

6

h) Matriz cuyos elementos se obtienen multiplicando los cuadrados de los elementos A y por los cuadrados de los elementos de B, elemento a elemento, es decir ( ) ( )22

ijijij bac = . i) Matriz cuyos elementos se obtienen elevando los elementos de A a los exponentes de la matriz B,

elemento a elemento, es decir ( ) ( )ijbijij ac = .

OPERACIONES ELEMENTALES CON VECTORES Si a y b son vectores de la misma dimensión pueden definirse, de forma específica, las siguientes operaciones entre vectores:

).......(*. 2211 nnbabababa = (Producto elemento a elemento)

nnbabababa +++= .......'* 2211 (Producto escalar)

( )

=

=

nnn

n

n

n baba

bababb

a

aba

..............

............'*

1

111

1

1

(Producto de Kroneker)

MATRICES ESPECIALES El MATLAB es capaz de generar numerosas matrices especiales con gran facilidad, como se muestra a continuación: Números enteros entre 1 y 20: >> X1=1:20 Números enteros entre 1 y 200: >> X2=(1:200) Números entre 1 y 5 tomados de 0.1 en 0.1: >> X3=(1:0.1:5) Matriz 3x4 de números aleatorios gaussianos: >> X5=randn(3,4) Matriz 2x10 de números aleatorios distribuidos uniformemente: >> X6=rand(2,10) Matriz identidad 4x4: >> X7=eye(4) Matriz de ceros 3x3: >> X8=zeros(3) Matriz de ceros de orden 3x4: >> X9=zeros(3,4) Matriz de unos de orden 4x4: >> X10=ones(4)

7

Matriz de unos de orden 4x2: >> X11=ones(4,2) Igualmente, siendo A la matriz definida inicialmente, MATLAB es capaz de generar otras matrices del tamaño de la matriz A en cualquiera de las siguientes formas: Matriz de números aleatorios gaussianos de las dimensiones de A: >> X11=randn(size(A)) Matriz de números aleatorios uniformes de las dimensiones de A: >> X12=rand(size(A)) Matriz identidad de las dimensiones de A: >> X12=eye(size(A)) Matriz de unos de las dimensiones de A: >> X13=ones(size(A)) Matriz de ceros de las dimensiones de A: >> X14=zeros(size(A)) Ejemplo Basándonos en el generador randn de números aleatorios Gaussianos N(0,1), es posible muestras aleatorias de cualquier distribución normal. Por ejemplo, para generar números aleatorios muestreados de una normal 2( , )N µ σ bastará con realizar sucesivamente la operación *randnµ σ+ , es decir, >> mu+sigma*randn donde mu µ= y sigma σ= . Ejercicio. Escribir una sucesión de 1000 números en los intervalos que se citan a continuación. Empleando la función hist(x) , que veremos posteriormente, hallar sus correspondientes histogramas.

a) Numeros aleatorios uniformemente distribuidos entre –2 y 2. b) Números aleatorios uniformemente distribuidos entre 0 y 5. c) Números aleatorios gaussianos con media 2 y varianza 3. d) Números aleatorios gaussianos con media 1 y varianza 0.1.

Ejemplo Veamos una ilustración del teorema central del límite: Si tipificamos una suma de distribuciones idénticas obtenemos, asintóticamente, una distribución normal. Para ello procedamos a sumar distribuciones uniformes en el intervalo [0,1], tipifiquemos, y hallemos su histograma. RESCATE DE DETERMINADOS ELEMENTOS A PARTIR DE UNA MATRIZ Dada una determinada matriz )( ijaA = es posible obtener, de forma sistemática, numerosos subconjuntos de sus elementos : >> ),( jiA proporciona el elemento (i,j) de la matriz A. >> :),(iA proporciona la fila i. >> )(:, jA proporciona la columna j.

8

Si X es un determinado vector e I un conjunto de índices, )(IX proporciona un nuevo vector que contiene los elementos del vector X correspondientes a los índices I. Por ejemplo, sea X=randn(1,30) y sea I=(5:2:20); )(IX proporciona los elementos de X comprendidos entre el 5 y el 20 tomados de dos en dos. Igualmente pueden considerarse subconjuntos de elementos de un vector X que verifiquen alguna relación de desigualdad: >> );1( <== XXY da lugar a un vector Y formado con los elementos menores o iguales que uno del vector X. Si deseamos el conjunto de índices de los elementos de un vector que verifican determinada relación acudiremos al comando: >> I=find(X<1) que proporciona el conjunto de índices donde la variable X toma valores menores que 1. También es posible eliminar los elementos de un vector que cumplan determinada relación: >> [ ];)0( =<XX hace desaparecer los elementos negativos del vector X. Ejercicio:

1. Dado el vector X=rand(20,1), comprobar que find ( X < 2 ) = X ( X < 2 ). 2. Hallar el conjunto de índices donde X<0.

Igualmente se pueden crear variables binarias que toman los valores 0 ó 1 según sea verdadera o falsa determinada relación. >> Y=X<4; Crea un vector Y que toma el valor 1 donde el correspondiente elemento de X sea menos que 4 y 0 en caso contrario. Por último, es posible cambiar el valor de determinados elementos de una matriz. Si, por ejemplo, tenemos que

=

987654321

A

y hacemos >> A(1,3)=0.5 el elemento A(1,3) de la matriz tomará el valor 0.5. Si hacemos >> A(:,3)=[2 3 –1]' sustituiremos la tercera columna de la matriz A por (2 3 –1)'. Análogamente >> A(1,:)=[1 0 1] sustituye la primera fila de la matriz A por (1 0 1).

9

RESOLUCION DE SISTEMA LINEALES DE ECUACIONES Un sistema de ecuaciones lineales puede ser resuelto con MATLAB de varias formas.

Si escribimos el sistema en la forma matricial →→

= bXA , donde A es una matriz nxn y →→

byX son vectores columna n-dimensionales, la solución puede obtenerse de dos formas alternativas:

i) Empleando la matriz inversa de A:

>> →

−→

= bAX 1 . ii) Empleando un método más eficiente, de eliminación gaussiana, por medio de la

división izquierda:

>> →→

= bAX \ . Por ejemplo, para resolver el sistema 2x-y=1 x+y=2

, es decir, 2 1 11 1 2

xy

− =

procederemos de la forma, >> inv ( [2 -1;1 1] ) * [1;2] ans = 1 , 1

Si escribimos el sistema en la forma matricial →→

= bAX , donde A es una matriz nxn y →→

byX representan ahora vectores fila n-dimensionales, la solución puede obtenerse de dos formas alternativas:

iii) Empleando la matriz inversa de A:

>> 1−→→

= AbX . iv) Empleando un método más eficiente, de eliminación gaussiana, por medio de la

división derecha :

>> AbX /→→

= . Ejercicio. Hallar las soluciones de los siguientes conjuntos de ecuaciones lineales. Describir cada conjunto

empleando las dos formas de notación matricial →→

= bXA y →→

= bAX . Comparar los resultados obtenidos según empleemos en el método de resolución la matriz inversa, la división izquierda o la división derecha.

a) x+3y=1 2x-y=3

b)

3x+2y-z=10 -x+3y+2z=5x-y-z=-1

10

c)

x+y+z+t=4 2x-y+t=2x-2y-z-t=2x-2y-3z+t=-3

SAVE y LOAD: GUARDAR Y RESCATAR RESULTADOS La instrucción save, junto con sus diversas variantes, permite salvar los resultados obtenidos. Si A es una matriz, save A guarda, en el directorio desde donde ha sido llamado el MATLAB, una matriz denominada A.mat. Se pueden guardar igualmente diversas matrices previamente generadas:

save datos A B C;

guarda las matrices A, B y C en un archivo denominado datos.mat. Es posible, igualmente, guardar ficheros en formato ascii:

save dastos.dat A -ascii -double

de modo que la matriz A será guardada en formato ascii con el nombre de datos.dat, en doble densidad. La instrucción load permite cargar al espacio de trabajo los ficheros previamente guardados en un determinado directorio, siempre que dicho directorio se encuentre abierto:

load a y load datos permitirán recuperar los archivos a.mat y datos.dat, respectivamente.

11

ALGUNAS OPERACIONES DE INTERFACE CON EL ESPACIO DE TRABAJO La instrucción who ofrece un listado de las variables definidas en el espacio de trabajo. La instrucción whos ofrece un listado de las variables definidas en el espacio de trabajo que incluye información adicional sobre su tamaño y otras características. La instrucción clear borra todas las variables previamente creadas en el espacio de trabajo. El formato numérico que MATLAB muestra por defecto es un formato de cuatro cifras decimales. Existen otros formatos numéricos disponibles. El más importante es un formato numérico de dieciséis cifras decimales que es el número de cifras con el que MATLAB realiza las operaciones de cálculo. Para acceder a este formato es suficiente con teclear en la pantalla format long. Para regresar al formato habitual debe teclearse format short. La instrucción clc limpia la pantalla. FUNCIONES MATEMATICAS ELEMENTALES El MATLAB contiene numerosas funciones matemáticas elementales, algunas de las cuales se numeran a continuación. Trigonométricas sin : seno. asin : arco seno. cos : coseno. acos : arco coseno. tan : tangente. atan : arco tangente. Exponenciales exp : exponencial . log : logaritmo natural. log10 : logaritmo decimal. sqrt : raiz cuadrada. Complejas abs : valor absoluto. angle : ángulo de fase. conj : complejo conjugado. imag : parte imaginaria. real : parte real.

12

Numéricas fix : parte entera. sign : función signo. La característica fundamental de cada una de estas funciones es que no solamente son aplicables a un número real sino a un vector o a una matriz. En tal caso la función actuará sobre cada uno de los elementos de la matriz o del vector.

Por ejemplo, sea

=

333231

232221

131211

aaaaaaaaa

X . Si calculamos el seno de la matriz X, el resultado será:

=

)()()()()()()()()(

)(

333231

232221

131211

asinasinasinasinasinasinasinasinasin

Xsin .

Ejercicio. Realizar las siguientes operaciones entre números reales.

a) 2

351π

++e

b) 5223−+

e

c) )23ln(

4)8/sen(

231

15

+++π

πe

d) )14(log)4/3sen(

2

10

2

+++

ππ e

e) 52

))23ln(

)5/tg()cos((πππ

++

f) 3 2 114

120ππ

π +−

FUNCIONES ESTADISTICAS ELEMENTALES El MATLAB dispone de diversas funciones estadísticas elementales. Si éstas se aplican a un vector X darán lugar al correspondiente estadístico sobre sus observaciones. Si X es una matriz estas funciones actúan sobre cada una de las columnas proporcionando un vector de resultados, que corresponde al valor del estadístico aplicado sobre cada uno de los vectores columna de dicha matriz. Media aritmética: >> mean(X) Desviación estándar: >> std(X)

13

Mediana: >> median(X) Producto: >> prod(X) Suma: >> sum(X) Máximo: >> max(X) Mínimo: >> min(X) Otras funciones estadísticas importantes son cov y corrcoef que tienen una forma similar de actuación. Si X es un vector >> cov(X) da lugar a la varianza del vector X. Si X es una matriz >> cov(X) da lugar a la matriz de covarianzas entre las columnas. Es inmediato que >> diag(cov(X)) proporciona un vector de varianzas de cada columna, mientras que >> sqrt( diag ( cov ( X ) ) ) proporciona un vector de desviaciones standard entra las columnas. Cuando X e Y son vectores columna >> cov(X,Y) es igual a >> cov([X Y]). Resulta, también, de importancia el operador primeras diferencias diff. Para un vector X

diff(X) = [X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)].

Para una matriz X diff(X) es la matriz de diferencia entre las columnas

diff(X) =[X (2 : n , : ) – X ( 1: n-1 , : ) ] Por último, >> diff(X,n) es el operador de diferencias n-ésimas. La confección de histogramas se realiza mediante la instrucción

14

>> hist(X) donde se supone que X es un vector numérico que representa una determinada muestra. Si queremos precisar el número k de intervalos de clase que se consideran en el histograma, utilizaremos la instrucción >> hist(X,k). Para reordenar, de manera ascendente, los elementos de un determinado vector X emplearemos la función >> sort(X) Esta función permite igualmente recuperar el orden en que estaban situados inicialmente los elementos en un determinado conjunto de índices I, de la forma: >> [ Y , I ]=sort(X) Ejercicio. Para comprobar el funcionamiento de sort, realizar el siguiente conjunto de instrucciones: >> X = rand(1:10); >> sort(X'); >> [ Y , I ] = sort(X'); >> [ Y’ I’ X' ] Obsérvese que Y=X( I ). LA FUNCIÓN PLOT Dados dos vectores X e Y de la misma longitud, >> plot(X,Y) dibuja el vector X frente al vector Y. Cuando X es un vector >> plot(X) dibuja los elementos de X frente al conjunto de sus índices. Cuando X es una matriz >> plot(X) dibuja cada una de sus columnas frente al conjunto de sus índices. Por defecto la función plot dibuja uniendo los puntos de la gráfica en forma poligonal. Existen otras posibilidades como las siguientes: >> plot(X , ' . ' ) que dibuja solamente los puntos de la gráfica. >> plot(X , ' + ' ) que dibuja cruces en lugar de puntos en la gráfica. >> plot(X , 'r - - ' ) que dibuja una gráfica en rojo con trazo discontinuo. MATLAB permite dibujar simultáneamente varios vectores de la misma longitud pero con trazos y color diferenciados. Para ello hay que especificar en cada caso el conjunto de índices, el vector y el formato de color y unión entre puntos, tal como se muestra en el siguiente ejemplo: >> X=rand(1,50); Y=rand(1,50);

15

>> plot( (1,50) , X, ' r - ' , (1,50) , Y, ' b - - ' )

Si escribimos previamente a una instrucción plot la instrucción grid la gráfica quedará dibujada dentro de una rejilla.

Ejercicio. Mírese en el sistema de ayudas del MATLAB las diferentes posibilidades de la función plot: >> help plot Ejemplo.

Dibujar las gráficas de las funciones )1sen(,)sen(,)sen(,)sen(x

yx

xyxxyxy ==== .

MATLAB dibuja la gráfica de una función obteniendo los valores que toma sobre un determinado conjunto de índices. El primer paso, por lo tanto, para dibujar una gráfica es definir el conjunto de índices. Para estas funciones trigonométricas resulta adecuado definir el siguiente conjunto de índices: >> a = ( 1 : 200 ) ; b = a / pi ; las funciones anteriormente señaladas pueden ahora dibujarse simplemente con >> plot ( sin ( b) ) >> plot (b.*sin ( b) ) >> plot (sin(b). / b) >> plot (sin(1. / b) ) Ejemplo. Dibujar la gráfica del polinomio 123 23 −+−= xxxy . >> x=-10:0.1:10; >> y=x.^3-3*x.^2+2*x-1; >>plot(x,y); Ejercicios

• Dibujar la gráfica de las funciones 2

21xy

x=

−, e

2

21xy

x=

+ en el intervalo [ 10,10]− .

• Dibujar la gráfica de la función ))(sen()(sen( xtanxtany −= en el intervalo [ ]ππ ,− .

• Dibujar conjuntamente las gráficas de las funciones 123 23 −+−= xxxy e )(xseny = . MATLAB posee una función inteligente de representación gráfica denominada fplot.m. fplot tiene como inputs el nombre de la función en una cadena de caracteres y el rango en que se desea pintar la función. Por ejemplo fplot ( ' sin ' , [0 pi] ) . Otro ejemplo más sofisticado sería. >> f='2*exp(-x). * sin (x)'; >> fplot ( f , [0 8] ) >> title ('seno') , xlabel( 'eje x' ) , ylabel( 'eje y' ) Ejercicio

16

Dibujar la curva de crecimiento logístico 0

0( )

0 0

( )( ) t t

axx tbx a bx e− −=

+ −, que corresponde a las

soluciones de la ecuación diferencial 2dx ax bxdt

= − , para diversos valores de los parámetros

0 0, , ,a b x t . Dibujar conjuntamente varias soluciones. DIVERSAS FUNCIONES DE CALCULO NUMÉRICO MATLAB posee numerosas funciones específicas que permiten realizar complejas operaciones de cálculo numérico. A continuación se muestran algunas de ellas. roots : Permite calcular las raíces de un polinomio. roots(X) es un vector fila formado por las raíces de un polinomio cuyos coeficientes son los elementos del vector X. Por ejemplo, para calcular las raíces del polinomio 523 23 +−+ xxx , formaremos previamente el vector >> X=[1 3 –2 5]; las raíces se obtendrán de la forma: >> roots(X) = -3.8552 0.4276 + 1.0555i 0.4276 - 1.0555i Ejercicio Hallar la tasa interna de rendimientos (TIR) de una inversión (un bono) cuyo precio es de 110 € y cuyo valor facial es de 100 € y tiene tres periodos hasta la amortización, produciendo unos pagos de cupón de 10€ durante sus tres años de vida. El precio de dicho bono viene dado por

2 31 (1 ) (1 )c c c Ap

r r r+

= + ++ + +

La tasa interna de rendimiento se obtendrá resolviendo la ecuación

3 2(1 ) (1 ) (1 ) 0p r c r c r c A+ − + − + − − = es decir, 3 2110(1 ) 10(1 ) 10(1 ) 110 0r r r+ − + − + − = >> roots ( [ 110 -10 -10 -100 ] ) obtiene las raices 1.0322 , -0.4707 + 0.8119i , -0.4707 - 0.8119i , luego 1 1.0322 , 0.0322r r+ = = . fzero : Busca las raíces de cualquier función de una variable en torno a un determinado punto x0. Su sintaxis es fzero( 'función' , x0 ) .

17

Ejemplos Hallar el cero de la función )sen(xy = más cercano al punto x=2. fzero( ' sin ', 2 )=3.1416 Cuando más adelante aprendamos a construir funciones arbitrarias en MATLAB podremos, por ejemplo,

hallar un cero de la función 604.0)9.0(

101.0)3.0(

122 −+−

++−

=xx

y próximo al valor 1.4.

>> x_cero=fzero ( ' funcion ' , 1.4 ); >>x_cero=1.2995 >>y_cero=3.5527e-15 % valor obtenido cuando evaluemos el valor de la función en la raíz. poly : Proporciona el polinomio característico de una matriz cuadrada. Si A es una matriz nxn poly(A) es un vector fila de dimensión n+1 cuyos elementos son los coeficientes del polinomio característico. Ejemplo.

Sea la matriz cuadrada

−=

519704241

A . Calcularemos su polinomio característico por aplicación

de la instrucción poly, resultando : >> poly(A) = 1 –6 14 -187

Por tanto, el polinomio característico será 187146 23 −+− λλλ . Cuando V es un vector, poly(V) es un vector cuyos elementos son los coeficientes del polinomio que tiene por raíces los elementos de V. Ejemplo: Construir el polinomio que tiene por raíces los números 2 , 5, 3 , 8 . Para ello formamos el vector >> V=[ 2 5 3 8 ]; El polinomio buscado será 24027811118 234 +−+− λλλλ , según se obtiene mediante la instrucción >> poly(V)= 1 -18 111 -278 240

Ejercicio. Encontrar las raíces del polinomio cuyos coeficientes son los números naturales comprendidos entre 1 y 20. Ejercicio.

Dada la matriz

−=

519704241

A calcular sus autovalores utilizando las instrucciones poly y roots.

eig:

18

Calcula los valores propios o autovalores de una matriz A.

Sea la matriz

−−−=

211432112

A

>> eig(A) = 3 1 -1 Igualmente es posible obtener los vectores propios o autovectores guardando las salidas de eig(A) en dos nuevas matrices D y V de la forma : >> [ V , D ]=eig(A) . Esta instrucción da lugar a una matriz diagonal D formada por los autovalores y a una matriz V cuyas columnas son los autovectores, de modo que se verifica DVXV =−1 . Concretamente: >> [ V , D ]=eig(A)

>>

−−

−−=

7071.00000.02673.07071.07071.08018.0

0000.07071.05345.0V

>>

−=

100010003

D

Obsérvese que roots ( poly ( A ) ) = eig (A) . polyval: Permite evaluar el valor numérico de un polinomio. Si V es un vector que contiene los coeficientes de un polinomio la función polyval(V, s) proporciona el valor numérico de dicho polinomio en el número s. Ejemplo. Dado el polinomio 124)( 23 +−−= xxxxp , calcular el valor numérico de dicho polinomio en 5. Para ello formamos el vector >> V=[ 1 -4 -2 1]; el valor numérico p(5) se calcula simplemente como >> polyval(V,5) = 16 Si S es una matriz o vector el polinomio se evalúa en todos los números que forman S. Ejercicio.

Consideremos una matriz cuadrada A, como por ejemplo

−=

519704241

A . Calcular su polinomio

característico y hacer uso de la instrucción polyval para verificar el teorema de Cayley-Hamilton con la matriz A: Toda matriz es raíz de su polinomio característico.

19

feval : Evalúa el valor numérico de una función en un punto x0 . Su sintaxis es la siguiente >>feval ( ' función ' , x0 ) Ejemplo. >> feval ( ' sin ', pi / 2 ) = 1 Observación: En general, x0 puede ser un vector multidimensional. Polyfit : Permite realizar ajuste polinomial a una nube de puntos por el método de los mínimos cuadráticos. Dados dos vectores numéricos x e y de la misma longitud >> polyfit(x,y,n) encuentra los coeficientes de un polinomio p(x) de grado n que ajusta los datos en el sentido de los mínimos cuadrados. Ejemplo. Vamos a construir, primeramente, una nube de puntos (x,y) perturbando aleatoriamente la función polinómica 2xy = : >> x=0:0.1:3; >> y=x.^2 + 2*randn ( size ( x ) ) ; >> plot ( x , y ) Podemos ahora realizar diversos ajustes polinomiales, como por ejemplo: >> polyfit(x,y,1) = 31 -165.3333 que daría lugar a la resta de regresión 1 31 165.3y x= − . Permitiendo dibujar, simultáneamente, la nube de puntos y la recta de regresión mediante >> plot ( x ,y ,’ . ’ , x , y1 , ’ - ‘ ) De forma análoga, >> polyfit(x,y,3) = 0 -0.0001 0.0738 2.8073 daría lugar al polinomio de regresión 8073.20738.00001.0 2 ++−= xxy Ejercicio. Consideremos la nube de puntos (x,y) dada por >> x=-2 : 0.1 : 2 mientras que las abscisas vienen dadas por ttttt xxxy ε+++−= 12 23 , siendo tε una familia de variables aleatorias independientes y N( 0 , 1 ) para cada instante t.

1. Hallar los ajustes polinómicos de grados 1, 2 y 3 en el sentido de los mínimos cuadrados. 2. Calcular, en cada caso, el error cuadrático medio que se produce en cada uno de los ajustes

realizados.

20

3. Dibujar en la misma gráfica la nuve de puntos y los ajustes polinomiales del apartado 1. quad: Permite realizar integración numérica (el término quad viene de cuadratura, sinónimo con que se designa a la integral). >> quad( 'nombre_de_función' , a , b ) calcula el valor aproximado de la integral de la función f(x) entre a y b. Para realizar el cálculo aproximado MATLAB realiza una partición adecuada del intervalo de integración [a,b] y utiliza la regla de Simpson. Dentro de las comillas ' ' debemos colocar una función previamente definida por el MATLAB o que nosotros creemos en un fichero .m, como veremos más adelante. Si deseamos emplear como procedimiento de integración aproximada el método de Newton-Cotes, MATLAB dispone del comando >> quad8( 'nombre_de_función ', a , b ) . Ejemplo.

Calcular ∫3

0

)sen( dxx .

Como el MATLAB dispone de una función sin que representa la función seno, la integral se calculará como : >> quad( ' sin ' , 1 , 3 ) = 1.5303 Ejercicio.

Obténgase el valor de la integral ∫π

0

)sen( dxx por tres procedimientos de integración numérica:

• Regla de Simpson empleando quad( ' sin ', 0 , pi ) . • Método de Newton-Cotes empleando quad8( ' sin ' , 0 , pi ) . • Un burdo procedimiento de integración aproximada consistente en dividir el intervalo de integración

[ 0 , pi ] en segmentos de longitud 0.1, formar sobre cada uno de ellos un rectángulo y finalmente sumar el área de todos los rectángulos, es decir : x = 0 : 0.1: pi ;

∫ ≅π

0

1.0*))(()sen( xsinsumdxx .

• Comparar cada uno de los resultados anteriores con el valor exacto de dicha integral:

[ ] 2)cos()sen(00

=−=∫ππ

xdxx .

Emplear formato numérico de dieciséis cifras ( format long ) para realizar las comparaciones entre las diferentes técnicas.

21

DERIVACIÓN La derivación numérica es una operación mucho más inestable que la integración numérica. Mientras que la integración numérica da cuenta de una propiedad macroscópica o global, la derivación describe una operación microscópica o local. MATLAB puede tratar el tema de la derivación de diversas formas. • Cuando estamos en presencia de polinomios la función derivada puede encontrarse utilizando la

función polyder.m . Ejemplo. Dado el polinomio 125 23 ++−= xxxy , con el fin de calcular su derivada formamos el vector de coeficientes y aplicamos el comando polyder. >> p=[ 1 , -5 , 2, 1 ] >> polyder ( p ) =[ 3 , -10 , 2 ] que son los coeficientes del polinomio derivada. • Cuando estamos en presencia de una función definida numéricamente

),( 11 yx

),( 22 yx ................

),( nn yx la derivada se aproxima por medio por medio de la función diff.m . Si ),.....,,( 21 nxxxx = , la función diff actúa de la forma ),......,()( 112 −−−= nn xxxxxdiff . La derivada puede obtenerse y dibujarse así: >> dy = diff ( y ) . / diff( x ) ; >> xx = x ( 1 : length ( x ) – 1 ) ; >> plot ( xx , dy ) • Cuando se trata de una función arbitraria )(xfy = la derivada en un punto x0 puede

aproximarse numéricamente como la media de las derivadas laterales:

Siendo h

xfhxflimxfh

)()()(' 00

00−+

=→

+ , h

hxfxflimxfh

)()()(' 00

00−−

=→

resulta que h

hxfhxfxfxfxf

2)()(

2)(')('

)( 00000

' −−+≅

+=

−+

• MATLAB dispone igualmente de una toolbox de matemática simbólica que permite la

determinación de la función derivada. fmin , fmins : Calcula los mínimos relativos de funciones de una variable. La sintaxis es la siguiente: >> fmin ( ' función ' , x1 , x2 ) donde busca el mínimo de la función en el intervalo [ x1 , x2 ].

22

Con el formato >>fmin ( ' función ' , x1 , x2 , options) utiliza un vector de parámetros de control. Ejercicio Consultar el menú de ayuda fmin haciendo >> help fmin Para encontrar un máximo relativo es suficiente observar que )}({)}({ xfminxfmax −= . Ejemplo. Encontrar los máximos y mínimos de la función )sen(2 xey x−= . Podemos proceder como sigue: >> f=' 2 * exp (-x) * sin(x) '; >> x_min=fmin ( f , 0 , 8 ); (3.9270) >> y_min =feval ( f , x_min ); (-0.0279) >> g='- 2*exp(-x)*sin(x)'; >> x_max=fmin ( g , 0 , 8 ); (0.7854) >> y_max =feval ( g , x_max ); ( 0.6448) De forma similar fmins calcula mínimos de funciones de varias variables en el entorno de un punto x0. La sintaxis es ahora: >> fmins ( ' función ' , x0) y también >> fmins ( ' función ' , x0, options) . Ejemplo. Calcular el mínimo local de la función 2

122

1221 )1()(100),( xxxxxf −+−= . Para ello construimos el archivo.m % banana.m function y=banana(x) y=100*( x (2) – x (1). ^2). ^2 + ( 1 – x (1) ). ^2 ; Para obtener el mínimo es suficiente escribir >> fmins ( 'banana' , [ -1.2 , 1] ); Resultando >> x = ( 1 , 1 ).

23

CREACION DE UN GUIÓN EN FORMA DE ARCHIVO .M Una de las capacidades más importantes de MATLAB es la de poder escribir una sucesión de instrucciones en un determinado archivo que pueden, posteriormente, ser ejecutadas al llamar a ese archivo. Tal sucesión de instrucciones juega un papel similar al de un guión de una película cinematográfica y se almacenarán en un archivo .m del bloc de notas. Si estos archivos son conjuntamente almacenados dentro de una determinada carpeta para poder ejecutarlos es preciso que desde MATLAB este abierta dicha carpeta. Ejemplo. Crear en el bloc de notas un archivo con el nombre de grado2.m que calcule las soluciones de una ecuación de segundo grado. Procederemos escribiendo en un archivo que guardaremos con el nombre de grado2.m el siguiente conjunto de instrucciones: %calcula las raíces de una ecuación de segundo grado a=1; b=2; c=3; x1=(-b+sqrt(b^2-4*a*c))/(2*a); x2=(-b-sqrt(b^2-4*a*c))/(2*a); [x1,x2]; Obsérvese que se pueden añadir comentarios dentro de un archivo .m siempre que vayan precedidos de la instrucción % . Para cambiar el valor de los coeficientes a b y c es preciso introducir nuevos valores numéricos dentro de grado2.m . De forma alternativa MATLAB permite la introducción de estos valores por medio de la instrucción input que producirá al llamar el programa un mensaje en la pantalla demandando los valores de a, b y c. Concretamente el programa anterior podría escribirse en la forma: % calcula las raíces de una ecuación de segundo grado a = input(‘coeficiente del término x^2 = ‘); b = input(‘coeficiente del término en x = ‘); c = input(‘coeficiente del término independiente = ‘); x1=(-b+sqrt(b^2-4*a*c))/(2*a); x2=(-b-sqrt(b^2-4*a*c))/(2*a); [x1,x2]; Alternativamente los valores numéricos de los coeficientes a, b y c pueden introducirse simplemente escribiendo su valor en la ventana de comandos. Por ejemplo escribiendo >> a=3 ; b=5 ; c=-2 ;

24

también somos capaces de ejecutar la siguiente versión del programa grado2.m , donde los valores de a, b y c se introducen desde la ventana de comandos, sin tener que manipular el programa en el bloc de notas: % calcula las raíces de una ecuación de segundo grado x1=(-b+sqrt(b^2-4*a*c))/(2*a); x2=(-b-sqrt(b^2-4*a*c))/(2*a); [x1,x2]; Ejemplo. Escribir un archivo .m que dibuje la gráfica de un polinomio de tercer grado. Crearemos un archivo llamado, por ejemplo, graf1.m de la forma % gráfica de un polinomio de grado tres % y=ax^3+bx^2+cx+d a=input('coeficiente a = '); b=input('coeficiente b = '); c=input('coeficiente c = '); d=input('coeficiente d = '); x=-10:0.1:10; y=a*x.^3+b*x.^2+c*x+d; plot(x,y) Ejercicio Construir un archivo.m con el fin de dibujar la curva de crecimiento logístico

0

0( )

0 0

( )( ) t t

axx tbx a bx e− −=

+ −, que corresponde a las soluciones de la ecuación diferencial

2dx ax bxdt

= − , para diversos valores de los parámetros 0 0, , ,a b x t .

CREACION DE NUEVAS FUNCIONES El MATLAB permite la creación de nuevas funciones. Tales funciones deben ser escritas en archivos .m que llevarán idéntico nombre que la función que deseamos crear. La estructura sintáctica de un archivo.m, para una función, contiene en la primera línea, como primera instrucción, la palabra function seguido de la expresión y= f ( x ) , donde f(x) puede tener el nombre alusivo a la nueva función que deseamos crear. Una característica deseable de las funciones que vamos a crear, con el fin de que posean las mismas propiedades que las funciones originarias del MATLAB, es que puedan actuar sobre una variable matricial. Tal es el caso del ejemplo que citamos a continuación. Ejemplo. Definir, en el MATLAB, la función cúbica 42 23 +−+= xxxy . Construiremos un archivo llamado cubica.m que tendrá la siguiente estructura

25

function y=cubica(x) % define una función cubica a=1; b=2; c=-1; d=4; y=a*x.^3+b*x.^2+c*x+d; Una característica esencial de las funciones es que sus variables son locales, lo que quiere decir que no dejan ninguna señal en el espacio de trabajo después de ser ejecutadas. Como consecuencia de esto no será posible alterar sus parámetros desde la ventana de comandos a menos que dichas variables sean globalizadas por medio del comando global. Así, en el programa cubica.m podemos conseguir que los parámetros a, b, c y d se introduzcan desde el espacio de trabajo globalizando las variables a, b, c y d, de la forma: function y=cubica(x) % define una función cubica global a b c d y=a*x.^3+b*x.^2+c*x+d; Una vez globalizadas, para dar valores concretos a los parámetros a, b, c y d habremos de escribir en la ventana de comandos: >> global a b c d >> a=1 ; b=2 ; c=-1 ; d = 4 ; Una vez definida la función cubica.m es posible, por ejemplo, calcular integrales numéricas. Ejemplo.

Calcular una integral dxxxx )6452( 23

1

3 +−+∫ .

Para ello será suficiente escribir en el espacio de trabajo las siguientes instrucciones: >> global a b c d >> a=2 ; b=5 ; c=-4 ; d = 6 ; >> quad( 'cubica', 1 , 3 ) Ejercicio. Obtener el mínimo de la función 6452)( 23 +−+= xxxxf mediante la instrucción >> fmin ( 'cubica' , 0 ) Ejemplo

26

Construir una función de distribución (0,1)N , es decir, a construir la función 2

21( )2

sxF x e ds

π−

−∞= ∫

Para ello construimos, previamente, la función

2

21( )2

s

f x eπ

−= , que denominamos gauss.m

% Campana de Gauss function y=gauss(x) y=(1/sqrt(2*pi))*exp(-x.^2/2); A continuación debemos construir otra función llamada normal.m , desde llamaremos a gauss.m para realizar la integral. % Funcion de distribucion normal function y=normal(x) y=quad('gauss', -10 , x ); Así, >> normal ( 1 ) = 0.8413 Ejercicios. Construir un archivo .m para definir cada una de las funciones que se representan a continuación. Representar gráficamente cada una de estas funciones en el intervalo [-10,10].

a) 3642)( 23 −+−= xxxxf

b) xexxxg += )sen()(

c) 1

15)( 2

3

+++

=x

xxxh

d) 1)( 2 += xxxt

e) 2

2

21)(

x

exs−

f) )1(

1)( 2xxc

+=π

g) rect(x) = 1 si 5.0≤x ; 0 en otro caso. h) step(x) = 0 si x < 0; 1 en otro caso. i) ramp(x) = o si x < 0; x en otro caso.

j) q(x)= 0 si x < 0; 10)2/sen( ≤≤ xsixπ ; 1 si x > 1.

27

k) Crear un archivo .m que dibuje conjuntamente las gráficas de las funciones te 01.0100 y t)01.01(100 + que representan el crecimiento, con el tiempo, de un capital de 100 euros

colocado a un interés 01.0=r , continuo y compuesto, respectivamente. Comparar el crecimiento del capital en ambos tipos de capitalización.

Ejercicios. Calcular el valor de las siguientes integrales definidas.

a) dxxxx )3642(3

1

23 −+−∫−

b) ∫ +3

1

))sen(( dxexx x

c) dxx

xx )1

15(1

12

3

∫− +

++

d) dxxx )1( 22

0

+∫

e) dxex

∫−

−10

10

2

2

21π

f) ∫∞

∞− + )1( 2xdx

π

g) Teniendo en cuenta que la función de densidad para una distribución de Cauchy viene dada

por la función )1(

1)( 2xxf

+=π

, calcular la probabilidad de que dicha variable aleatoria

este comprendida entre -1 y 1. ( ∫− +

1

12 )1( x

dxπ

).

Las funciones definidas hasta el momento tienen una única entrada y una única salida. Resulta muy sencillo construir funciones con más de una entrada y más de una salida. En primer lugar, veamos la sencilla función vectorial banana.m

21

221221 )1()(100),( xxxxxf −+−= .

% banana.m function y=banana(x) y=100*( x (2) – x (1). ^2). ^2 + ( 1 – x (1) ). ^2 ; Como segundo ejemplo vamos a construir la siguiente transformación vectorial

21 1 2

22 1 2

2y x x

y x x

= −

= −

28

Para ello construimos el m-archivo de función, que llamaremos trans.m function [y1,y2]=trans (x1,x2) y1=2*x1.^2-x2; y2=x1-2*x2.^2; Alternativamente esta función también puede representarse mediante el archivo trans1.m , de la forma function y=trans1(x) y=[2*x(1).^2-x(2); x(1)-2*x(2).^2]; Ejemplo. Vamos a construir una función, que llamaremos stat.m , que tiene como entrada un vector y tres salidas como son la longitud del vector, su media aritmética y su desviación típica. function [ n media desv_stand ]=stat(x) n=length(x); media =sum ( x ) / n ; desv_stand = sqrt ( sum ( ( x – media ) . ^ 2 ) / n ) ; Ejercicio. Escribir una función cuya entrada sea un vector y cuya salida sean los todos los momentos centrales, hasta el orden 3. Ejemplo. Vamos a escribir una función cuya entrada sean los coeficientes de una ecuación de segundo grado y cuya salida sean sus raíces. Pudiera ser lógico darle por nombre grado2f.m y su estructura como archivo .m es la siguiente: function [x1,x2]=grado2f(a,b,c) %calcula las raíces de una ecuación de segundo grado x1=(-b+sqrt(b^2-4*a*c))/(2*a); x2=(-b-sqrt(b^2-4*a*c))/(2*a);

29

ALGORITMOS Un algoritmo constituye una secuencia de operaciones aritméticas y lógicas que deben ser realizadas en un determinado orden. En cada uno de los pasos de la secuencia de operaciones, se altera el valor de alguna determinada variable empleando, para ello, el valor de dicha variable obtenido en la etapa anterior. El proceso algorítmico continúa hasta que se verifiquen determinadas condiciones respecto a las variables involucradas, aunque en ciertos casos no es posible saber de antemano el número de veces que se ha de repetir el algoritmo. Los ordenadores sólo son capaces de llevar a cabo, de forma primaria, las reglas elementales de la aritmética. Cualquier otro tipo de operación matemática más compleja ha de reducirse a las reglas aritméticas elementales mediante el uso de los algoritmos. Veamos, como ejemplo, un algoritmo destinado a obtener la raíz cuadrada de un número positivo “a”. Partiendo de la ecuación ax =2 , la transformamos en 112 −=− ax y por tanto en

1)1)(1( −=−+ axx , de donde se obtiene 111

+−

=−xax , es decir

)1(1

11x

ax+−

+= .

La raíz cuadrada del número a=2 se obtendrá partiendo de un valor inicial de x, por ejemplo x=1, colocándolo en el segundo miembro de la expresión (1) , obteniendo entonces un nuevo valor de x=3/2. Este nuevo valor volverá a ser llevado al segundo miembro de la expresión 1 y así sucesivamente. Este algoritmo puede, igualmente visualizarse , con el empleo de fracciones continuas como se muestra a continuación.

xa

a

xa

ax

+−

+

−+=

+−

++

−+=

112

11

1111

11

y así sucesivamente se obtiene

.....212

12

12

12

11

+−

+

−+

−+

−+

−+=

aa

aa

ax

La estructura algorímica que acabamos de describir puede ser tratada, de modo muy eficiente, mediante el bucle for, que mostramos a continuación. EL BUCLE FOR Un bucle es una estructura computacional que permite repetir sucesivamente una serie de instrucciones. El bucle for tiene la siguiente estructura: for i =1 : n INSTRUCCIONES end

30

De modo que cuando un determinado índice i vaya desde el valor 1 hasta el valor n las instrucciones se repetirán una vez por cada valor que avanza el índice. Veamos algunos ejemplos elementales del uso del bucle for. Ejemplo En primer lugar construiremos un programa que permita calcular la raíz cuadrada de un determinado número. % Calcula la raíz cuadrada de un número a x=1 for i=1:n x=1+(a-1)/(1+x); end sprintf(‘la raíz cuadrada del número a es %g’,x) Ejercicio Establecer un algoritmo destinado a calcular la raíz n-ésima de un número. Sugerencia: Partiendo de la ecuación axn = , usar para ello la identidad

1)1.....)(1(1 21 −=++++−=− −− axxxxx nnn

para concluir la expresión nxxxax

++++−

+=......111 2

Ejemplo. Escribir la tabla de los n primeros números naturales de la forma n2 . Procederemos creando un archivo.m de la forma: % Muestra la tabla de las n primeras potencias de 2 n=input( ‘número de potencias de 2 que deseamos encontrar = ‘ ) ; xx = [ ]; for i = 1 : n x = 2 ^ i; xx= [ xx x ] ; end xx’ La lógica que hay en esta construcción es la siguiente: para cada valor del índice i el número 2 es elevado a i y tal resultado se guarda dentro de la variable x. Finalmente los sucesivos valores de la variable x se almacenan dentro de otra variable xx. Obsérvese que previamente hemos procedido a vaciar la variable xx mediante la instrucción xx = [ ]. Ejemplo.

31

Escribir una función que sume las componentes de un vector dado. Tal función que podríamos llamar vectsuma.m es equivalente a la función sum vista previamente, aunque esta última también es capaz de actuar sobre matrices. Su estructura es la siguiente: function y=vectsuma(x) % suma las componentes de un vector x n=length(x); s=0; for i= 1 : n s = s + x ( i ) ; end y = s; Ejercicios. Escribir de archivos.m donde sea empleado el bucle for en su construcción y que realicen cada una de las funciones que se detallan a continuación. a) Suma de los n primeros números naturales. b) Dibujar la curva seno en el intervalo [ ]π2,0 . c) Escribir una función llamada medgeo.m que calcule la media geométrica de un vector x. d) Determinación del producto de los elementos de la diagonal principal de una matriz de dimensiones

arbitrarias. e) Una tabla de tres entradas en la que figuren los radios , las áreas y los perímetros de veinte círculos

con radios comprendidos entre 1 y 5.

f) Una tabla de los valores de la función sen(x) entre 0 y 5π

, haciendo uso del desarrollo de Taylor de

grado cinco )!5!3

)sen((53 xxxx +−≅ .

g) Escribir una función que sume los elementos pares de un vector. h) Escribir una matriz de dimensiones arbitrarias cuyas i-ésima fila esté formada por los elementos i,

i+1, i+2, …… , i+n. i) Escribir una matriz de dimensiones arbitrarias cuyas j-ésima columna esté formada por los elementos

j, j+1, j+2, …… , j+n. j) Dado un vector ),,......,,( 121 nn xxxxx −= obtener el vector ),,.....,,( 121 xxxxy nn −= . También es posible escribir diversos bucles for que estén anidados unos dentro de los otros tal como muestra el siguiente ejemplo. Ejemplo. Escribir una matriz de dimensiones arbitrarias de modo que cada uno de sus elementos sea de la forma

11−+

=ji

aij

32

% construye una matriz cuyos elementos son de la forma a(i,j)=1/(i+j-1) n=input('número de filas ='); m=input('número de columnas ='); a = [ ]; for i=1:n for j=1:m a ( i , j ) = 1 / ( i + j - 1); end end a Ejercicios. Haciendo uso del bucle for doblemente anidado, escribir archivos.m con las siguientes características: a) Una función que sume todos los elementos de una matriz. b) Una función cuya entrada sea una matriz y cuya salida sea un vector formado por la suma de cada

una de sus columnas (tal función coincide exactamente con la función sum). EL BUCLE FOR EN LAS ECUACIONES EN DIFERENCIAS Las ecuaciones en diferencias proporcionan ejemplos muy característicos e intuitivos del manejo del bucle for. Ejemplo. Escribir un archivo.m que calcule los cincuenta primeros valores del problema de valores iniciales:

11.1 −= tt XX con 21 =X , dibujando finalmente el valor de la variable X frente al tiempo. Llamaremos a este archivo malthus.m y tendrá la siguiente estructura: % describe la dinámica del crecimiento malthusiano xx=[ ]; x=2; for i=1:50 x = 1.1 * x ; xx =[ xx x ] ; end plot(xx)

33

La lógica que hay en esta construcción es la siguiente: para cada valor del índice i la variable escalar x se multiplica por 1.1 y su resultado se almacena dentro de otra variable xx. Obsérvese que previamente hemos procedido a vaciar la variable xx mediante la instrucción xx = [ ] . MATLAB permite, igualmente, realizar este mismo programa sin el empleo de variables almacén como la xx, debido a su capacidad de admitir variables vectoriales dentro de los bucles. El archivo malthus.m puede ser escrito, análogamente, como %describe la dinámica del crecimiento malthusiano x=[ ]; x(1)=2; for i=1:50 x(i+1) = 1.1 * x(i) ; end plot(xx) Obsérvese que la variable x es una variable vectorial. Las ecuaciones en diferencias de orden superior pueden ser resueltas de forma análoga. Ejemplo. Hallar la sucesión de los veinte primeros números de Fibonacci, que vienen dados mediante la ecuación en diferencias ttt XXX += ++ 12 con las condiciones iniciales 1)2(,11 == XX . Para ello crearemos el archivo fibo.m, que tiene la siguiente estructura: % EL CODIGO DAVINCI % Calcula los veinte primeros números de Fibonacci %x=[ ]; x(1)=1 ; x(2)=1 ; for i=1:20 x(i+2)=x(i+1)+x(i); end Ejercicio

Comprobar que los términos de la sucesión de Fibonacci verifican 1 1 5lim 1.6182

t

nt

xx+

→∞

+= ≅

Ejercicio. Considérese la ecuación en diferencias 26/16/1 12 =−− ++ ttt XXX , con las condiciones iniciales

2/1)2(,1)1( == XX .

34

a) Determinar sus 25 primeros términos mediante la creación de un archivo .m y un bucle for . b) Escríbase, igualmente, la solución particular en forma analítica encontrando, previamente, la

solución general de la parte homogénea y la solución de equilibrio. c) Dibujar la solución obtenida en el apartado a) y comparar con la solución particular obtenida en b). El MATLAB resulta igualmente muy eficaz a la hora de tratar procesos estocásticos. Veamos a continuación un ejemplo donde se maneja un paseo aleatorio con deriva. Ejemplo. Escribir un archivo .m que describa sucesivas realizaciones del paseo aleatorio con deriva

ttt XX ε++=+ 107.01 . % Paseo aleatorio con deriva x=[ ] ; x ( 1 ) = 0 ; for i=1:1000 x ( i + 1 ) = 0.7 * x ( i ) + 10 + randn; end plot(x); Resulta igualmente inmediato el tratamiento de ecuaciones en diferencias no lineales como muestra el siguiente ejemplo. Ejemplo. Construir un archivo .m que permita calcular las cincuenta primeras iteraciones de la ecuación en

diferencias logística )1(41 ttt XXX −=+ , con 4

)1( π=X .

% ecuación en diferencias logística x =[ ] ; x ( 1 ) = pi / 4 ; for i=1:50 x ( i + 1 ) = 4 * x ( i ) * ( 1 – x ( i ) ) ; end plot(x) Ejercicios. a) Representar el espacio de fases de la ecuación en diferencias logística, dibujando tX frente a 1+tX . b) Escribir un archivo.m donde se obtenga las iteraciones de la ecuación logística por medio de una

function que tenga tres entradas: el número de iteraciones, la condición inicial y el parámetro ( dada

35

la logística )1(1 ttt XmXX −=+ se denomina parámetro al coeficiente m, que en el ejemplo anterior tomaba el valor m = 4).

c) Dibujar diversas series temporales, de longitud 250, obtenidas por la logística al dar al parámetro m

los sucesivos valores de m = 1 , m = 2 , m = 3 , m = 4 , con la condición inicial 4

)1( π=X .

d) Hallar el coeficiente de correlación entre las variables tX y 1−tX para diversas logísticas de longitud 100, 500 y 1000.

e) Comparar las trayectorias de las series temporales de longitud 200 generadas por dos ecuaciones

logísticas con parámetro m=4, con valores iniciales 40π

=x y 0001.040 +=πx ,

respectivamente. f) Repetir el ejercicio anterior para series generadas por una logística con parámetro m=3.

g) Calcular las 100 primeras iteraciones de la ecuación logística con 4

)1( π=X para los diferentes

valores del parámetro m que se enumeran a continuación, comprobando que: para 3m = el sistema tiene un punto de equilibrio estable; para 3.1m = hay un ciclo estable de periodo 2; para 3.5m = hay un ciclo estable de periodo 4; para 3.55m = hay un ciclo estable de periodo 8; para

3.565m = hay un ciclo estable de periodo 16; y para 3.57m = la trayectoria es aperiódica. Los sistemas de ecuaciones en diferencias, cuando están escritos en forma normal, pueden ser resueltos fácilmente empleando un bucle for, tal como muestra el ejemplo que presentamos a continuación. Ejemplo.

Hallar los veinte primeros puntos de la solución particular del sistema

=

+

+

t

t

t

t

yx

yx

1221

1

1 , con

la condición inicial

=

11

1

1

yx

.

Para ello vamos a construir el siguiente archivo que denominaremos discret.m . % Genera un sistema discreto 2X2 x=[ ]; y=[ ]; x( 1) =1; y(1)=1; for i=1:10 x(i+1)=x(i)+2*y(i); y(i+1)=-2*x(i)+y(i); end [ x’ y’ ] Este sistema puede expresarse alternativamente como

36

% discreto 2X2 a=[1 2;-2 1]; x=[ ]; x(: , 1)=[1 ; 1]; for i=1:10 x(: , i+1)=a*x( : , i); end x Para dibujar la trayectoria en el espacio de fases teclearemos en el espacio de trabajo >> plot ( x ( 1 , : ) , x ( 2 , : ) ) Para dibujar las trayectorias temporales de cada una de las variables haremos >> plot ( x ( 1 , : ) ) >> plot( x ( 2 , : ) ) Ejercicio Construyamos el sistema anterior con coeficientes aleatorios % Sistema 2x2 con coeficientes aleatorios a=randn(2,2); x=[ ]; x(: , 1)=[1 ; 1]; for i=1:10 x(: , i+1)=a*x( : , i); end plot ( x ( 1 , : ) , x ( 2 , : ) ) eig (a) ejecutar el archive sucesivas veces y adivinar a partir de la gráfica del espacio de fases la naturaleza real o compleja de los autovalores así como si su parte real es mayor o menor que uno en valor absoluto. Ejercicios. 1) Hallar los veinte primeros puntos de la solución particular del sistema

+

=

+

+

23

1411

1

1

t

t

t

t

yx

yx

, con la condición inicial

=

42

1

1

yx

.

2) Hallar las mil primeras iteraciones del sistema no lineal:

37

2

1

1

1 1.40.3

t t t

t t

x y xy x+

+

= + −

=

con las condiciones iniciales

=

1.01.0

1

1

yx

.

3) Hallar las mil primeras iteraciones del sistema no lineal:

)(4

)(9.32

1

21

tttt

ttt

yyxy

xxx

−=

−=

+

+

con las condiciones iniciales

=

1.01.0

1

1

yx

.

4) Teniendo en cuanta que las matrices 1MAM − y A tienen los mismos autovalores, poner ejemplos

de sistemas lineales de ecuaciones en diferencias 2x2 que tengan como espacio de fase • Un nodo estable. • Un nodo inestable. • Un punto de silla. • Una estrella estable. • Una estrella inestable.

Modelo de población por grupos. Consideremos el siguiente modelo poblacional humana en el que se consideran las siguientes variables que representan el número de individuos de cada grupo de edad.

0X : número de recién nacidos,

1X : número de niños,

2X : número de jóvenes,

3X : número de adultos,

4X : número de jubilados. Las ecuaciones que rigen la dinámica del modelo son

0 2 2 3 3

1 0 0

2 1 1

3 2 2

4 3 3

( 1) ( ) ( )( 1) ( )( 1) ( )( 1) ( )( 1) ( )

X t a X t a X tX t b X tX t b X tX t b X tX t b X t

+ = ++ =+ =+ =+ =

Donde los parámetros de fertilidad son 2 1.5a = y 3 1a = , y los parámetros de supervivencia son

0 1 2 30.99 , 0.95 , 0.9 , 0.8b b b b= = = = . Consideremos ahora dos posibles estados iniciales de los que parte la población:

• Una población con grupos en equilibrio 0 1 2 3 4 1X X X X X= = = = = .

• Una población en la que sólo existen niños, es decir, 1 0 2 3 41 , 0X X X X X= = = = = . En ambos casos las unidades se suponen expresadas en millones.

a) Estudiar la evolución de ambos grupos de población durante los próximos 20 años. Encontrar las pirámides de población correspondientes. Comprobar que, con independencia de la proporción inicial de individuos dentro de cada grupo, la distribución por edades de la población tiende al autovector dominante. Dibujar la gráfica de la evolución de los diferentes grupos de población.

38

b) Con el avance de la medicina y la falta de nacimientos, las pirámides de población de las

sociedades occidentales tienden a invertirse. Vamos a considerar ahora el caso en que parte de los jubilados sobrevive pasando a una nueva categoría de jubilados ancianos. Para describir tal fenómeno añadiremos una nueva ecuación 41 3 3 4 4 4( 1) ( ) ( ) , 0.7X t b X t b X t b+ = + = ,

donde 41X representa ahora el número total de jubilados, mientras que 4X representa ahora el número de personas recién jubilados. Estudiar ahora la población de jubilados y la nueva pirámide poblacional.

A continuación vamos a considerar el siguiente modelo de población no lineal con reclutamiento, que viene dado por el modelo

1 1t t t dkt d

bX aX XX+ −

= ++

donde , ,a b k y d son los parámetros del sistema. Para 10k = se trata de una versión discreta del modelo de Mackey-Glass, desarrollado originalmente para modelizar la producción y pérdida de glóbulos blancos. Este modelo puede ser interpretado como un modelo de dinámica poblacional. Si 0 1a< < y 0b > y si

tX denota el número de adultos de la población, entonces a es la tasa de supervivencia de adultos y

d es el tiempo de retardo entre nacimiento y maduración de un individuo hasta alcanzar la edad fértil.

El factor 1 k

t d

bX −+

puede interpretarse como la tasa de fertilidad de los adultos nacidos hace d periodos

en el pasado, la cual es no lineal como consecuencia de una fecundidad decreciente a altos niveles de la

población. Así, el término 1 t dk

t d

b XX −

−+ da cuenta del reclutamiento de nuevos adultos que han nacido

hace d años. Estudiar las 400 primeras evoluciones del modelo para los parámetros ( , , , ) (0.2,2,6,2)a b k d = .

MODELO DE EPIDEMIAS

Como un ejemplo ilustrativo de la utilización de sistemas de ecuaciones en diferencias, estudiaremos un

modelo de epidemia bastante conocido: el sarampión.

Todos, de alguna u otra manera, hemos tenido contacto con esta enfermedad, altamente

contagiosa, que afecta especialmente a los niños. También sabemos que una vez superada, el organismo

se vuelve inmune a ella. Al niño no expuesto a la enfermedad (ni la ha sufrido ni ha sido debidamente

vacunado) se le denomina susceptible, y S será el número de niños que en un determinado momento y

lugar se encuentran en este estado.

Un problema que debemos considerar, es la duración de la enfermedad. Existe un periodo de

latencia después del contagio, durante el cual el virus no se ha desarrollado suficientemente, y el

individuo no es contagioso y no tiene síntomas. Pasado este periodo, el individuo se vuelve contagioso. I

representará al numero de individuos infectados que pueden contagiar a aquellos que entren en contacto

con ellos (I es el número de infecciosos). Al cabo de cierto tiempo los enfermos se vuelven inmunes y no

pueden reinfectarse.

Trataremos este problema haciendo algunas simplificaciones. Para ello consideremos que el

periodo de latencia es de una semana, y que permanecen en el estado contagioso, hasta que comienza su

recuperación y por tanto se vuelven inmunes, otra semana.

39

Sea Ik el número de enfermos, con capacidad de contagiar, presentes en la semana k, mientras

que Sk será el numero de susceptibles esa semana. Ik+1 será el número de susceptibles que fueron

infectados por la enfermedad al principio de la semana k (recordemos que el periodo de latencia es de una

semana).

Sk+1 representa el numero de niños susceptibles de padecer la enfermedad en la semana k, menos

el numero de niños que han sido contagiados al comienzo de esta semana, mas el numero de nacimientos

B (niños que se incorporan al estado de susceptibles) durante la semana en cuestión. Este ultimo sumando

B, lo consideramos constante.

Finalmente, nos queda por señalar cuál es la capacidad de contagio de un niño infectado sobre

los demás. Para ello consideramos que un enfermo contagioso, en promedio, infecta de forma constante

una fracción f del total de susceptibles, y por tanto f Sk es la cantidad de susceptibles infectados por cada

uno de los Ik. El total de infectados, será por tanto, Ik f Sk.

Podemos seguir la evolución de un sistema de este tipo, a partir de unas ciertas condiciones

iniciales, mediante el siguiente sistema de ecuaciones en diferencias

Sk+1=Sk-fSkIk+B

Ik+1=fSkIk.

La situación de equilibrio, es decir, los puntos fijos, se obtienen resolviendo el sistema

Sk=Sk-fSkIk+B

Ik=fSkIk.

Dando como resultado los valores S*=f1

; I*=B.

De la segunda ecuación, dividiendo por Ik, queda k

k

II 1+ = fSk, y por tanto, si Sk <

f1

; se verifica que

k

k

II 1+ <1, luego I decrece. Si por el contrario, Sk> f

1 los valores de I crecerán. Lo ideal parece ser

mantener la población de candidatos a padecer la enfermedad por debajo de f1

, lo cual podría

conseguirse con una adecuada campaña de vacunación.

En el siguiente recuadro se propone un programa en MATLAB para simular este proceso.

S0=50000; f=0.00003;I0=15;B=200; % condiciones iniciales

S=[];I=[];S(1)=S0;I(1)=I0;

for i=1:499;

S(i+1)=S(i)-f*S(i)*I(i)+B;

I(i+1)=f*S(i)*I(i);

end

figure(1), plot([S' I'])

Ie = B; Se=1/f;

% espacio de fases

figure(2), plot(S,I,Se,Ie,’+’) % ciclo límite resultante alrededor del punto fijo

40

EL BUCLE WHILE Mediante este bucle es posible repetir una determinada instrucción un número indeterminado de veces mientras se verifique determinada condición. Su estructura sintáctica es la siguiente: while CONDICIONES sobre ciertas variables INSTRUCCIONES end Las condiciones que se emplean en el bucle while se describen por medio de los operadores relacionales entre variables == , < , > , <= y >= . Como primer ejemplo veamos como la ecuación en diferencias logística )1(41 ttt XXX −=+ , con

4)1( π=X , puede ser resuelta con un while.

%ecuación en diferencias logística x = [ ] ; x ( 1 ) = pi / 4 ; i=1 ; while i < 100 x ( i + 1 ) = 4 * x ( i ) * ( 1 – x ( i ) ) ; i = i + 1 ; end Existen numerosos algoritmos computacionales donde el uso del while es imprescindible. Se trata de aquellos procedimientos iterativos que se repetirán hasta haber alcanzado un determinado grado de aproximación. Tal es el caso de los procedimientos iterativos de resolución de ecuaciones algebraicas o de sistemas de ecuaciones lineales. Ejemplo. Encontrar una solución de la ecuación 0103 25 =−+ xx mediante un proceso de aproximaciones sucesivas que mejore, sucesivamente, una primera aproximación dada de antemano. El procedimiento iterativo al que hace referencia el enunciado es el siguiente:

Primeramente escribimos esta ecuación de la forma 5 2310 xx −= . Seguidamente consideramos una primera aproximación 1.00 =x . Este valor se sustituye en el segundo

miembro de la ecuación para obtener una segunda aproximación 1x y así sucesivamente, es decir,

1.00 =x ,

47577.1)1.0(3105 21 =−=x

28225.1)47577.1(3105 22 =−=x

38344.1)28225.1(3105 23 =−=x

33613.1)38344.1(3105 24 =−=x

41

El proceso continuará hasta obtener dos valores sucesivos de las aproximaciones suficientemente cercanos, en tal caso se dice que el método converge, o hasta sobrepasar un número límite prefijado de iteraciones en el caso que no haya convergencia. El siguiente programa realiza el proceso de aproximaciones sucesivas que acabamos de describir. Para abortar la ejecución del programa hemos empleado el relacional lógico & que es equivalente a un and. X = [ ] ; X ( 1 ) = 2 ; x ( 2 ) = 1 ; i=1; while abs ( x ( i + 1 ) – x ( i ) ) > 0.00000001 & i<1000 x ( i + 2 ) = ( 10 – 3 * x ( i + 1 ) ^ 2 ) ^ 0.2 ; i = i + 1 ; end n = length ( x ) x ( n ) Al ejecutar este programa obtenemos un valor aproximado para la raíz de la ecuación de 1.3520 después de realizar 28 iteraciones con una tolerancia de 0.00000001. No hemos permitido que el número de iteraciones sea superior a 1000. El uso de la bifurcación if , que veremos a continuación, permitirá introducir un mensaje advirtiendo cuándo el proceso iterativo es divergente. LA BIFURCACIÓN CONDICIONAL IF La bifurcación posibilita ejecutar una determinada instrucción en el caso en que se verifique una determinada condición. Su forma general es la siguiente: If CONDICIÓN sobre ciertas variables INSTRUCCIÓN end Las condiciones que se emplean en la bifurcación if se describen por medio de los operadores relacionales entre variables == , < , > , <= y >= . Veamos un sencillo ejemplo if x > 100 y = y + 1; disp( 'x ha superado el umbral 100' ); end

42

En este ejemplo ha ocurrido lo siguiente: Si la variable escalar x toma un valor superior a 100 entonces la variable y se incrementa en una unidad y en la pantalla se muestra el mensaje “x ha superado el umbral 100” ( disp es una nueva instrucción que permite mostrar mensajes en la pantalla). Si la variable x no toma un valor superior a 100 se ignoran ambas instrucciones. Con mucha frecuencia se desea que cuando no se verifican las condiciones señaladas en el if se ejecuten ciertas instrucciones diferentes al caso en que si se verifican. En este caso la bifurcación condicional tiene la siguiente sintaxis: if CONDICION sobre ciertas variables INSTRUCCIÓN 1 else INSTRUCCIÓN 2 end Ejemplo. Vamos a construir un archivo.m , que llamaremos moneda.m , cuya ejecución simule el lanzamiento de una moneda. Para ello haremos uso tanto de la bifurcación if como del generador de números aleatorios gaussianos. % simula el lanzamiento de una moneda x=randn; if x>=0 disp('cara'); disp(x); else disp('cruz'); disp(x); end En general la bifurcación if admite un conjunto de condiciones alternativas, cada una de ellas asociada con una determinada instrucción, siguiendo la sintaxis que mostramos a continuación:

43

If CONDICIÓN sobre ciertas variables INSTRUCCIÓN 1 elseif CONDICIÓN 2 INSTRUCCIÓN 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elseif CONDICIÓN n INSTRUCCIÓN n else INSTRUCCIÓN n+1 end Como primer ejemplo vamos a considerar la función trozos.m que crea una función a trozos:

2

2

0.1 3 ( ) 3 0( ) 2 2 0 3

3

x

x sen x xf x e x

x x

+ − <

= + ≤ ≤ >

function y=trozos(x) for i=1:length(x) if x(i)<0 y(i)=0.1*x(i).^2+3*sin(x(i))-3; elseif 0<=x(i) & x(i)<=3 y(i)=2*exp(x(i))+2; else %if 3<x(i) y(i)=-x(i).^2; end end Ejemplo. Escribir un programa que simule el lanzamiento de dos monedas. Por analogía con el caso de una moneda llamaremos a este programa moneda2.m . El programa es el siguiente: %simula lanzamiento de dos monedas x=randn(2,1); if x(1) >=0 & x(2) >=0 disp('c c'); disp(x); elseif x(1) >=0 & x(2) <0 disp('c +');

44

disp(x); elseif x(1) <0 & x(2) <0 disp('+ +'); disp(x); else disp('+ c '); disp(x); end En el programa que mostramos a continuación, y que llamaremos monedas.m , simulamos el lanzamiento de un número arbitrario de monedas contando el número de caras y cruces que resultan en cada lanzamiento. % simula el lanzamiento de n monedas contando el número de caras y cruces obtenidas n=input( ' número de tiradas = ' ) ; cara=0; for i=1:n x=randn; if x>=0 cara=cara+1; else end end disp('nº de caras ='); disp(cara); disp('nº de cruces ='); disp(n-cara); Ejercicios. 1)Construir el anterior programa, de lanzamiento de monedas, como una function cuya entrada sea el número de lanzamientos y cuya salida sea el número de caras obtenidas en los lanzamientos. Construir entonces un nuevo programa que permita obtener el histograma que resulta del numero de caras en el lanzamiento de veinte monedas, cuando dicha veinte monedas han sido lanzadas dos mil veces. 2) Simular el lanzamiento de un dado mediante un archivo.m . 3) Escribir un archivo.m capaz de efectuar la siguiente operación: Dada una matriz cuadrada A

determinar su rango y calcular su inversa. En caso en que al matriz no tenga inversa mostrar un mensaje en la pantalla que lo indique.

4) Dado un sistema de ecuaciones →→

= bXA , donde A no es necesariamente una matriz cuadrada elaborar un archivo.m que discuta la naturaleza de las soluciones del sistema mediante el teorema de Rouche_Frobenius.

45

5) Programar el método de la bisección de Bolzano para calcular raíces de una ecuación: si f(x) es una función continua en un intervalo [ a, b ] y el signo de f(a) es distinto del signo de f(b) entonces existe un número ),( ba∈α de modo que .0)( =αf

6) Construir la tabla de los n primeros números primos. 7) Dado un número, averiguar si es primo. 8) Construir un archivo .m para la función 1)1()( 2 <−= xsixxB , mientras que 10)( ≥= xsixB . Dibujar su gráfica. 9) Idem para la función

1)1()( 33 <−= xsixxW , mientras que 10)( ≥= xsixW .

46

ECUACIONES DIFERENCIALES Haciendo uso de las instrucciones ya examinadas es posible construir un archivo.m para resolver, numéricamente, ecuaciones diferenciales por el método de aproximación de Euler. Tal como se muestra a continuación, el siguiente programa que pudiera llamarse euler.m permite encontrar la solución aproximada del problema de valores iniciales asociado a la ecuación logística

2.0)1.0(,)3( =−= yyydxdy

.

%MÉTODO DE EULER PARA RESOLVER ECUACIONES DIFERENCIALES %y'=f(x,y); %Cada nueva función f(x,y) debe introducirse en el FOR %h=input('longitud del paso ='); %n=input('número de iteracciones ='); %x0=input('valor inicial para x ='); %y0=input('valor inicial para y ='); h=0.1;n=25;x0=0.1;y0=0.2; x =[ ] ; y =[ ] ; x(1) = x0 ; y(1) = y0; for i=1:n %y(i+1)=y(i)+0.1*(x(i)^2-y(i)^2)*h; y(i+1)=y(i)+(y(i)*(3-y(i)))*h; x(i+1)=x(i)+h; end plot(x,y)

Téngase en cuenta que para resolver numéricamente otra nueva ecuación como la )(1.0 22 yxdxdy

−= es

preciso introducir la nueva forma funcional dentro del bucle for , haciendo activa la línea del programa >> y(i+1) = y(i)+0.1*(x(i)^2 - y(i)^2)*h ; El MATLAB emplea dos instrucciones, elaboradas específicamente, para resolver tanto ecuaciones diferenciales como sistemas de ecuaciones diferenciales ordinarias. La instrucción ode23 obtiene la solución aproximada, tanto de ecuaciones diferenciales como de sistemas, empleando métodos de Runge-Kutta de segundo y tercer orden. La instrucción ode45 obtiene la solución aproximada, tanto de ecuaciones diferenciales como de sistemas, empleando métodos de Runge-Kutta de tercero y cuarto orden. El funcionamiento de ambos procedimientos es similar.

Supongamos que queremos resolver la ecuación diferencial logística )5(2 xxdtdx

−= , con la

condición inicial x(0) = 1. El primer paso a dar es el de crear un archivo.m , que llamaremos logistic.m donde describiremos la función que da lugar a la ecuación diferencial:

47

function dx = logistic(t,x) %Esta función logistic.m evalúa la ecuación diferencial logística dx = 2 * x .* ( 5 – x ) ; Para resolver la ecuación diferencial es preciso teclear en el espacio de trabajo la siguiente instrucción: >> [ t , x ] =ode23 ( ' logistic ' , ti , tf , X0 ) , o bien >> [ t , x ] =ode45 ( ' logistic ' , ti , tf , X0 ) . En ambos casos la instrucción requiere cuatro entradas que son: El nombre del archivo.m que describe la ecuación escrito entre comillas simples. El tiempo inicial ti donde comienza la integración. El tiempo final tf donde finaliza la integración. La condición inicial X0 que deseemos emplear. La instrucción tiene además dos salidas que son los vectores columna t e x. En t son almacenados los correspondientes instantes del tiempo donde se ha calculado la solución. En x son almacenados los valores de la solución en dichos instantes del tiempo. Por ejemplo podemos realizar la siguiente integración: >> [ t , x ] =ode23 ( ' logistic ' , 0 , 10 , 1 ) o bien >> [ t , x ] =ode45 ( ' logistic ' , 0 , 10 , 1 ) que corresponde a la elección ti=0, tf=10, X0=1. La solución obtenida puede entonces ser examinada gráficamente si escribimos >> plot(t,x) o también >> plot(x) . Si queremos cambiar los valores de los parámetros que aparecen en la logistic.m esto puede hacerse sin necesidad de acceder al archivo en el bloc de notas añadiendo la instrucción global , tal como se muestra a continuación: function dx = logistic(t,x) %Esta función logistic.m evalúa la ecuación diferencial logística global a b dx = a * x. * ( b – x ) ; En tal caso la introducción de los valores a=3 y b=4, por ejemplo, se realizará, simplemente, escribiendo en la ventana de comandos :

48

>> global a b >> a = 3 ; b = 4 ; Ejercicios. Resolver las siguientes ecuaciones diferenciales con las condiciones iniciales que se especifican.

1) 21.1 += xdtdx

, con la condición inicial x(0) = 0.

2) )sen(1.1 2 txdtdx

+= , con la condición inicial x(0) = -1.

3) 42 2 += tdtdx

, con la condición inicial x(0) = 1.

La forma de resolver sistemas de ecuaciones diferenciales ordinarias es completamente análoga.

Supongamos que deseamos resolver el sistema

−−

−=

yx

yx

1111

.

.

junto con las condiciones

iniciales x(0)=1 , y(0)=3. Primeramente crearemos una función para describir el sistema de ecuaciones diferenciales, que podríamos llamar sis2x2.m . function dx= sis2x2 ( t , x ) %Esta función evalúa un sistema lineal de ecuaciones diferenciales dx = [ - x(1) + x(2) ; - x(1) – x(2) ] ; A continuación formaremos un vector X0=[ -1 , 3 ] de condiciones iniciales, y eligiendo ti=0 y tf=50, obtendríamos la solución de la forma: >> [ t , x ] =ode23 ( ' sis2x2 ' , 0 , 50 , X0 ) En este caso la variable de salida t corresponde a los instantes de tiempo donde se ha calculado la solución, mientras que y es una matriz de dos columnas, cada una de las cuales representa las funciones x(t) e y(t) de la solución estimada por el programa. En este caso es posible visualizar la solución a diversos niveles: Dibujando la primera columna de la y con >> plot( x ( : , 1 ) ) obtendremos la trayectoria de x(t). Dibujando la segunda columna de la y con >> plot( x ( : , 2 ) ) obtendremos la trayectoria de y(t). El espacio de fases ( x(t) , y(t) ) puede ser obtenido mediante >> plot( x ( : , 1 ) , x( : , 2 ) ) .

49

Podemos considerar los coeficientes de la matriz que define el sistema de ecuaciones diferenciales como parámetros que pueden ser introducidos desde el exterior mediante el comando global : function dx= sis2x2 ( t , x ) %Esta función evalúa un sistema lineal de ecuaciones diferenciales global a11 a12 a21 a22 dx = [ a11* x(1) + a12* x(2) ; a21* x(1) + a22* x(2) ] ; Ejercicio Construyamos el sistema anterior con coeficientes aleatorios function dx= sis2x2 ( t , x ) %Esta función evalúa un sistema lineal de ecuaciones diferenciales a=randn(2,2) dx = [ a(1,1)* x(1) + a(1,2)* x(2) ; a(2,1)* x(1) + a(2,2)* x(2) ] ; ejecutar sucesivas veces las instrucciones >> [ t , x ] =ode23 ( ' sis2x2 ' , 0 , 50 , X0 ) >> plot( x ( : , 1 ) , x( : , 2 ) ) y adivinar a partir de la gráfica del espacio de fases la naturaleza real o compleja de los autovalores así como el signo de su parte real. Ejercicios. Resolver numéricamente y dibujar el espacio de fases de los siguientes sistemas de ecuaciones diferenciales. Discutir, previamente, la configuración del espacio de fases de cada uno de estos sistemas encontrando sus autovalores y autovectores mediante el uso del comando [ V,D]=eig(A) .

1)

=

yx

yx

0940

.

.

, con la condiciones iniciales x(0)=-1 , y(0)=1 (Centro).

2)

−−−

=

yx

yx

7412

.

.

, con la condiciones iniciales x(0)=1 , y(0)=1 (Nodo estable).

3)

−−=

yx

yx

1331

.

.

, con la condiciones iniciales x(0)=2 , y(0)=3 (Punto de silla).

4)

−−

−=

yx

yx

1111

.

.

, con la condiciones iniciales x(0)=-1 , y(0)=2 (Espiral estable).

5)

+

−−

=

31

1220

.

.

yx

yx , con la condiciones iniciales x(0)=-1 , y(0)=1(Espiral estable).

50

6)

+

−−

=

12

3511

.

.

yx

yx , con la condiciones iniciales x(0)=-1 , y(0)=0(Espiral estable).

7)

+

−−

=

11

2512

.

.

yx

yx , con la condiciones iniciales x(0)=-1 , y(0)=1 (Centro).

8) Comprobar que si en el sistema anterior sustituimos 22 2.1a = − el centro se convierte en una espiral

inestable. Si hacemos 22 1.9a = − el centro se convierte en una espiral estable.

9) Teniendo en cuanta que las matrices 1MAM − y A tienen los mismos autovalores, poner ejemplos de sistemas lineales de ecuaciones diferenciales 2x2 que tengan como espacio de fase • Un nodo estable. • Un nodo inestable. • Un punto de silla. • Una estrella estable. • Una estrella inestable.

El tratamiento de los sistemas 3x3 y, en general, nxn se realiza de forma completamente análoga a los sistemas 2x2. Si queremos tratar una ecuación diferencial de orden superior es preciso convertirla en un sistema, en forma normal, mediante el consabido cambio de variables. El MATLAB es especialmente eficiente en el tratamiento de sistemas y ecuaciones no lineales. Ejemplo. Consideremos la ecuación no lineal, de segundo orden, conocida como ecuación de Van der Pol:

0)1(.

2..

=+−+ xxxx

Este ecuación puede ser transformada en un sistema mediante el cambio de variables 2

.

1 , xxxx == . El sistema resultante será:

2

.

1 xx =

1212

.

2 )1( xxxx −−= Para buscar sus soluciones aproximadas crearemos una función que llamaremos vdpol.m como la siguiente: function dx = vdpol(t,x) dx=[ x(2) ; x(2).*(1 – x(1).^2) – x(1) ] Para simular, finalmente, la solución de la ecuación diferencial de la ecuación de Van der Pol en el intervalo 200 ≤≤ t , con las condiciones iniciales 0)0(,3/1)0( 21 == xx , es suficiente escribir en el espacio de trabajo las siguientes instrucciones: >> ti=0 ; tf=20 ; x0=[1/3 0] ; >> [ t , x ] = ode23( 'vpol ', t0 , tf , x0 ); >> plot(t,x) Algunas ecuaciones no lineales tienen un comportamiento extraordinariamente complejo tal como puede apreciarse resolviendo el siguiente sistema debido a Lorenz:

51

xyzz

xzyxy

xyx

+−=

−−=

−=

38

28

)(10

.

.

.

Para la simulación de sus soluciones crearemos la función loren.m, que describimos a continuación: function dx = loren ( t , x ) dx=[ 10*(x(2)-x(1)) ; 28*x(1)-x(2)-x(1)*x(3) ; (-8/3)*x(3)+x(1)*x(2) ]; Vamos a simular su solución aproximada en el intervalo de tiempo 200 ≤≤ t , con las condiciones iniciales 20)0(,4.0)0(,2.0)0( 321 === xxx . Para ello es suficiente escribir en el espacio de trabajo las siguientes instrucciones: >> ti=0 ; tf=20 ; x0=[0.2 0.4 20] ; >> [ t , x ] = ode23( 'loren' , t0 , tf , x0 ); El resultado que se almacena en la variable y es una matriz de tres columnas, cada una de las cuales corresponde con la respectiva variable del sistema. La complejidad de la solución se contempla por medio de los siguientes gráficos. Trayectorias de las distintas variables frente al tiempo: >> plot(t , x(:,1)) >> plot(t , x(:,2)) >> plot(t , x(:,3)) Representación bidimensional de cada una de las variables frente a otra: >> plot(x(:,1) , x(:,2)) >> plot(x(:,1) , x(:,3)) >> plot(x(:,2) , x(:,3)) Espacio de fases tridimensional: >> plot3(x(:,1) , x(:,2) , x(:,3))

52

5.2 ECUACIONES DIFERENCIALES

Muchos problemas de las ciencias aplicadas pueden formularse, matemáticamente, por medio

de la determinación de una función desconocida que satisface una relación determinada entre

ella y sus derivadas. Surgen, de este modo, ecuaciones cuyas incógnitas no representan algún

tipo de número sino una función. Tales ecuaciones se denominan ecuaciones diferenciales.

Consideremos, como ejemplo específico, la ecuación diferencial

)(1.0 22 yxdxdy

−=

Para que esta ecuación tenga solución única es necesario imponer una condición inicial que

especifique el valor de la función incógnita )(xy para un determinado valor 0x , es decir,

00 )( yxy = . En este caso la ecuación diferencial se transforma en un problema de valores

iniciales como, por ejemplo, el siguiente:

1)0(,)(1.0 22 =−= yyxdxdy (5.1)

EL MÉTODO DE EULER

MATLAB cuenta con potentes instrucciones propias para resolver numéricamente

ecuaciones diferenciales que emplearemos más adelante. No obstante, con el fin de

ejercitar las instrucciones ya examinadas, vamos a programar un sencillo algoritmo para

resolver, numéricamente, ecuaciones diferenciales conocido como método de

aproximación de Euler.

Consideremos un problema de valores iniciales de la forma

00 )(,),(' yxyyxfy == (5.2)

Sea )(xy φ= la solución que deseamos buscar. Podemos considerar que una primera

aproximación a dicha solución en un punto 1x cercano a 0x es la recta tangente a )(xy φ= , cuya

pendiente tendrá el valor ),()(' 000 yxfx =φ , por satisfacer la ecuación diferencial (5.2).

El valor aproximado 1y de )( 1xφ , puede obtenerse, según indica la Figura 5.5, de la forma

))(,())((' 0100001001 xxyxfyxxxyy −+=−+= φ .

Una vez calculado 1y es posible obtener el valor aproximado 2y de la solución en otro

punto 2x cercano a 1x , y así sucesivamente. En general la sucesión de puntos que se aproxima a

la solución puede obtenerse de forma recursiva mediante la expresión

))(,( 11 nnnnnn xxyxfyy −+= ++ ,

53

según se muestra en la Figura 5.5.

Si consideramos una separación uniforme entre los puntos ix en los que aproximamos la

solución, la expresión anterior toma la forma

hyxfyy nnnn ),(1 +=+ . (5.3)

El siguiente programa que mostramos a continuación y que hemos denominado euler.m

permite encontrar la solución aproximada del problema de valores iniciales (5.1) empleando el

algoritmo de Euler que se muestra en (5.3).

%METODO DE EULER PARA RESOLVER ECUACIONES DIFERENCIALES

%y'=f(x,y);

%Cada nueva función f(x,y) debe introducirse en el FOR

h=0.1;n=25;x0=0;y0=1;

x =[ ] ; y =[ ] ; x(1) = x0 ; y(1) = y0;

for i=1:n

y(i+1)=y(i)+0.1*(x(i)^2-y(i)^2)*h;

x(i+1)=x(i)+h;

end

plot(x,y)

La representación gráfica de la solución obtenida que se obtiene mediante la instrucción

0y

1y

2y

3y

0x 1x 2x 3x

( )xy φ=

y

54

plot(x,y) se muestra en la Figura 5.6.

0 0.5 1 1.5 2 2.5 30.9

0.95

1

1.05

1.1

1.15

1.2

1.25Método de Euler

Figura 5.6

Téngase en cuenta que para resolver numéricamente otra nueva ecuación como, por ejemplo la

)42(3 22 yxdxdy

−= , sería preciso introducir la nueva forma funcional dentro del bucle for del

programa anterior.

5.2.2 LAS FUNCIONES ODE23 ODE45 MATLAB posee dos instrucciones específicas, para resolver tanto ecuaciones diferenciales

como sistemas de ecuaciones diferenciales ordinarias. En ambas instrucciones se hace uso de

algoritmos mucho más potentes que el método de Euler visto anteriormente.

Las funciones ode23 y ode45 obtienen la solución aproximada, tanto de ecuaciones

diferenciales como de sistemas, empleando métodos de Runge-Kutta de segundo y tercer orden

o cuarto y quinto orden respectivamente. El funcionamiento de ambas funciones es similar.

Ejemplo. Supongamos que queremos resolver el problema de valores iniciales (5.1). El primer

paso es crear un archivo.m, que llamaremos ecua.m donde describiremos la función que da

lugar a la ecuación diferencial:

function yprima=ecua(x,y)

%Esta función evalúa la ecuación diferencial

yprima=0.1*(x^2-y^2);

55

Para resolver la ecuación diferencial es preciso teclear en el espacio de trabajo la función:

» [x, y]=ode23('ecua',ti, tf, X0);

o bien

» [x, y]=de45('ecua', ti, tf, X0);

En ambos casos las funciones requieren cuatro entradas que son:

• El nombre del archivo.m que describe la ecuación escrito entre comillas simples.

• El valor inicial ti donde comienza la integración.

• El valor final tf donde finaliza la integración.

• La condición inicial X0 que deseemos emplear.

Además se dispone de dos salidas que son los vectores columna x e y.

• En x son almacenados los valores de la variable independiente donde se ha calculado la

solución.

• En y son almacenados los valores de la solución que se corresponde con los valores de

x.

Ejemplo. La integración que corresponde a la elección ti=0, tf=10, X0=1, es

» [ x , y ] =ode23 ( 'ecua' , 0 , 10, 1 )

La solución obtenida puede entonces ser examinada gráficamente si escribimos plot(x,y) o

también plot(y), tal como muestra la Figura 5.7.

0 2 4 6 8 10 12 141

2

3

4

5

6

7

8

9

10Trayectoria de la ecuación diferencial (5.1)

Figura 5.7

Sea ahora una ecuación diferencial que depende de diversos parámetros

1)0(,)( 22 =−= ycybxadxdy .

56

Si queremos resolver esta ecuación para diferentes valores de los parámetros, MATLAB

permite los cambios de valores en los parámetros sin necesidad de acceder al archivo en el bloc

de notas. Para ello es suficiente añadir la instrucción global, tal como se muestra a

continuación.

function yprima=ecua(x,y)

%Esta función evalúa la ecuación diferencial

global a b c

yprima=a*(b*x^2–c*y^2);

En tal caso la introducción de los valores a=0.2, b=4 y c=3, se realizará, simplemente,

escribiendo en la pantalla del espacio de trabajo:

» global a b c

» a=0.2; b=4; c=3;

Ejercicio. Resolver las siguientes ecuaciones diferenciales con las condiciones iniciales que se

especifican.

a) 21.1 += xdtdx , con la condición inicial x(0)=0.

b) )sen(1.1 2 txdtdx

+= , con la condición inicial x(0)=-1.

c) 42 2 += tdtdx , con la condición inicial x(0)=1.

A continuación consideraremos diversos ejemplos prácticos que ilustran el uso de las

ecuaciones diferenciales y su resolución por medio de MATLAB.

5.2.3 MODELOS DE CRECIMIENTO POBLACIONAL Consideremos una población que tiene )(tx individuos en el instante t . Llamemos ),( xtr a tasa

de crecimiento de la población, es decir, la diferencia entre su tasa de nacimientos y mortalidad.

La tasa de cambio respecto al tiempo de dicha población obedecerá, entonces, a la siguiente

ecuación diferencial

xxtrdtdx ),(= .

Existe multitud de formas de concretar la función ),( xtr . La más sencilla consiste en

suponer que axtr =),( , siendo a una constante. En este caso estaremos en presencia de la

57

ecuación

axdtdx

= .

Otra forma más sofisticada de especificar la tasa de crecimiento de la población es suponer

que ),(),( xbaxtr −=

es decir, que dicha tasa de crecimiento es proporcional a la distancia que separa el tamaño de la

población de un determinado parámetro b . En tal caso la evolución de la población, a través del

tiempo, queda recogida por medio de la ecuación diferencial

xxbadtdx )( −= .

Como es lógico, el tamaño que adquiere una población en el transcurso del tiempo está muy

relacionado con el número de individuos del que inicialmente parte. Cualquiera de las

ecuaciones anteriores tiene, entonces, una infinidad de soluciones. Para garantizar la unicidad

de la solución es suficiente con imponer una determinada población inicial 0x en el instante 0t a

partir del que comience a contarse el tiempo. Las ecuaciones anteriores se transforman entonces

en problemas de valores iniciales de la forma:

00 )(, xtxaxdtdx

== , (5.4),

o bien

00 )(,)( xtxxbaxdtdx

=−= . (5.5)

Consideremos que los valores de los parámetros a y b son, respectivamente 05.0=a y

100=b , y que la población parte de un tamaño inicial 30 =x . Haciendo uso de las instrucciones

de MATLAB para resolver ecuaciones diferenciales, es fácil obtener las gráficas de la Figura

5.8 donde se muestra la evolución de una población durante 10 unidades de tiempo, siguiendo

los modelos (5.4) y (5.5).

58

1 2 3 4 5 6 7 8 9 10 113

3.2

3.4

3.6

3.8

4

4.2

4.4

4.6

4.8

5Trayectoria ecuación diferencial (5.4)

0 5 10 15 20 25 30 350

20

40

60

80

100

120Trayectoria ecuación diferencial (5.5)

5.2.5 Sistemas de ecuaciones diferenciales La forma de resolver los sistemas de ecuaciones diferenciales es análoga a las ecuaciones

ordinarias.

Supongamos que deseamos resolver el sistema

−−

−=

yx

yx

1111

(5.6)

junto con las condiciones iniciales x(0)=1, y(0)=3.

Primeramente crearemos una función para describir el sistema de ecuaciones diferenciales,

que podríamos llamar sis2x2.m.

function y=sis2x2(t, x)

%Esta función evalúa un sistema lineal de ecuaciones diferenciales

y=[-x(1)+x(2); -x(1)–x(2)];

A continuación formaremos un vector X0=[-1, 3] de condiciones iniciales, y eligiendo ti=0 y

tf=50, obtendríamos la solución de la forma:

59

» X0=[-1, 3];

» [t, y ]=ode23('sis2x2', [0, 50], X0)

En este caso la variable de salida t corresponde a los instantes de tiempo donde se ha calculado

la solución, mientras que y es una matriz de dos columnas, cada una de las cuales representa las

funciones x(t) e y(t) de la solución estimada por el programa. En este caso es posible visualizar

la solución a diversos niveles. Dibujando la primera columna de la y obtendremos la trayectoria

de x(t) con la instrucción

» plot(y(:, 1))

Dibujando la segunda columna de la y obtendremos la trayectoria de y(t) con la instrucción

» plot(y(:, 2))

El espacio de fases (x(t), y(t)) puede ser obtenido mediante

» plot(x(:, 1), y(:, 1))

tal como se muestra en la Figura 5.12.

-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8-0.5

0

0.5

1

1.5

2

2.5

3Sistema de ecuaciones diferenciales (5.6)

Figura 5.12

Podemos considerar los coeficientes de la matriz que define el sistema de ecuaciones

diferenciales como parámetros que pueden ser introducidos desde el exterior mediante el

comando global

function y=sis2x2(t, x)

%Esta función evalúa un sistema lineal de ecuaciones diferenciales

global a11 a12 a21 a22

y=[a11*x(1)+a12*x(2);a21*x(1)+a22*x(2)];

Ejercicio. Resolver numéricamente y dibujar el espacio de fases de los siguientes sistemas de

60

ecuaciones diferenciales. Discutir, previamente, la configuración del espacio de fases de cada

uno de estos sistemas encontrando sus autovalores y autovectores mediante el uso del comando

[V,D]=eig(A).

a)

=

yx

yx

0940

, con las condiciones iniciales x(0)=-1, y(0)=1.

b)

−−−

=

yx

yx

7412

, con las condiciones iniciales x(0)=1, y(0)=1.

c)

−−=

yx

yx

1331

, con las condiciones iniciales x(0)=2, y(0)=3.

d)

−−

−=

yx

yx

1111

, con las condiciones iniciales x(0)=-1, y(0)=2.

e)

+

−−

=

31

1220

yx

yx

, con las condiciones iniciales x(0)=-1, y(0)=1.

f)

+

−−

=

12

3511

yx

yx

, con las condiciones iniciales x(0)=-1, y(0)=0.

g)

+

−−

=

11

2512

yx

yx

, con las condiciones iniciales x(0)=-1, y(0)=1.

Obsérvese que si queremos tratar una ecuación diferencial de orden superior es preciso

convertirla en un sistema, en forma normal, mediante un cambio de variables. MATLAB es

especialmente eficiente en el tratamiento de sistemas y ecuaciones no lineales.

Ejemplo. Consideremos la ecuación no lineal, de segundo orden, conocida como ecuación de

Van der Pol

0)1( 2 =+−+ xxxx .

Esta ecuación puede ser transformada en un sistema mediante el cambio de variables

21 , xxxx == . El sistema resultante será:

12122

21

)1( xxxx

xx

−−=

=

Buscaremos sus soluciones aproximadas creando una función que llamaremos vdpol.m como la

siguiente.

function y=vdpol(t,x)

y=[ x(2) ; x(2).*(1 – x(1).^2) – x(1) ]

Para simular la solución de la ecuación diferencial de la ecuación de Van der Pol en el intervalo

61

200 ≤≤ t , con las condiciones iniciales 0)0(,3/1)0( 21 == xx , es suficiente escribir en el espacio

de trabajo, para obtener la representación gráfica de las trayectorias de las variables contenidas

en y que se muestra en la Figura 5.13, las siguientes instrucciones

» ti=0 ; tf=20 ; x0=[1/3 0] ;

» [t, y]=ode23('vdpol', [ti, tf], x0);

» plot(t,y)

0 2 4 6 8 10 12 14 16 18 20-3

-2

-1

0

1

2

3Trayectorias de la ecuación diferencial de Van der Pol

Figura 5.13

Como se observa en la Figura 5.14 las trayectorias del sistema son atraídas, con el transcurso

del tiempo, hacia una curva del espacio de fase de las variables almacenadas en y que se

denomina ciclo límite.

-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5-3

-2

-1

0

1

2

3Espacio de fases tridimensional: ecuación de Van der Pol

Figura 5.14

El tratamiento de los sistemas 3x3 y, en general, nxn se realiza de forma completamente análoga

a los sistemas 2x2.

5.2.6 El atractor de Lorenz Algunas ecuaciones no lineales tienen un comportamiento extraordinariamente complejo, tal

62

como puede apreciarse resolviendo el siguiente sistema debido a Lorenz

xyzz

xzyxyxyx

+−=

−−=−=

38

28)(10

Para la simulación de sus soluciones crearemos la función lorenz.m, que describimos a

continuación.

function y=lorenz(t, x)

y=[ 10*(x(2)-x(1)) ; 28*x(1)-x(2)-x(1)*x(3) ; (-8/3)*x(3)+x(1)*x(2) ];

Vamos a simular su solución aproximada en el intervalo de tiempo 200 ≤≤ t , con las

condiciones iniciales 20)0(,4.0)0(,2.0)0( 321 === xxx . Para ello es suficiente escribir en el

espacio de trabajo las instrucciones

» ti=0; tf=20; x0=[0.2 0.4 20];

» [t, y ]=ode23('lorenz', [t0, tf], x0);

El resultado que se almacena en la variable y es una matriz de tres columnas, cada una de las

cuales corresponde con la respectiva variable del sistema. La complejidad de la solución se

contempla por medio de los siguientes gráficos.

Las trayectorias de las distintas variables frente al tiempo se escriben como

» plot(t, y(:,1)), plot(t , y(:,2)), plot(t, y(:,3))

0 2 4 6 8 10 12 14 16 18 20-20

0

20Trayectorias de las distintas variables frente al tiempo

0 2 4 6 8 10 12 14 16 18 20-50

0

50

0 2 4 6 8 10 12 14 16 18 200

20

40

60

Figura 5.15

Y la representación bidimensional de cada una de las variables frente a otra se expresa

63

» plot(y(:,1), y(:,2)), plot(y(:,1), y(:,3)), plot(y(:,2), y(:,3))

-20 -15 -10 -5 0 5 10 15 20-50

0

50Trayectorias de las distintas variables enfrentadas

-20 -15 -10 -5 0 5 10 15 200

20

40

60

-25 -20 -15 -10 -5 0 5 10 15 20 250

20

40

60

Figura 5.16

Espacio de fases tridimensional:

» plot3(y(:,1), y(:,2), y(:,3))

-20-10

010

20

-40-20

020

400

10

20

30

40

50

Figura 5.17

Debido a la complejidad que presentan las trayectorias del espacio de fase del sistema de

Lorenz, a tal configuración se le denomina un atractor extraño. En este caso las trayectorias son

atraídas, no hacia un ciclo límite como ocurrían en el sistema de Van der Pol sino, hacia una

región del espacio de fase de carácter extraño e indefinido. Se dice, entonces, que la evolución

de las variables, respecto al tiempo, es de tipo caótico.

Espacio de fases tridimensional