Vous êtes sur la page 1sur 94

Octave

Practicas con Octave


Indice general

1. Un lenguaje de programacion 4

1.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2. Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.1. Operacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2.2. Logicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

1.3. Comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.1. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.2. Aritmeticos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

1.3.3. Algebraicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2. Matrices, submatrices, determinantes, sistemas de ecuaciones 9

2.1. Calculo matricial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.1.1. Comandos generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.1.2. Tipos de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.1.3. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

2.2. Sistemas de ecuaciones. Metodos directos . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2.1. Solucion de sistemas Compatibles Determinados . . . . . . . . . . . . . . . . . . . 12

2.2.2. Solucion de sistemas Compatibles Indeterminados . . . . . . . . . . . . . . . . . . 12

2.2.3. Algoritmo de eliminacion de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2.2.4. Consideraciones importantes sobre sistemas . . . . . . . . . . . . . . . . . . . . . . 14

3. Ecuaciones no Lineales 20

3.1. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.2. Representacion grafica de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

1
Practicas con Octave 2

3.3. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.4. Interpolacion Polinomica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.5. Ecuaciones no lineales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.6. Sistemas de Ecuaciones no lineales. Metodo de Newton. . . . . . . . . . . . . . . . . . . . 28

4. Sistemas de ecuaciones lineales 30

4.1. Solucion de sistemas de ecuaciones con metodos iterativos . . . . . . . . . . . . . . . . . . 30

4.1.1. Metodo de Jacobi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

4.1.2. Metodo de Gauss-Seidel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

5. Autovalores, autovectores de una matriz 34

5.1. Calculo por metodos directos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

5.2. Calculo por metodo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

6. Derivacion e Integracion 39

6.1. Derivacion e Integracion con Symbolic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

6.2. Derivadas numericas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.3. Integracion Numerica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

7. Ecuaciones Diferenciales 44

7.1. Campo de direcciones de una ecuacion diferencial . . . . . . . . . . . . . . . . . . . . . . . 44

7.2. Problemas de Valor Inicial. Ecuaciones Diferenciales . . . . . . . . . . . . . . . . . . . . . 46

7.2.1. Usando Symbolic. Con Dsolve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

7.2.2. Usando la orden Lsode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

7.2.3. Usando Metodos numericos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

7.3. Sistemas de Ecuaciones Diferenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

7.3.1. Ecuacion de Orden Superior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

7.3.2. Usando Symbolic. Con Dsolve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

7.3.3. Resolucion con lsode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

7.3.4. Resolucion por Metodos Numericos . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

7.3.5. Metodos de Runge-Kutta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

7.4. Problemas de Valor Inicial y de Contorno . . . . . . . . . . . . . . . . . . . . . . . . . . . 80


7.4.1. Problemas de transporte estacionario 1-dimensionales . . . . . . . . . . . . . . . . 80

7.4.2. Problemas de difusion evolutiva 1-dimensionales . . . . . . . . . . . . . . . . . . . 80

8. Otros comandos y funciones utiles 81

8.0.1. Los comandos max y min . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

8.0.2. Calculo de posiciones. El comando find. . . . . . . . . . . . . . . . . . . . . . . . . 81

9. Transformada de Laplace. Funciones definidas a trozos. La funcion Heaviside 83

9.0.1. Transformada de Laplace. Funciones definidas a trozos. La funcion Heaviside . . . 83

9.1. Transformada de Laplace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

10.Analisis Vectorial 85

10.0.1. Representacion de Campos Vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . 85

10.0.2. Representacion de curvas y superficies . . . . . . . . . . . . . . . . . . . . . . . . . 87

10.0.3. Calculos de gradiente, divergencia, rotaciona. Representaciones. . . . . . . . . . . . 91


Captulo 1

Un lenguaje de programacion

1.1. Introduccion

Octave es un lenguaje de programacion de alto nivel especializado en calculos numericos. Al iniciar


el programa, ya sea en un entorno grafico o por lnea de comando, nos encontraremos con algun mensaje
de bienvenida y la lnea de comando en blanco para comenzar a trabajar.

Existen dos maneras de trabajar con Octave: de forma directa, ingresando comandos por la lnea de
comandos, o bien generando un programa en el editor. Un programa es un archivo de texto plano que
contiene una serie de instrucciones que octave puede interpretar y ejecutar, de extension .m.

1.2. Operadores

1.2.1. Operacionales
1. Suma, resta, multiplicacion, division
>> 8 + 2 (13 3) + 15/5
ans = 31
2. Raz cuadrada
>> sqrt(25)
ans = 5
3. Potencia
>> 3 2
ans = 9
>> 5 2
ans = 25
4. Exponencial y logaritmo neperiano
>> exp(log(2))
ans = 2

4
Practicas con Octave 5

5. Razones trigonometricas, sin, cos, tan, asin, acos, atan


>> sin(pi)
ans = 0

6. Valor absoluto
>> abs(-20.14)
ans = 20,14

1.2.2. Logicos

En Octave el valor verdadero viene representado por un 1 y el valor falso por un 0

1. Asignacion de igualdad
>> a = 3
a=3
2. Comparacion de igualdad
>> 7 == 3
ans = 0
>> 7 == 7
ans = 1
3. Comparacion de desigualdades; menor <, menor igual <=, mayor >, mayor igual >=
>> 9 >= 7
ans = 1
4. Distinto
>> 5! = 5
ans = 0
5. Conjuncion
>> a = 6; (a < 9)&(a! = 4)
ans = 1

6. Disyuncion
>> a = 5; (a > 7)|(a < 6)
ans = 1
7. Negacion
>> a = 5; !((a < 3)|(a = 1))
ans = 1
Practicas con Octave 6

1.3. Comandos

1.3.1. Generales
1. Borrar la ventana de comandos
>> clc
2. Borrar la memoria
>> clear
3. Salir del programa
>> exit
4. Muestra mas cifras decimales
>> format long
5. Muestra menos cifras decimales
>> format short
6. No muestra por pantalla el resultado
>> 5;

1.3.2. Aritmeticos
7. Mayor entero que sea menor o igual a x
>> floor(3,254)
ans = 3
8. Menor entero que sea mayor o igual a x
>> ceil(3,254)
ans = 4
9. Parte entera de x
>> fix(7,254)
ans = 7

10. Redondea al entero mas proximo a x


>> floor(3,854)
ans = 4
11. Devuelve el resto de la division
>> rem(8, 5)
ans = 3
12. Devuelve la descomposicion en factores primos
>> factor(306)
ans = 2 3 3 17
Practicas con Octave 7

13. Devuelve el maximo comun divisor


>> gcd(36, 14)
ans = 2

14. Devuelve el mnimo comun multiplo


>> lcm(36, 14)
ans = 252
15. Calcula el factorial de un numero
>> factorial(6)
ans = 720
16. Dice si es un numero primo
>> isprime(29)
ans = 1
17. Devuelve los numeros primos menores de 11
>> primes(11)
ans = 2 3 5 7 11

1.3.3. Algebraicos
1. Vectores
>> [8, 5, 1]
ans = 8 5 1

2. Vectores, mediante rangos


>> [8 : 12]
ans = 8 9 10 11 12
>> [8 : 2 : 12]
ans = 8 10 12
>> linspace(1 : 4 : 6)
ans = 1 1,6 2,2 2,8 3,4 4,0

3. Matrices
>> [8, 5, 1; 3, 7, 4]
8 5 1
ans =
3 7 4
4. Genera una matriz aleatoria 3x2 con numeros entre 7 y 10
>> randi([7, 10], 3, 2)
8 5
ans = 1 9
3 6
Practicas con Octave 8

5. Genera una matriz aleatoria 3x2 con numeros entre 0 y 1


>> rand(3, 2)
0,12 0,01
ans = 0,20 0,06
0,70 0,12

6. Construye una matriz cuyo polinomio caracterstico tiene de coeficientes los del polinomio [1,2,3]
>> compan[(1, 2, 3)]
2 3
ans =
1 0
7. Longitud de un vector o de una matriz, numero de columnas
>> length([2, 5, 1])
ans = 3
8. Dimension de un vector o de una matriz, numero de filas y columnas
>> size([2, 5, 1])
ans = 1 3
9. Suma los elementos de un vector
>> sum([8, 5, 1])
ans = 14

10. Suma los elementos de cada columna de una matriz


>> sum([8, 5; 2, 4])
ans = 10 9
11. Suma los elementos de cada fila de una matriz
>> sum([8, 5; 2, 4], 2)
13
ans =
6
12. Producto escalar de dos vectores
>> dot([8, 5, 1], [1, 1, 0])
ans = 3

13. Norma de un vector


>> norm([1, 1, 0])

ans = 2
Captulo 2

Matrices, submatrices,
determinantes, sistemas de
ecuaciones

2.1. Calculo matricial

2.1.1. Comandos generales


1. Extraer el elemento a12 de la matriz A
>> A = [8, 5; 2, 4]; A(1, 2)
ans = 5 9
2. Extraer la segunda fila
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A(2, :)
ans = 2 4 4

3. Extraer la tercera columna


>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A(:, 3)
1
ans = 4
3
4. Submatriz fila de 2 a 3 y columna de 2 a 4
>> A = [8, 5, 1, 7; 2, 4, 4, 3; 7, 1, 3, 1]; A(2 : 3, 2 : 4)
4 4 3
ans =
1 3 1
5. Submatriz fila 1 y 3 y columna 2 y 4
>> A = [8, 5, 1, 7; 2, 4, 4, 3; 7, 1, 3, 1]; A([1, 3], [2, 4])
5 7
ans =
1 1

9
Practicas con Octave 10

6. Borra la 3a fila
>> A = [8, 5, 1, 7; 2, 4, 4, 3; 7, 1, 3, 1]; A(3, :) = []
8 5 1 7
ans =
2 4 4 3
7. Unir matrices en filas
>> [A, B]
8. Unir matrices en columnas
>> [A; B]
9. Unir matrices por bloques
>> blkdiag(A, B)

2.1.2. Tipos de matrices


1. Matriz nula
>> zeros (2,3) o zeros(3) si es cuadrada
0 0 0
ans =
0 0 0
2. Matriz de unos
>> ones (2,3) o ones(3) si es cuadrada
1 1 1
ans =
1 1 1
3. Matriz unidad
>> eye (3)
1 0 0
ans = 0 1 0
0 0 1
4. Matriz daigonal
>> diag ([3,-1,5)
3 0 0
ans = 0 1 0
0 0 5
5. Matriz traspuesta
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A.
8 2 7
ans = 5 4 1
1 4 3
6. Matriz inversa
>> A = [2, 1; 1, 1]; inv(A)
1 1
ans =
1 2
Practicas con Octave 11

7. Matriz triangular superior


>> triu(A)
2 1
ans =
0 1
8. Matriz triangular inferior
>> tril(A)
2 0
ans =
1 1

2.1.3. Operaciones con matrices


1. Multiplicar
>> A B
2. Potencia
>> A 3
3. Determinante de una matriz
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; det(A)
ans = 148
4. Rango de una matriz
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; rank(A)
ans = 3
5. Traza de una matriz
>> trace(A)
ans = 15
6. Sumar una constante a todos los elementos de la matriz
>> A+10
7. Multiplica por 6 la Fila 1
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A(1, :) = 6 A(1, :)
48 30 6
ans = 2 4 4
7 1 3
8. Cambia la Fila 1 y la Fila 2
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A([1, 2], :) = A([2, 1], :)
2 4 4
ans = 8 5 1
7 1 3
9. Multiplica por 6 la Fila 2 y le suma 3 veces la Fila 1, dejandola en la Fila 2
>> A = [8, 5, 1; 2, 4, 4; 7, 1, 3]; A(2, :) = 6 A(2, :) + 3 A(1, :)
8 5 1
ans = 36 39 27
7 1 3
Practicas con Octave 12

2.2. Sistemas de ecuaciones. Metodos directos

2.2.1. Solucion de sistemas Compatibles Determinados



1 0 1 8
Sea A = 1 1 2 la matriz de los coeficiente y B = 0 , la matriz de los terminos
0 1 1 1
independiente.

Viendo que rank(A) = 3 resolvemos el sistema mediante Octave.

>> inv(A) B

13
ans = 3
5

Tambien podemos unir las matrices A y B y aplicar el metodo de GAuss-Jordan con el comando rref
(reduce row echelon from)

>> Ampliada = [A, B]

>> rref (Ampliada)



1 0 0 13
ans = 0 1 0 3
0 0 1 5

2.2.2. Solucion de sistemas Compatibles Indeterminados

Estudiar y resolver el sistema



3x + 4y z + 2t + 4s = 12
x y 2z t s = 6
x + 2y 5z + 4t + 2s = 8


3 4 1 2 4 12
Sea A = 1 1 2 1 1 la matriz de los coeficiente y B = 6 , la matriz de los
1 2 5 4 2 8
terminos independiente.

>> Ampliada = [A, B]

>> rref (Ampliada)

Obtenemos la matriz escalonada reducida



1 0 9 0 0 16
0 1 7 0 1 8
0 0 0 1 0 2

Las incognitas son x, y, t la z y la s son parametros y la solucion viene dada por:


Practicas con Octave 13


x 9z 16
y = 7z s 8 z, s R
t 2

2.2.3. Algoritmo de eliminacion de Gauss

Construimos una funcion que calcule un sistema de ecuaciones empleando el metodo de eliminacion
de Gauss

o bien, esta otra, empleando la matriz ampliada


Practicas con Octave 14

2.2.4. Consideraciones importantes sobre sistemas

Para calcular la solucion de un sistema compatible determinado A x = b, podemos usar la orden

sol=inv(A)*b

que equivale a escribir

Ab

Pero hay que tener cuidado con el operador  ya que no siempre coincide con lo dicho.

Si tenemos el sistema sobredeterminado



x+y =1
2x y = 3 ,
2x + 4y = 1

Estudiando los rangos o bien con la orden rref podemos ver que es incompatible, pero si hacemos:

A=[1 1;2 -1;2 4]

b=[1;3;1]

Ab

nos da una solucion

ans =

1.31429

-0.38571

Que evidentemente no puede ser correcta, en efecto,

A*ans nos da

ans =

0.92857

3.01429

0.54286

No coincide con b, aunque son valores aproximados. que ha pasado?

En primer lugar parece haber calculado la inversa de una matriz 3x2 lo cual no tiene sentido ma-
tematico. Si escribimos

inv(A)

nos dira que no puede calcularla porque no es ua matriz cuadrada, entonces que operacion ha hecho?

Realmente el operador  , cuando la matriz no es cuadrada calcula la pseudoinversa, que en realidad


consiste en hacer las siguientes operaciones

Amxn xnx1 = bmx1


Practicas con Octave 15

Multiplicando por la traspuesta de A por la izquierda

At A x = At b

At A es siempre un matriz cuadrada, en nuestro caso nxn, si tiene inversa, podemos hacer

x = (At A)1 At b

A la matriz (At A)1 At , que existira cuando (At A) tenga inversa, la llamamos pseudoinversa por la
izquierda. Es una matriz que cumple que M.A = I, pero no A.M = I, ya que este ultimo producto ni
siquiera tiene sentido si estudiamos las dimensiones

De forma similar se puede calcular la pseudoinversa por la izquieda.

La pseudoinversa de una matriz se puede calcular con el comando pinv, aunque en Octave, cuando la
matriz A no es cuadrada la orden

Ab

calcula

s=pinv(A)*b

que no es la solucion, pero puede ser una aproximacion a la solucion, ya que lo que realmente estamos
haciendo es aproximar por mnimos cuadrados.

Graficamente, en nuestro ejemplo anterior, son tres rectas que no se cortan, pero los puntos de corte
de cada par de ellas esta proximo, de ah que consigamos una aproximacion de la solucion relativamente
aceptable.


x+y =1
Si repetimos lo anterior con el sistema 2x y = 3 ,
xy =5

las soluciones seran peores aproximaciones, ya que los puntos de corte de las tres rectas estan muy
separados
Practicas con Octave 16

A=[1 1;2 -1;1 -1];b=[1; 3 ;5] Ab

ans =

1.5714

-1.2857

A*ans

ans =

0.28571

4.42857

2.85714

Tambien es importante ver que ocurre con sistemas compatibles indeterminados, donde aunque la
matriz de los coeficientes fuese cuadrada, no tiene inversa

x+y =1
,
2x + 2y = 2

es un sistema compatible indeterminado de infinitas soluciones, (, 1 ). Sin embargo la orden

Ab

en este caso nos dara una unica solucion

ans =

0.50000

0.50000

Pero, no nos ha dado una solucion cualquiera, nos ha dado la solucion s que cumple que k s k sera
Practicas con Octave 17

mnimo.

La pseudo inversa puede utilizarse para hacer una aproximacion por mnimos cuadrados, supongamos
que tenemos unos datos sobre unas tensiones ejercicidas sobre un cuerpo y el aumento en la longitud que
producen

Tensiones 0 0,06 0,14 0,25 0,31 0,47 0,6 0,7
,
Alargamientos 0 0,08 0,14 0,20 0,23 0,25 0,28 0,29

Buscamos si existe una relacion lineal entre las variables y = x1 T + x2 siendo T las tensiones y y
los alargamientos, para ello construimos las matrices

A=[0 1; 0.06 1;0.14 1;0.25 1;0.31 1;0.47,1;0.6 1;0.7 1]

b=[0;0.08;0.14;0.2;0.23;0.25;0.28;0.29]

y planteamos el sistema A x = b que resolvemos con

xs=pinv(A)*b

Obtenemos

xs =

0.374099

0.065441

El mismo resultado hubiesemos conseguido con la orden de interpolacion polinomica de octave polyfit
polyfit(A(:,1),recta(A(:,1),xs(1),xs(2)),1)

Por tanto la recta que mejor aproxime esos puntos, recta regresion, sera Y = 0,374099 X + 0,065441,
la representamos tomando como puntos sobre el eje x los valores de las tensiones.

figure 1

Primero dibujamos los puntos en rojo con un asterisco con la orden

plot(A(:,1),b,r*)

y en la misma grafica, la recta, que definimos con parametros, as hacemos el programa mas general
para cuando quiera aplicarla a otros conjuntos de puntos

recta=inline(p1.*x+p2,x,p1,p2)

hold on

plot(A(:,1),recta(A(:,1),xs(1),xs(2)),b)
Practicas con Octave 18

Resultara

Observando la grafica se aprecia que una aproximacion por una parabola puede ser mas exacta, para
hacerlo tomamos una nueva matriz 8x3 donde la primera columna sean los valores de las tensiones al
cuadrado. Para no hacerlo manualmente podemos teclear

A1=[(A(:,1)).2 ];

B=[A1 A];

La resolvemos como antes

ys=pinv(B)*b

obteniendo los coficientes de la parabola

ys =

-0.739870

0.889101

0.018426

Hubiesemos conseguido lo mismo con la orden de interpolacion polinomica de Octave

polyfit(B(:,2), parabola(B(:,2),ys(1),ys(2),ys(3)),2)

La parabola sera Y = 0,739870 X 2 + 0,889101 X + 0,018426

La representamos, los puntos como antes, la parabola en verde usando los puntos de las tensiones y
finalmente dibujamos la parabola en azul tomando mas valores para que se aprecie que es una parabola

figure 2

parabola=inline(p1.*x.2 +p2.*x+p3,x,p1,p2,p3);

plot(B(:,2),b,r*)
Practicas con Octave 19

hold on

plot(B(:,2), parabola(B(:,2),ys(1),ys(2),ys(3)),g)

t=[0:0.01:0.7];

yt=parabola(t,ys(1),ys(2),ys(3));

plot(t,yt,b)

Obteniendo
Captulo 3

Ecuaciones no Lineales

3.1. Funciones

En Octave existen tres tipos de funciones: las funciones anonimas, funciones en linea y las funciones
definidas mediante el comando function, utilizaremos esta ultima para definir expresiones mas complejas.
En su forma mas sencilla tiene la siguiente sintaxis:

function nombre

comandos

endfunction

Donde nombre es el nombre con el que llamaremos a la funcion 1 . La guardaremos en un fichero con
la extension .m y con el mismo nombre que el nombre de la funcion.

3.2. Representacion grafica de funciones

Para realizar una grafica Octave necesita dos vectores de la misma longitud, uno x = (x1 , x2 , . . . , xn )
con las coordenadas del eje x y otro y = (y1 , y2 , . . . , yn ) con las coordenadas del eje y. De esta manera
puede construir los pares (xi , yi ) y dibujar mediante interpolacion de los pares (xi , yi ).

Para dibujar una coleccion de puntos, por ejemplo tomando los puntos (1, 2), (1, 4), (2, 8), (3, 1)
escribimos

x = [-1, 1, 2, 3]
y = [2, 4, 8, 1]
plot(x,y)

Despues de cada pareja de vectores(x, y) podemos anadirle atributos o detalles de color, forma,
etc. Por ejemplo:
1 No utilizar tildes, espacios, la letra n y caracteres extranos o reservados.

20
Practicas con Octave 21

b - blue
r - red
g - green
k - black
o - dibuja crculos
x - dibuja cruces
- - dibuja un recta entre dos puntos sucesivos.

Prueba como ejemplo con los siguientes comandos


plot(x,y,r)
plot(x,y,or)
plot(x,y,g-)

Para dibujar la grafica de un funcion en un intervalo [a,b] creamos un vector con numerosos
puntos entre a y b con los comandos

[a:n:b] Crea un vector con entradas desda a hasta b, con pasos de n en n


linspace(a,b,n) Crea un vector con n entradas equiespaciadas entre a y b

Ejemplo. La grafica de f (x) = x2 + x + 1 en el intervalo [2, 2]

f = inline(x. 2+x+1,x)
I = [-2:0.01:2]
plot(I,f(I))

Prueba a dibujar f (x) usando el intervalo J=[-2:1:2] Que ocurre?

Presentacion de graficas
Para dibujar varias funciones en la misma ventana se van anadiendo al comando plot de dos
en dos:
f = inline(x.*sin(x),x);
g = inline(sin(x)./x,x);
I = [-5:0.01:5];
plot(I,f(I),b,I,g(I)),ok)
Para mostrar distintas graficas en distintas ventanas se usa el comando figure antes de
cada plot:
figure(1)
f = inline(x.*sin(x),x);
figure(2)
g = inline(sin(x)./x,x);

Para mostrar varias subventanas en la misma imagen utilizamos el comando subplot(filas,cols,index):


Practicas con Octave 22

f = inline(x.*sin(x),x);
g = inline(sin(x)./x,x);
I = [-5:0.001:5];
subplot(2, 1, 1) Crea una matriz de 2 filas y 1 columna
plot(I,f(I)); Dibuja f en la primera casilla
subplot(2, 1, 2) Activa la segunda casilla
plot(I,g(I)); Dibuja g en la segunda casilla

Podemos anadir despues de cada plot comandos para incluir un ttulo, nombres en los ejes, leyendas,
etc.
f1 = inline(cos(x),x);
f2 = inline(sin(x),x);
I = [-5:0.01:5];
plot(I,f1(I),I,f2(I))
title(Funciones seno y coseno)
legend(cos(x),sin(x))
xlabel(eje x)
ylabel(eje y)

El comando fplot puede dibujar directamente una funcion conocida sin definir ningun vector,
fplot (fun,limites,numero de puntos)
probamos
fplot(1/(1+x**2),[-10,10],10);
fplot(1/(1+x**2),[-10,10]);
fplot(@cos,[-pi,pi]);
fplot([cos(x),sin(x)],[0,2*pi]);
fplot([x**3-3*x+2,1-x**2],[-4,4]);
o bien definiendo la funcion con @(x)
f1=@(x) 1./x;
fplot(f1,[-1,1]);
ezmesh (@(x, y) x.**2 - y.**2 - 1);

3.3. Polinomios

Un polinomio en Octave se puede representar como un vector, p(x) = x5 + 6 x3 + 2 x2 2 x + 1 se


puede escribir como una funcion como ya hemos visto, pero cuando se trata de un polinomio tambien se
puede escribir como un vector utilizando los coeficientes de mayor a menor

p=[1 0 6 2 -2 1]

De esa forma podemos hacer distintas operaciones con vectores.

Para comprobar que la expresion escrita es correcta, podemos poner

polyout(p,x)

Para sumar y multiplicar por un escalar, si

q=[3 2 1 9]
Practicas con Octave 23

p+2*q

dara un error, ya que los vectores no son de la misma dimension, luego habra que escribir

q=[0 0 3 2 1 9]

Para multiplicar

prod=conv(p,q)

Sera conveniente quitar los ceros que pueden aparecer a la derecha, con la orden

reduce(prod)

Para dividir, el comando deconv nos indica el cociente y el resto de la division, para ello q no puede
empezar por 0, luego antes hemos de quitarlos con polyreduce

q=polyreduce(q)

[q,r]=deconv(p,q)

Para obtener una descomposicion en fracciones simples usamos la orden residue, con la forma

[coef,den,coc,exp]=residue(p,s)

donde coc son los exponentes del polinomio cociente, y la expresion del resto en fracciones simples
nos la dan los otros datos, coef son lo coeficientes de la expresion racional, den dara unos valores xk que
indican que los denominadores son x xk , elevados a los exponentes que indique exp, todos ordenados
respectivamente. Por ejemplo si tomamos

s=[1,-2,1,0]

[coef,den,coc,exp]=residue(p,s) nos dara

coef =

17

den =

k=

129

exp =

2
Practicas con Octave 24

luego podemos decir que


17 8 1
x2 + 2 x + 9 + + + .
x 1 (x 1)2 x

Para dar valores a un polinomio la orden es polyval

t=linspace(-2,2,20);

p1=polyval(p,t)

Podemos representar el polinomio con

plot(t,p1)

Y calcular las raices del polinomio con

roots(s)

roots(p)

Aunque hay que precaucion con esa orden, puede inducir a errores cuando el polinomio tiene races
multiples, para un polinomio con 1 raiz de multiplicidad 8, no dara

p8=[1 -8 28 -56 70 -56 28 -8 1]

roots(p8)

ans =

1.02171 + 0.00000i

1.01523 + 0.01540i

1.01523 - 0.01540i

0.99983 + 0.02154i

0.99983 - 0.02154i

0.98477 + 0.01506i

0.98477 - 0.01506i

0.97863 + 0.00000i

Tambien permite calcular derivadas e integrales indefinidas de polinomios con las ordenes

polyder(p)

polyint(p)

El resultado no dara el termino independiente 0, pero si se cambia por C se tiene la integral indefinida.
Practicas con Octave 25

3.4. Interpolacion Polinomica

La orden polyfit(x,y,n) permite calcular un polinomio de grado n que pase por los puntos determinados
por los vectores x e y.

Si

x=[ 1 2 3 4 5 6 7 8 9 10 11 12]

y=[ 2.7 5.1 7.2 9 10.7 12 13 13.7 14 14.2 14.1 13.7]

Como hay 12 valores, probamos con un polinomio de grado 11

p11=polyfit(x,y,11)

x11=linspace(1,12,30)

y11=polyval(p11,x11)

Y las comparamos graficamente

plot(x,y,0 o0 ,x11,p11,0 r0 )

como funciona realmente esta interpolacion?

Para conseguir un polinomio de grado n que aproxime un conjunto de puntos, o una funcion f (x),
buscamos una polinomio que pase por los puntos (xi , yi ) para i = 1, ..n, en el caso de una funcion
yi = f (xi ).
Practicas con Octave 26

n
Y x xj
Vamos a utilizar la funcion auxiliar k (x) = , que vale 1 cuando x = xk y 0 en los
xk xj
j = 0,
j <> k.
demas xi , i <> k.
n
X
De esta forma el polinomio de interpolacion sera p(x) = k (x).
k

Por ejemplo, el polinomio que pase por los puntos (1, 2), (1, 3) y (3, 5), sera de segundo grado y lo
construiremos

(x + 1)(x 3) (x 1)(x 3) (x 1)(x + 1) x2 x + 4


p(x) = 2+ 3+ 5=
(1 + 1)(1 3) (1 2)(1 3) (3 1)(3 + 1) 2

3.5. Ecuaciones no lineales

Si queremos aproximar la raz de la ecuacion f (x) = 0 con una tolerancia tol y en un numero maximo
de nmax de iteraciones, se define la funcion f como una funcion inline con el comando

f = inline(...,x)

y se elige uno de los siguientes metodos:

Metodo de la biseccion

Se eligen a y b de manera que f contenga una unica raz en el intervalo [a, b] y se ejecuta el comando:

[z,res,niter] = bisection(f,a,b,tol,nmax)

En la salida z contiene la aproximacion buscada, res el residuo y niter el numero de iteraciones que ha
tardado el metodo en alcanzar z.

Metodo de Newton.

Se define la derivada de f como otra funcion inline

df = inline(...,x)

Se elige el valor inicial x0 y se ejecuta el comando

[z,res,niter] = newton(f,df,x0,tol,nmax)

En la salida z contiene la aproximacion buscada, res el residuo y niter el numero de iteraciones que ha
tardado el metodo en alcanzar z.
Practicas con Octave 27

Metodo del punto fijo y metodo de Aitken.

Si queremos resolver el problema de punto fijo (x) = x, primeramente se define como una funcion
inline con el comando

phi = inline(...,x)

Se elige el valor inicial x0 y se ejecuta el comando

[z,niter] = puntofijo2(phi,x0,tol,nmax)

En la salida z contiene la aproximacion buscada, res el residuo y niter el numero de iteraciones que ha
tardado el metodo en alcanzar z.

Si queremos aplicar el metodo de aceleracion de Aitken para resolver el mismo esquema se ejecuta el
comando

[z,niter] = aitken(phi,x0,tol,nmax)

Orden fzero.

fzero nos da una aproximacion a partir de un punto por metodos numericos, pero no sabemos que
metodo esta utilizando, y por tanto no lo podemos controlar

fun=@(x) x.3 3x + 1

fplot(fun,[-3,3])

fzero(fun,1)

ans = 0.34730

fzero(fun,-1)

ans = -1.8794

fzero(fun,0)

ans = 0.34730

fzero(fun,1)

ans = 0.34730

fzero(fun,3)

ans = 1.5321
Practicas con Octave 28

3.6. Sistemas de Ecuaciones no lineales. Metodo de Newton.

Sea el sistema de ecuaciones no lineales




f1 (x1 , x2 , . . . , xn ) = 0
f2 (x1 , x2 , . . . , xn ) = 0

..


.
fn (x1 , x2 , . . . , xn ) = 0

que podemos escribir de manera compacta como

f (x) = 0

en donde f = (f1 , . . . , fn )T y x = (x1 , . . . , xn )T .

(0) (0)
Tomando como dato inicial el vector columna x0 = (x1 , . . . , xn )T Rn , para resolver el sistema
mediante el metodo de Newton necesitaremos crear 3 archivos .m distintos:

1. Archivo Ffun.m que contiene al vector columna f = (f1 , . . . , fn )T .


2. Archivo JFun.m que contene la matriz Jacobiana Jf .
3. Archivo en donde ejecutaremos el metodo mediante el programa newtonsys.m.

Debemos tener en cuenta ademas las siguientes observaciones:

La llamada a las funciones Ffun y Jfun re realiza usando el smboo @.


Dentro de los archivos Ffun.m y Jfun.m las variables x0 , . . . , xn se denotan por x(0), . . . , x(n).

No es necesario escribir punto antes de , y /.

Ejemplo: Para el sistema de ecuaciones no lineales Sea el sistema de ecuaciones no lineales


x21 10x1 + x22 + 8 = 0

x1 x22 + x1 10x2 + 8 = 0

y tomando como semilla x0 = (0,5, 0,5)T tenemos que


 2
x1 10x1 + x22 + 8
  
2x1 10 2x2
f= y J f (x) =
x1 x22 + x1 10x2 + 8 x22 + 1 2x1 x2 10
por lo que creamos los archivos Ffun.m y JFun.m de la siguiente forma:

Archivo Ffun.m

function F=Ffun(x)
F(1,1) = x(1) 2-10x(1)+x(2) 2+8;
F(2,1) = x(1)x(2) 2+x(1)-10x(2)+8;
endfunction
Practicas con Octave 29

Archivo Jfun.m

function J=Jfun(x)
J(1,1) = 2x(1)-10;
J(1,2) = 2x(2);
J(2,1) = x(2) 2+1;
J(2,2) = 2x(1)x(2)-10;
endfunction

Ahora el sistema se resuelve mediante los comandos:

x0 = [0.5;0.5];
[z,res,niter] = newtonsys(@Ffun,@Jfun,x0,tol,nmax)
Captulo 4

Sistemas de ecuaciones lineales

En el captulo anterior hemos utilizado funciones para aplicar el metodo de eliminacion de Gauss.

4.1. Solucion de sistemas de ecuaciones con metodos iterativos

Un metodo iterativo es un metodo que progresivamente va calculando aproximaciones a la solucion


de un problema. En Matematicas, en un metodo iterativo se repite un mismo proceso de mejora sobre
una solucion aproximada: se espera que lo obtenido sea una solucion mas aproximada que la inicial. El
proceso se repite sobre esta nueva solucion hasta que el resultado mas reciente satisfaga ciertos requisitos.

A diferencia de los metodos directos, en los cuales se debe terminar el proceso para tener la respuesta,
en los metodos iterativos se puede suspender el proceso al termino de una iteracion y se obtiene una
aproximacion a la solucion. Un metodo iterativo consta de los siguientes pasos.

1. Inicia con una solucion aproximada (Semilla)


2. Ejecuta una serie de calculos para obtener o construir una mejor aproximacion partiendo de la
aproximacion semilla. La formula que permite construir la aproximacion usando otra se conoce
como ecuacion de recurrencia.
3. Se repite el paso anterior pero usando como semilla la aproximacion obtenida.

4.1.1. Metodo de Jacobi

El metodo Jacobi es el metodo iterativo para resolver sistemas de ecuaciones lineales mas simple y se
aplica solo a sistemas cuadrados, es decir a sistemas con tantas incognitas como ecuaciones.

CX = B (4.1)

1. Primero se determina la ecuacion de recurrencia. Para ello se ordenan las ecuaciones y las incognitas.
De la ecuacion (4.1) se despeja la incognita X. En notacion matricial se escribirse como:

X = B + AX

30
Practicas con Octave 31

2. Se toma una aproximacion para las soluciones y a esta se le designa por X0


3. Se itera en el ciclo que cambia la aproximacion

Xn+1 = B + AXn

Uno de los principales problemas de los metodos iterativos es la garanta de que el metodo va a
converger, es decir, va a producir una sucesion de aproximaciones cada vez efectivamente mas proximas
a la solucion. En el caso del metodo de Jacobi no existe una condicion exacta para la convergencia. Lo
mejor es una condicion que garantiza la convergencia, pero en caso de no cumplirse puede o no haberla es
la siguiente: Si la matriz de coeficientes original del sistema de ecuaciones es diagonalmente dominante,
el metodo de Jacobi seguro converge.

Una matriz se dice matriz diagonalmente dominante, si en cada uno de los renglones, el valor absoluto
del elemento de la diagonal principal es mayor que la suma de los valores absolutos de los elementos
restantes del mismo renglon. A veces la matriz de un sistema de ecuaciones no es diagonalmente dominante
pero cuando se cambian el orden de las ecuaciones y las incognitas el nuevo sistema puede tener matriz
de coeficientes diagonalmente dominante.

Con octave construimos una funcion itermeth que realiza el metodo iterativo general.

functuion [x, iter] = itermeth(A, b, x0 , nmax, tol, P )

Donde A, B son las matrices de los coeficientes y la matriz de los terminos independientes, x0 es
la condicion inicial, nmax el numero maximo de iteraciones, tol la tolerancia y P la opcion de elegir el
metodo de Jacobi o del Gauss-Seidel.

4.1.2. Metodo de Gauss-Seidel

El metodo de Gauss-Seidel es muy semejante al metodo de Jacobi. Mientras que en el de Jacobi se


utiliza el valor de las incognitas para determinar una nueva aproximacion, en el de Gauss-Seidel se va
utilizando los valores de las incognitas recien calculados en la misma iteracion, y no en la siguiente. Por
ejemplo, en el metodo de Jacobi se obtiene en el primer calculo Xi+1 , pero este valor de X no se utiliza
sino hasta la siguiente iteracion. En el metodo de Gauss-Seidel en lugar de eso se utiliza de Xi+1 en
lugar de Xi en forma inmediata para calcular el valor de Yi+1 de igual manera procede con las siguientes
variables; siempre se utilizan las variables recien calculadas.
Practicas con Octave 32

Con esta funcion obtenemos algunos ejemplos para obtener la solucion de un sistema por el metodo
de Jacobi.

Obteniendo en la iteracion veinticuatro una aproximacion de acuerdo con la tolerancia


Practicas con Octave 33

El mismo ejemplo lo hacemos por Gauss-Seidel

Obteniendo en la iteracion trece una aproximacion de acuerdo con la tolerancia


Captulo 5

Autovalores, autovectores de una


matriz

5.1. Calculo por metodos directos

Veamos los comamdos para obtener los valores que diagonalizan una matriz.

1. Autovalores
>> A = [2, 1, 2; 1, 0, 2; 1, 1, 1]; lambda = eig(A)
1
lambda = 1
1
2. Coeficiente del polinomio caracterstico
>> A = [2, 1, 2; 1, 0, 2; 1, 1, 1]; poly(A)
ans = 1 1 1 1
3. Otra forma de obtener los autovalores
>> A = [2, 1, 2; 1, 0, 2; 1, 1, 1]; roots(poly(A))
1 + 0i
ans = 1 + 0i
1 + 0i
4. Salida de matriz con autovectores (matriz de paso) y matriz diagonal de autovalores (matriz dia-
gonal)
>> A = [2, 1, 2; 1, 0, 2; 1, 1, 1]; [vectorpropio, valorpropio]=eig(A)
vectorpropio =
0,904534 0,577350 0,636162
0,301511 0,577350 0,768704
0,301511 0,577350 0,066271
valorpropio =
Diagonal Matrix

34
Practicas con Octave 35

1,00000 0 0
0 1,00000 0
0 0 1,00000
5. Un programa para obtener la diagonalizacion de una matriz

5.2. Calculo por metodo iterativo

Existen metodos numericos que nos conducen, a partir de la matriz del endomorfismo, a los autovec-
tores y autovalores con una cierta aproximacion.

Uno de estos metodos es el de las potencias, aplicable cuando la matriz es de diagonal estrictamente
dominante (los elementos de la diagonal principal son mayores en valor absoluto, que la suma de los
valores absolutos de los demas elementos de la fila correspondiente)

Sean 1 , 2 , n los autovalores (iguales o no) de la matriz Anxm . Se dice que i es dominante si
|i | > |j | i 6= i. Sea ~xi su autovector correspondiente a i , se dice que ~xi es autovector dominante.

Metodo de las potencias

Sea Anxm una matriz diagonalizable = i /A~ui = i ~ui


Sea 1 dominante
Sea B= {~ui } una base de autovectores asociados
n
X
Sea ~x0 Vn {0} ~x0 = ci ~ui tomado al azar
1

Definimos la ecuacion recurrente


~xn+1 = A~xn
y obtenemos;

 k  k !
k 2 n
~xk = A ~x0 = k1 c1 ~u1 + c2 ~u2 + + cn ~un
1 1

 k
j
Y por ser lm = 0, obtenemos
k 1

~xk k1 c1 ~u1
Practicas con Octave 36

Con este procedimiento ~xk se aproxima al autovector ~u1 . Para que ~xk no crezca rapidamente, se
normaliza dividiendolo por la mayor de sus coordenadas en valor absoluto y as hacemos que el autovector
~u1 su coordenada mayor sea uno.

El autovalor dominante asociado lo obtenemos resolviendo la ecuacion:

A~u1 = 1 ~u1

Si el autovector dominante tiene grado de multiplicidad r se convergera a uno de los autovectores.


Puede encontrarse los restantes autovectores, repitiendo el proceso con un vector inicial ~x0 distinto.

Para calcular el autovalor de menor valor absoluto aplicamos el metodo de las potencias a A1 , pues
sabemos, que los autovalores de A1 son los inversos de A.

Para obtener los restantes autovectores y autovalores aplicamos los procedimientos de deflacion.

Con Octave hemos construidos el siguiente metodo iterativo mediante la funcion eigpower

Aqu ponemos cuatro ejemplos de aplicacion del metodo de las potencias para calcular aproximada-
mente los autovalores y autovectores.
Practicas con Octave 37

Ejenplo1

Ejemplo2
Practicas con Octave 38

Ejemplo 3

Ejemplo4
Captulo 6

Derivacion e Integracion

6.1. Derivacion e Integracion con Symbolic

La orden para derivar con Octave Symbolic es diff, para integrar int. El polinomio de Taylos se puede
obtener con la orden taylor(f,variable,punto,order,orden). Se pueden realizar tanto de una como de mas
variables

>> pkg load symbolic

>> syms x y

>> f = x2 + 2 x exp(x) + 1

>> subs(df,x,4)

Se obtiene el valor de la funcion en el x = 4

>> df=diff(f)

Calcula la derivada

>> subs(df,x,4) Se obtiene el valor de la derivada en x = 4

>> db=diff(f,4)

Calcula la derivada de cuarto orden

>> in=int(f)

Calcula la integral indefinida

>> in=int(f,[2,5]) Calcula la integral definida entre 2 y 5

>> tayf=taylor(f, x ,2, order, 6)

Calcula el polinomio de Taylor en el punto 2 de orden 6.

Para funciones de dos variables

39
Practicas con Octave 40

>> g = x y + x5 y sin(x)

Puede calcularse derivalas de distintos ordenes en ambas variables

>> diff(g,x)

>> diff(g,x,2,y,1)

E integrales

>> int(g,x)

>> int(int(g,y),x)

>> int(int(g,x),y)

>> int(int(g,y,0,2),x,0,pi)

>> int(int(g,x,0,y),y,0,pi/2)

O el polinomio de Taylor de la funcion de 2 variables

>> taylor(g, [x,y] , [1,1], order, 4)

6.2. Derivadas numericas

Dada una funcion continua y derivable, buscamos una aproximacion de la primera derivada en un
punto de un intervalo [a,b].

Utilizando el desarrollo en serie de Taylor, de orden uno, en torno a x0 y si h es una cantidad positiva
suficiente pequena, buscamos una aproximacion de la derivada en x0 + h

h2 00
f (x0 + h) = f (x0 ) + h.f 0 (x0 ) + f (1 ) x0 < 1 < x0 + h (6.1)
2
Despejando f 0 (x0 ) tenemos
f (x0 + h) f (x0 )
f 0 (x0 ) = (h)
h
donde (h) es el error de truncamiento, en ese caso de orden 1. De manera que una primera aproximacion
de la derivada la obtenemos con
f (x0 + h) f (x0 )
f 0 (x0 ) ,
h
que llamamos diferencia finita progresiva. Si repetimos el proceso en x0 h obtenemos

h2 00
f (x0 h) = f (x0 ) h.f 0 (x0 ) + f (2 ) x0 h < 2 < x0 (6.2)
2
y llegamos a
f (x0 ) f (x0 h)
f 0 (x0 )
h
que llamamos diferencia finita regresiva, otra posible aproximacion de la derivada. Restando las ecuaciones
6.1 y 6.2 obtenemos
f (x0 + h) f (x0 h) = 2h.f 0 (x0 ) + (h2 ) (6.3)
Practicas con Octave 41

f (x0 + h) f (x0 h)
f 0 (x0 )
2h
que denominamos diferencia finita centrada, y donde el error es menor, ya que es de orden 2.

Con el programa siguiente definimos una funcion que calcula la derivada utilizando la ecuacion de
derivada finita centrada, salvo en los extremos, donde utiliza la progresiva y regresiva, respectivamente.
Dado un vector x, y calculamos y = f (x), esa funcion nos dara un vector d, donde cada componente es
una aproximacion de la derivada en el punto correspondiente del vector x de la funcion f.

Si tomamos

>> x=[0:1:10]

>> y = x.2

>> d=der2p(x,y)

Obtendremos

ans =

1 2 4 6 8 10 12 14 16 18 19

Hay errores solo en los extremos, ya que se ha tomado h muy grande

Si hubieses tomado >> x=[2:0.01:2]

el error en los extremos hubiese sido tambien mayor, pero de 2, siendo exactos el resto de valores.

Tambien se pueden obtener formulas con mas puntos. Muy usadas son las de tres y cinco puntos. Para
deducir la de tres puntos, se parte del desarrollo de Taylor de segundo grado en f (x0 + h) y f (x0 + 2h),
Practicas con Octave 42

y se obtendra las formulas progresivas, regresivas y centradas. Seran respectivamente

3f (x0 ) + 4f (x0 + h) f (x0 + 2h)


f 0 (x0 ) ,
2h
f (x0 2h) 4f (x0 h) + 3f (x0 )
f 0 (x0 ) ,
2h
f (x0 2h) 8f (x0 h) + 8f (x0 + h) + f (x0 + 2h)
f 0 (x0 ) ,
12h
la centrada de orden 4 y las otras dos de orden 2.

Tambien se pueden deducir para derivadas de orden mayor.


Practicas con Octave 43

6.3. Integracion Numerica


Captulo 7

Ecuaciones Diferenciales

7.1. Campo de direcciones de una ecuacion diferencial


0 x
Vamos a representar un campo de direcciones, por ejemplo de la ecuacion diferencial y =ex y . Para
ello, definimos la funcion, el numero de puntos que vamos a tomar y el dominio donde queremos dibujar
el campo.

>> clear

>> f = inline(0 (exp(x) y)./x0 ,0 x0 ,0 y 0 )

>> N = 15;

>> xmin = 20;

>> xmax = 20;

>> ymin = 40;

>> ymax = 30;

Ahora con la orden meshgrid creamos la red de puntos en el plano

>> [x, y] = meshgrid(xmin : (xmax xmin)/N : xmax, ymin : (ymax ymin)/N : ymax);

Calculamos un vector en cada uno de esos puntos, partimos de un valor 1 para x, calculamos y y
luego normalizamos

>> dx = ones(size(x));

>> dy = f (x, y);

>> L = sqrt(dx.2 + dy.2 );

Para evitar el error que pueda producir el caso L = 0 hacemos:

>> L = L + 1e 10;

>> dx = dx./L;

44
Practicas con Octave 45

>> dy = dy./L;

Y con la orden quiver representamos esos vectores unitarios en cada uno de los puntos >> quiver(x, y, dx, dy);

Y representamos

>> title(Campo de direcciones);

>> xlabel(0 x0 );

>> ylabel(0 y 0 );

Si representamos del mismo modo el campo de direcciones de y 0 = y 2 + x resulta


Practicas con Octave 46

7.2. Problemas de Valor Inicial. Ecuaciones Diferenciales

Para resolver un Problema de Valor Inicial (PVI) de la forma


 0
y = f (t, y), t [t0 , tN ]
y(t0 ) = y0

Vamos a resolverlo desde tres puntos de vista, usando Octave Symbolic, con la orden Lsode y por
metodos numericos programados.

7.2.1. Usando Symbolic. Con Dsolve

La orden dsolve del paquete de Octave Symbolic resuelve algunas ecuaciones sencillas. Puede utilizarse
instalando el programa o bien de manera Online.

Ejemplo1. Resolvamos una ecuacion conocida y+2y=-cos(t) Con el paquete simbolico cargando defi-
nimos las variables con las dependencias con syms

>> pkg load symbolic

>> syms y(x)

Escribimos la ecuacion y aplicamos la orden dsolve, obtenemos la solucion que simplificada con simplify
podemos comprobar que es la misma que calcularamos sin usar ordenador, como una lineal que es.

>> de3 = dif f (y) + 2 y == cos(t);

>> sg = dsolve(de3)

Con condiciones iniciales, por ejemplo y(0)=2,


Practicas con Octave 47

Para poder representar la curva, podemos convertir la solucion en funcion con la orden function
handle, procederamos:

Obteniendo la grafica


Ejemplo 2. Resolver y+ 2y+y=0 con y(0)=y(0)=0 y(0)=1. Hallar la ecuacion general, la par-
ticular y representar.

Veremos en este ejercicio que a pesar de usar Octave Symbolic, nos dara valores aproximados. Si lo
resolviesemos analticamente la ecuacion, las soluciones de la ecuacion caracterstica son 0 y 2/2(1i),
con lo cual los valores que da Octave no son exactos.
Practicas con Octave 48

7.2.2. Usando la orden Lsode

Octave dispone de un driver para resolver problemas de Cauchy llamado lsode. Las opciones de
integracion se modifican utilizando la funcion lsode options.

Octave resuelve ecuaciones diferenciales no lineales, para ello utiliza la funcion lsode (the Livermore
Solver for Ordinary Differential Equations). Planteamos el Ptoblema de Cauchy (P.C.)

y 0 = f (t, y),

t [t0 , tN ]
y(t0 ) = y0

Cabe mencionar que la solucion que proporciona Octave es puramente numerica, es una matriz x, con
cada fila correspondiente a un elemento del vector t. El primer elemento de t debe ser t0 (t subndice 0 o
t inicial) y debe corresponder al estado inicial del sistema x0 , de modo que la primera fila de la salida es
x0 y utilizando dicha matriz puedes obtener con plot una grafica demostrativa de como se comporta la
ecuacion en un intervalo determinado. As que no esperemos resultados con variables, diferenciales y/o
Practicas con Octave 49

constantes como te lo dara un metodo convencional de solucion.

Hay 4 pasos para resolver una ecuacion diferencial en octave con lsode:

1. El primer paso es definir una funcion que represente a la ecuacion diferencial.

2. El segundo paso es definir un vector que represente los valores que va a tomar la variable indepen-
diente (t).

3. El tercer paso es definir la condicion inicial para la ecuacion.

4. El cuarto y ultimo paso es usar el comando lsode para integrar y resolver la ecuacion diferencial,
que debemos representar para estudiar la solucion

Veamos un ejemplo. Resolver x2 x0 = et con x(0)=1 en el intervalo [0,20]. Defino la funcion, se puede
definir de distintas formas, utilizo la funcion anonima

>> f 0 = @(x, t) exp(t)/x2 ;

>> x0=1;

>> t=linspace(0,20);

>> y=lsode(f0,x0,t);

>> plot(t,y)

Ley de Enfriamiento de Newton. Cuando la diferencia de temperaturas entre un cuerpo y su medio


ambiente no es demasiado grande, el calor transferido en la unidad de tiempo hacia el cuerpo o desde
el cuerpo por conduccion, conveccion y radiacion es aproximadamente proporcional a la diferencia de
temperatura entre el cuerpo y el medio externo.

De manera matematica, si T(t) es la temperatura en el instante t, podemos expresarlo como

dT
= k (T T a)
dt
Practicas con Octave 50

donde k es una constante, que llamamos constante de enfriamiento, que en realidad es el producto del
coeficiente de intercambio de calor, que depende del medio, por la superficie de contacto del cuerpo.

Ejemplo. Una placa de acero se extrae de un horno a 6000 C y se sumerge en un bano de aceite a 300 C.
Se sabe que la constante de enfriamiento de la pieza es 0,023. Determinar la temperatura que tendra
despues de 92 segundos.

Tenemos que resolver el P.C.

T 0 (t) = 0,023(30 T ),

t [0, 92]
y(0) = 600

Lo hacemos con la orden Isode.

>> f un = @(y, t) 0,023 (30 y)

>>t=[0:0.1:92]

>>ys=lsode(fun,600,t)

>>ys(plot(t, ys)

Se puede ver que la solucion es cercana a 100, pero podemos precisar mas, como hemos dividido el
intervalo [0,92] con un paso de 0.1, el ultimo valor, correspondiente a 92, se encontrara en la posicion 921.

>> ys(921)

ans = 98.692

Ademas de Lsode Hay otras ordenes para tratar ecuaciones diferenciales de forma numerica en un
paquete de Octave llamado odepkg, pero no las vamos a tratar.

Si resolvemos este problema manualmente podemos ver que el resultado es exacto.

Si la orden la escribimos
Practicas con Octave 51

>>[ys,i,m]=lsode(fun,600,t)

Si el procedimiento es satisfactorio i nos dara 2, y cualquier otro valor en caso contrario; m nos dira
si es satisfactorio o nos proporcionara informacion cuando no lo sea.

7.2.3. Usando Metodos numericos

Sea I un intervalo de la recta real, no reducido a un unico punto, y sea t0 un punto fijado de el.
Supongamos ademas que f es una funcion definida y continua en IxR y con valores en R, y sea y0 un
valor dado de R. En estas condiciones nos planteamos el siguiente problema: Hallar una funcion continua
y diferenciable y(t) definida en I y con valores en R verificando:

y 0 (t) = f (t, y(t)),



t [t0 , tN ]
y(t0 ) = y0

Este tipo de problemas se conoce con el nombre de problema de Cauchy para la ecuacion diferencial. La
condicion asociada se denomina condicion de Cauchy. Toda funcion y(t) verificando la EDO del problema
de Cauchy se denomina integral de la EDO o solucion particular de la EDO. En general las soluciones de
la EDO estaran dadas por la expresion formal:
Z
y(t) = C + f (t, y(t))dt

Donde C es una constante arbitrariamente elegida. A esta familia de soluciones se la denomina solucion
general de la EDO. En algunos casos puede haber ademas otras soluciones que no pertenezcan a la familia
de la solucion general. Dichas soluciones se denominaran soluciones singulares de la EDO.

A aquella solucion particular que, ademas de satisfacer la EDO del problema de Cauchy, verifique la
condicion de Cauchy se la denomina solucion del problema de Cauchy.

Teorema (de Cauchy-Lipschitz). Suponiendo que la funcion f(t,y) es una funcion continua sobre IxR
que es lipschitciana respecto a la segunda de sus variables, es decir:

k > 0 / |f (t, y) f (t, z)| k ||y z|| tI, y, zR

entonces el problema admite una unica solucion.

En numerosos problemas fsicos la variable t representa el tiempo. Ademas el intervalo I se suele


considerar de la forma [t0, t0 + T] y por ello al instante t0 se le llama instante inicial y a la condicion
impuesta en este instante se la denomina condicion inicial. En esta situacion a los problemas de Cauchy
correspondientes se les denomina habitualmente problemas de valor inicial (P.V.I.), extendiendose esta
terminologa tambien a los problemas en los que t no se identifique con la variable fsica tiempo.

Los problemas de Cauchy que no sean problemas de valor inicial por no ser t0 el extremo izquierdo
del intervalo I pueden reducirse a problemas de valor inicial mediante sencillos cambios de variable. En
efecto si I= [a,b] y t0 es un punto intermedio de I=[a,b] el problema de Cauchy correspondiente puede
descomponerse en dos problemas de la forma:

y 0 (t) = f (t, y(t)),



t [a, t0 ]
P C1
y(t0 ) = y0
Practicas con Octave 52

y 0 (t) = f (t, y(t)),



t [t0 , b]
P C2
y(t0 ) = y0

El problema PC2 es un problema de valor inicial. Y el problema PC1 puede transformarse en un


problema de valor inicial si se realiza el cambio de variable independiente: t0 =-t. Por este motivo los
metodos numericos que se estudiaran en este tema se plantearan sobre problemas de valor inicial. Para
ellos, ademas, teniendo en cuenta la expresion de la solucion general de la EDO, se tendra que la expresion
formal de la solucion del problema de Cauchy esta dada por:
Z t
y(t) = y0 + f (x, y(x))dx.
t0

Aunque existen metodos especficos para abordar este tipo de problemas (como por ejemplo los lla-
mados metodos de tiro), por cuestiones de tiempo disponible no podremos abordarlos. Su tratamiento
numerico, no obstante, puede realizarse mediante metodos en diferencias finitas.

Existen numerosos tipos de metodos para la resolucion de problemas de valor inicial. Introduciremos
los metodos en diferencias finitas. Este tipo de metodos no persiguen la determinacion de la expresion de la
funcion solucion y(t) de un problema de valor inicial. Tan solo persiguen calcular, de forma aproximada, el
valor de la solucion en ciertos puntos ti ( i = 0, 1, 2, ..., N) seleccionados (bien de antemano por el usuario
de dichos metodos, bien de forma automatica a traves de algoritmos preparados para su calculo con el
objeto de asegurar ciertas tolerancias de error entre el valor exacto (desconocido) y el valor aproximado
por el metodo). Para su descripcion, siendo I = [t0 , t0 +T] consideremos dados los puntos en los que se
va a determinar la solucion y que denotaremos por:

t0 < t1 < t2 < .... < tn < tn + 1 < .... < tN = t0 + T

Los metodos en diferencias finitas, en general, se basan en, conocidos los valores aproximados de la
solucion en los puntos tnk , tnk+1 , tnk+2 , ....., tn1 , que denotaremos como:

ynk y(tnk ), ynk+1 y(tnk+1 ), ....., yn1 y(tn1 )

interpolar, habitualmente mediante un polinomio, la funcion y(t) sobre el soporte tnk , ....., tn . Esta
tecnica permite escribir
yn = (ynk , ynk+1 , ....., yn )
En este proceso hay muchas opciones posibles que nos conduciran a expresiones diferentes de la funcion .
Pero en todo caso seran expresiones en las que el valor aproximado yn se estimara en funcion de los valores
aproximados, previamente calculados, ynk , ynk+1 , ....., yn1 , donde puede aparecer eventualmente el
propio valor yn que se desea aproximar. Por ello, en general, se entendera por metodo numerico para
resolver un problema de valor inicial todo esquema de calculo (algoritmo) que nos permita evaluar yn
mediante una expresion de la forma:

yn = (ynk , ynk+1 , ....., yn1 )(Explcito)

yn = (ynk , ynk+1 , ....., yn ) (Implcito)


En el primer caso diremos que es un metodo explcito pues el calculo de yn tan solo implica evaluar
la funcion en los valores anteriores. En el segundo caso, se dira implcito pues el valor de yn depende
del propio yn , y para determinarlo exigira resolver la ecuacion algebraica. En general son metodos mas
costosos en cada uno de los pasos de integracion (aunque puedan presentar tambien ventajas como el
permitir considerar pasos de integracion de mayor tamano, como mas adelante detallaremos). A analizar
el comportamiento de este tipo de metodos numericos dedicaremos algunos ejemplos posteriormente.
Practicas con Octave 53

Ademas tales tipos de metodos diremos que son metodos de k pasos en el sentido de que para evaluar
yn utilizan los k ultimos valores previamente calculados. En el caso de que k = 1 los metodos corres-
pondientes se dicen metodos de pasos libres o metodos unipaso. Por el contrario si k > 1 los metodos
correspondientes se dicen metodos de pasos ligados o metodos multipaso. Los metodos multipaso k pasos
solo podran utilizarse a partir del conocimiento de los k primeros valores, y para la determinacion de
estos deberan emplearse metodos de un menor numero de pasos. La combinacion de unos y otros no es
trivial pues interesa no estropear la precision que pueda conseguirse con el metodo de k pasos por utilizar
metodos menos precisos en las etapas iniciales. Ademas, conviene advertir ya, desde el comienzo, que la
consideracion de un numero mayor de pasos no implica necesariamente la mejora de las aproximaciones
obtenidas. Es relativamente frecuente que un metodo de un paso bien elegido conduzca a soluciones mas
baratas de obtener e igual o mas precisas que un metodo multipaso.

Metodo de Euler explcito

A partir del P.V.I.

y 0 (t) = f (t, y(t)),



t [t0 , t0 + T ]
y(t0 ) = y0

y una subdivision del intervalo [t0, t0 + T] mediante los puntos:

t0 < t1 < t2 < .... < tn < tn+1 < .... < tN = t0 + T

Designaremos por hn a los valores (tn+1 tn ) y por yn a las aproximaciones que se vayan obteniendo de
y(tn ), (n = 0, 1, ..., N). Si se supone que la funcion y(t) es al menos de clase C 2 ([t0 , tN ]), puede expresarse
el valor de y(t) en el punto tn+1 en funcion del valor de y(t) en tn mediante el siguiente desarrollo en
serie de Taylor:
h2
y(tn+1 ) = y(tn + hn ) = y(tn ) + hn .y 0 (tn ) + n y 00 (tn ) + ...
2
h2n 00
y(tn+1 ) = y(tn + hn ) = y(tn ) + hn .f (tn , y(tn )) +
y (tn ) + ...
2
Si hn es suficientemente pequeno, el desarrollo anterior podra aproximarse despreciando los terminos en
los que aparezcan potencias de hn superiores o iguales a 2, obteniendose as nuevamente el esquema de
calculo del metodo de Euler:
yn+1 = yn + hn .f (tn , y(tn ))
Este esquema de calculo de las soluciones aproximadas del Problema de Valor Inicial (P.V.I.) se conoce
con el nombre metodo de Euler explcito en honor al matematico Leonard Euler.

Metodo de Euler implcito

Si en lugar de expresar el valor de y(tn+1 ) en funcion del valor de la funcion y(t) y de sus derivadas
en tn , se hiciera al reves y se expresara el valor en tn en funcion del valor de y(t) y de sus derivadas en
tn+1 se obtendra:

h2n 00
y(tn ) = y(tn+1 hn ) = y(tn+1 ) hn .y 0 (tn+1 ) + y (tn+1 ) + ...
2
h2n 00
y(tn+1 ) hn .f (tn+1 , y(tn+1 )) = y(tn ) y (tn+1 ) + ...
2
Practicas con Octave 54

de la que, despreciando los terminos cuadraticos y posteriores en hn, se obtiene la formula que constituye
el esquema de calculo del metodo de Euler implcito (o retrogrado):
yn+1 = yn + hn .f (tn+1 , y(tn+1 ))
Este esquema de calculo exige, en cada paso, resolver una ecuacion algebraica. Para ello puede utilizarse
alguno de los metodos para resolver ecuaciones no lineales.

-metodos. Metodo de Crank-Nicholsol

Si se combinan los desarrollos en serie anteriores, ponderando el segundo por el parametro [0, 1] y
el primero por (1-) se obtendra la familia de -metodos.
yn+1 = yn + hn )f (tn , y(tn )) + hn f (tn+1 , y(tn+1 ))
Para el caso en que =0 se trata del metodo de Euler explcito, para el caso =1 el de Euler implcito y
para =0.5 se conoce como metodo de Crank-Nicholson:
hn
yn+1 = yn + (f (tn , y(tn )) + f (tn+1 , y(tn+1 )))
2
Por regla general los metodos explcitos necesitan mas cantidad de pasos, pero estos son menos costosos.
En los metodos implcitos, al tener que resolver una ecuacion no lineal en cada paso, estos son mas
costosos, pero se pueden realizar en menos pasos. Una buena opcion puede ser el metodo de Crank-
Nicholson, aunque no hay una regla fija en este aspecto, pudiendo para una ecuacion ser mas ventajoso
uno y para otra ecuacion otro. Otro aspecto a tener en cuenta es la estabilidad. El metodo explicito tiene
perdida de estabilidad, y eso no ocurre en los metodos implcitos. En el ejemplo 2, veremos la estabilidad,
antes trabajaremos una ecuacion con los tres metodos. En el libro de Quarteroni se dan ficheros para
estos tres metodos vistos, sus nombres son feuler.m (para Euler explcito), beuler.m (para el implcito) y
cranknic.m .

Para llevarlo a cabo con Octave, primeramente definimos la funcion f (t, y) en la variables t, y como una
funcion inline, el intervalo en en el que se presenta el problema [t0 , tN ] y la condicion inicial y0 como:

f = inline(...,t,y)
tspan = [t0,tN]
y0 = ...

Despues se especifica el numero de intervalos Nh del mallado utilizado, es decir, el numero de intervalos
en los que se divide el intervalo [t0 , tN ] una vez conocido el paso de discretizacion h:

Nh = ...

y resolvemos el PVI por medio de alguno de los siguientes metodos:

Metodo de Euler Explcito [t,y] = feuler(f,tspan,y0,Nh)


Metodo de Euler Implcito [t,y] = beuler(f,tspan,y0,Nh)
Crank-Nicholson [t,y] = cranknic(f,tspan,y0,Nh)
rk2 [t,y] = rk2(f,tspan,y0,Nh)
rk3 [t,y] = rk3(f,tspan,y0,Nh)

Para todos los metodos, la salida consiste en el vector t que contiene los N h + 1 puntos del mallado
en los que se ha dividido el intervalo [t0 , tN ], y en el vector y que contiene las aproximaciones a la solucion
Practicas con Octave 55

exacta y(t) en los puntos del mallado.

Una vez ejecutado el metodo podemos dibujar la aproximacion mediante el comando plot(t,y)

Ejemplo.
y 0 (t) = (1 + 6 t) e1y 6

t [0, 6]
y(0) = log(10) + 1

La solucion analtica es: y(t) = log(10e6t + t) + 1. Aplicar el algoritmo de Euler Explcito para calcular
la solucion en el intervalo temporal [0, 6] con pasos de discretizacion h1 = 0.5, h2 = 0.15 y h3 = 0.25.
Discutir el comportamiento de las soluciones obtenidas en terminos de estabilidad numerica. Aplicar los
algoritmos de Euler Implcito y Crank-Nicholson Dibujar la solucion analtica junto con las soluciones
estables calculadas anteriormente. Calcular analticamente el instante en el cual se tiene el mnimo de
concentracion, as como su valor. En primer lugar definimos la funcion y la solucion analtica dada, as
como su valor inicial:

>>f=inline((1+6*t)*exp(1-y)-6,t,y);

>>sol=inline(log(10.*exp(-6.*t)+t)+1,t);

>> y0=log(10)+1;

A continuacion el intervalo y los hi

>> tspan=[0,6]; h1=0.5; h2=0.15; h3=0.25;

con ellos calculamos el valor de Ni correspondiente

>> N1=(tspan(2)-tspan(1))/h1;

>> N2=(tspan(2)-tspan(1))/h2;

>> N3=(tspan(2)-tspan(1))/h3;

y ya podemos aplicar el metodo de Euler explcito con feuler

>> [t1,uf1]=feuler(f,tspan,y0,N1);

>> [t2,uf2]=feuler(f,tspan,y0,N2);

>> [t3,uf3]=feuler(f,tspan,y0,N3);

Representamos la primera figura con los tres resultados y la solucion analtica

>> figure(1)

>> plot(t1,uf1,.-r,t2,uf2,b,t3,uf3,*g,t2,sol(t2),k)

>>legend( uf1, uf2, uf3, sol)

obtenemos Comparamos algunos valores


Practicas con Octave 56

Observamos que la solucion obtenida para h1 presenta inestabilidad, vemos que las soluciones uf2 y
uf2 se mantienen por debajo de la solucion (eso ocurre con todas las explcitas) y parece ser que uf2 es
mejor aproximacion que uf3.

Aplicamos ahora Euler implcito y Crank Nicholson:

>> [t1,ub1]=beuler(f,tspan,y0,N1);

>> [t2,ub2]=beuler(f,tspan,y0,N2);

>> [t3,ub3]=beuler(f,tspan,y0,N3);

>> figure(2);

>> plot(t1,ub1,.-r,t2,ub2, b,t3,ub3,*g,t2,sol(t2), k) ;

>> legend( ub1, ub2, ub3, sol)

>> [t1,uc1]=cranknic(f,tspan,y0,N1);

>> [t2,uc2]=cranknic(f,tspan,y0,N2);

>> [t3,uc3]=cranknic(f,tspan,y0,N3);

>> figure(3)

>> plot(t1,uc1,.-r,t2,uc2, b,t3,uc3,*g,t2,sol(t2), k);

>> legend( uc1, uc2, uc3, sol)


Practicas con Octave 57

Calculamos el punto donde la funcion analtica alcanza el mnimo usando el paquete symbolic

>> pkg load symbolic

>> syms t

>> y=log(10*exp(-6*t)+t)+1

>> df=diff(y,t)v

>> solve(1-60*exp(-6*t)==0,t)
log(60)
La solucion que nos da es 6

>> log(60)/6

Que nos da el valor aproximado, 0.68239

Podemos comprobar que Octave symbolic no resuelve esta ecuacion, y si lo intentamos con lsode,
calculamos la aproximacion y la representamos junto con la solucion analtica.

>> figure(5)

>> x0=1;

>> t=linspace(0,6);

>> y=lsode(f,x0,t);

>> ys=sol(t);

>> plot(t,y,b,t,ys,or)
Practicas con Octave 58

Vemos que la solucion dada por lsode no es nada buena, toma valores muy grandes, de forma que al
representarla junto con la analtica, esta no se aprecia.

Observamos que ninguna solucion presenta inestabilidad y que todas estan por encima de la solucion
analtica, ambas cuestiones ocurre siempre en un metodo implcito. Nuevamente la mejor aproximacion
es la correspondiente a h2 y la peor la de h1. Como las aproximaciones obtenidas por Euler explcito
estaban por debajo y por Euler implcito por encima, es probable que la mejor aproximacion se obtenga
por Crank-Nicholson.

Comparamos la mejor aproximacion de cada uno de los metodos, y efectivamente vemos que la mejor
opcion es Crank-Nicholson:

>> figure(4)

>> plot(t2,uf2,.-r,t2,ub2,b,t2,uc2,g,t2,sol(t2),k);

>> legend( uf2, ub2, uc2,sol)


Practicas con Octave 59

Ejemplo. Problemas de Poblacion. Desintegracion radiactiva. Cuando el crecimiento de una poblacion


es directamente proporcional al tamano de esta en cada momento, el planteamiento matematico a traves
de una ecuacion diferencial es: y 0 = k y, siendo y(0) la poblacion inicial.

Es aplicable al tamano de una poblacion, a interes compuesto en inversiones bancarias, a problemas de


desintegracion radiactiva, etc... En problemas de radiacion radiactiva como los del Carbono 14, usado para
datar fosiles, es importante lo que llamamos semivida, que es el tiempo necesario para que la poblacion
se reduzca a la mitad.

Cuando se trata de un crecimiento negativo, o decrecimiento, k es un valor negativo, aunque en muchas


ocasiones se suele plantear la ecuacion y 0 = k y, con k > 0. Analicemos esta ecuacion con y(0) = 1 y en
esta ecuacion, dada su sencillez, es posible estudiar a priori facilmente la estabilidad de las soluciones.

La solucion analtica es y(t) = ekt . Aplicaremos el algoritmo de Euler Explcito, y analizaremos la


estabilidad segun el valor de h. Estudiaremos tamiben los metodos de Euler implcito y -metodos. Y
particularizaremos a k = 5. Tomaremos hn = h la misma en cada paso.

Euler Explcito
yn+1 = yn + h (kyn ) = (1 k h) yn
yn+1 = (1 k h) yn = (1 k h)2 yn1 = ... = (1 k h)n+1 y0
Euler Implcito
1
yn+1 = yn + h (kyn+1 ) yn+1 = ( ) yn
1+kh
1
yn+1 = ( )n+1 y0
1+kh

-metodos
1 (1 ) k h
yn+1 = yn h ((1 ) k yn + k yn+1 ) yn+1 = yn
1+kh
1 (1 ) k h n+1
yn+1 = ( ) y0
1+kh
Practicas con Octave 60

Veamos cuando estas soluciones son decrecientes y positivas.

Para el metodo de Euler explcito, llamamos =(1-k h), la solucion aproximada en cada instante de
tiempo tn+1 es la condicion inicial (y(0) = y0 = 1) multiplicada por n+1 , es decir escribimos el esquema
de Euler explcito en la forma:
yn = n y0 = n
Para que la solucion aproximada efectivamente decrezca (al menos en valor absoluto) debera verificarse
que | |< 1. Puesto que hemos supuesto k > 0 y la longitud del paso tambien es positiva, un pequeno
calculo nos conduce a que el decaimiento en los valores absolutos de la solucion se preservara si 0 <
k h < 2 Lo anterior nos limita el tamano del paso que podemos utilizar si deseamos que nuestra solucion
aproximada decrezca con el transcurrir del tiempo, debiendo verificarse para ello que h < k2 En el caso de
que h = k2 la solucion numerica no explotara con el transcurrir del tiempo pero como en ese caso = 1
la solucion numerica oscilara en cada instante de calculo pasando del valor -1 al valor 1. No obstante se
puede ser un poco mas sutil en el examen de la longitud del paso de calculo a utilizar. En efecto, si se
desea que ademas la solucion aproximada sea siempre positiva la condicion a imponer es que 0 < < 1 ,
lo que nos conduce a que h(0, k1 ).

Notese que el intervalo al que deben pertenecer los valores de h es un intervalo abierto. En efecto, en
sus extremos la solucion numerica no oscilara entre valores negativos y positivos, pero tambien adolecera
de graves defectos. As el valor h = 0 no puede tomarse (pues todos los puntos de calculo se reduciran al
instante inicial t0 ). Y si se tomase h = k1 el valor de sera nulo y la solucion aproximada en instantes
positivos sera siempre 0. El problema entonces es saber cual es el mejor valor que podramos tomar para
el paso de integracion. El responder a esta pregunta, en este caso concreto, es muy simple. Puesto que la
solucion analtica es conocida, se tendra un error nulo si:
(1 h k)n = etn = enh 1 h.k = eh h = 0
Pero es absurdo pensar en tomar h = 0. No obstante, lo anterior nos indica que cuanto menor sea el
paso de integracion menor sera el error cometido. Debe matizarse no obstante que aqu nos estamos
refiriendo solo a un tipo de error: el que se comete con la aplicacion del metodo sin redondear los valores
obtenidos. La consideracion de que al trabajar con un programa de calculo se introducen ademas errores
de redondeo al no poderse almacenar infinitos decimales introducira (como se vera mas adelante) un
lmite inferior a los valores de h que puedan considerarse. Pero olvidandonos por el momento de los
errores de redondeo, efectivamente, cuanto menor sea el tamano del paso de integracion mas precisa
sera la aproximacion obtenida. Ilustremos lo anterior considerando la solucion analtica del problema y
las soluciones aproximadas mediante el metodo de Euler para distintos valores del tamano del paso de
integracion y tomando como valor de k = 5 (lo que hace que para pasos menores que 1/5 = 0,2 el metodo
produzca soluciones siempre positivas que decrecen en valor absoluto con el paso del tiempo): Observese
como para h = 0,2 la solucion obtenida es, efectivamente, siempre nula y como la solucion obtenida con
h = 0,02 es mas precisa que la obtenida para h = 0,1, y esta, a su vez, es mas precisa que la obtenida
para h = 0,2. Si tomasemos mayores valores del paso de integracion comenzaran a aparecer soluciones
oscilantes pero si no sobrepasamos el valor crtico h = 2/k = 0,4 la solucion decrece en valor absoluto
por lo que para tiempos grandes acaba convergiendo hacia la solucion exacta.

Si a h le asignamos el valor crtico h = 0,4 la solucion permanece acotada, no explota para tiempos
grandes, pero tampoco decrece en valor absoluto y oscila entre -1 y 1.

Finalmente si a h le asignamos valores superiores a 0.4, por ejemplo h = 0,5 la solucion aproximada,
en valor absoluto, crecera por lo que tendera a explotar para tiempos elevados. Diremos en este caso que
el esquema considerado se hace inestable

Representamos las graficas uf1 correspondiente a h = 0,2, uf2 para h = 0,1 y uf3 para h = 0,01 para
comprobar lo explicado anteriormente. En otra grafica representamos uf4 correspondiente a h = 0,4 y uf5
para h = 0,5 para mostrar los casos de inestabilidad. En ambos casos aparece la solucion.
Practicas con Octave 61

Examinemos ahora los metodos implcitos (es decir con > 0). En este caso la solucion aproximada
tambien puede expresarse como:

yn = n y0 (n = 1, 2, ....,N)

siendo ahora:
1 (1 ) k h 1+khkh kh
= = =1
1+kh 1+kh 1+kh

Puesto que 0 < 1, y k > 0 se verificara que a siempre sera inferior a 1. Para garantizar que
tambien es superior a -1 se debe verificar que:
kh
< 2 (1 2 ) k h < 2
1+kh
En el caso de que = 0, 5 la expresion anterior se verificara para cualquier valor que se tome para h el
esquema en ese caso es incondicionalmente estable. Y si < 0, 5 la condicion a imponer sobre el paso de
integracion para garantizar la estabilidad, sera:
2
h<
k (1 2 )

Estas elecciones del valor del paso de integracion nos aseguran que el valor de la solucion aproximada que
se obtenga tambien va a decaer hacia 0 para tiempos grandes. Si ademas se desease asegurar la positividad
de las soluciones aproximadas se debera hilar un poco mas fino. En efecto para que esto suceda se debe
obligar a que 0 < < 1. Ello nos conduce a que:
kh 2
< 1 (1 ) k h < 1 h <
1+kh k (1 )
Practicas con Octave 62

Observese que cuanto mas se aproxime ? al valor 1 mayor sera el tamano de paso maximo que puede
ser tomado para garantizar tanto la estabilidad de la solucion aproximada (es decir que no explote
para tiempos grandes) como su positividad. Particularmente para = 1 (esquema de Euler implcito)
cualquier tamano del paso de integracion nos servira para asegurar ambas cosas. Para el esquema de
Crank Nicholson la estabilidad nos la garantizara cualquier tamano del paso pero la positividad nos
obligara a considerar tamanos inferiores a 2/k. Ello nos ampla el tamano del paso que puede ser tomado
respecto al esquema explcito (en el que la positividad y la estabilidad se aseguraban con tamanos inferiores
a 1/k).

Ilustremos lo anterior con la aplicacion de los esquemas de Euler implcito y de Crank-Nicholson al


problema:

y 0 (t) = 5 y

t>0
y(0) = 1

para distintos valores del paso de integracion. Comencemos con el metodo de Euler implcito que, en
este caso se formulara como:
y0 = 1
1 n
yn = ( 1+5 h) (n = 1, 2, 3...)
y que sera estable y positivo para todos los valores de h que se consideren. Como puede apreciarse las
soluciones, efectivamente siempre permanecen positivas y decrecen con el tiempo. Pero tambien puede
advertirse como su precision es mas pobre a medida que se aumenta el paso de integracion temporal.
Ademas la solucion es aproximada en exceso es decir con valores mayores que la exacta, a diferencia de
lo que suceda en el metodo explcito. Los resultados que se obtienen con el metodo de Euler Implcito y
con el metodo de Crank-Nicholson:
y0 = 1
yn = ( 10,5 5h n
1+0,5 5 h ) (n = 1, 2, 3...)

Procediendo como se hizo anteriormente para Euler explcito, para los mismos valores de hi, se ob-
tendran las graficas
Practicas con Octave 63

Se observa que todas las soluciones permanecen positivas y, ademas, metodo no parece tan sensible
al paso de integracion en cuanto a su precision. No obstante si sobrepasamos el lmite h = 2/k = 2/5 =
0,4, (ub4, uc4) especialmente en el metodo de Crank Nicholson, para el tamano del paso comenzaremos
a perder la positividad y a notar la influencia del valor de h.

Metodo de Heun, o Metodo de Prediccion Correccion

Esta cualidad de los esquemas implcitos, poder considerar pasos de integracion mas amplios que en
los explcitos sin perder la estabilidad, permite pensar en abordar problemas que se planteen en dominios
[t0 , t0 + T] en los que T tome valores elevados. Piensese, por ejemplo, que la EDO y 0 = ky es la que
rige procesos de desintegracion de isotopos radiactivos que, por su peligrosidad hacia el entorno, pueden
requerir estudiarlos durante millones de anos lo que hara inviable la consideracion de pasos de integracion
excesivamente pequenos. Pero, lamentablemente, no todo es la estabilidad y la positividad de los esquemas
de calculo sino que, ademas, habra que prestar atencion a su precision se hara un poco mas adelante. Y
a otros problemas como el que se plantea en el ejemplo siguiente.

Ejemplo
y 0 (t) = y 3

t>0
y(0) = 1

1
La solucion analtica, es de variable separada, es y(t) = 1+t .

2
Las iteraciones de Euler implcito seran yn+1 + h yn+1 = yn

Para h=0.1, calculamos el valor aproximado para t1 = 0,1. y1 + 0,1 y12 = 1 y1 puede ser
-10.916 o 0.916079

Conociendo la solucion analtica es facil comprobar que la solucion correcta es la segunda, pero lo
normal es no conocer la solucion exacta. Como resolver este problema? En ausencia de criterios propios
Practicas con Octave 64

del problema no se puede descartar una solucion frente a otra. Por ello, en estos casos, lo aconsejable
es acudir a los metodos predictor-corrector en los que, en sntesis, se utiliza un metodo explcito para
(predecir) obtener el valor de partida con el que aplicar el metodo de resolucion de ecuaciones no lineales
a la ecuacion obtenida del esquema implcito que nos permite refinar (corregir) el valor aproximado de la
solucion finalmente obtenida. La aplicacion de esta forma de proceder a nuestro problema nos conducira
en el primer paso de integracion a: Fase de prediccion mediante Euler explcito:
(0)
y1 = y0 h y02 = 1 0,1 (1)2 = 0,9

Fase de correccion mediante Euler implcito (resolviendo por el metodo de aproximaciones sucesivas):
(iter+1)
y1 = y0 h (y1iter )2 (iter = 0, 1, 2, ...)

que nos conduce a:


(1)
y1 = 1 0,1(0,9)2 = 0,919
(2)
y1 = 1 0,1 (0,919)2 = 0,9155439
(3)
y1 = 1 0,1 (0,9155439)2 = 0,916177
(4)
y1 = 1 0,1 (0,916177)2 = 0,9160617
(5)
y1 = 1 0,1 (0,9160617)2 = 0,9160838
(6)
y1 = 1 0,1 (0,9160838)2 = 0,9160792
(7)
y1 = 1 0,1 (0,9160792)2 = 0,9155439
por lo que tomaremos como y1 = 0,9160798.

En el segundo paso de integracion se tendra: Fase de prediccion mediante Euler explcito:


(0)
y2 = y1 h y12 = 0,9160798 0,1 (0,9160798)2 = 0,8321595

Fase de correccion mediante Euler implcito


(iter+1)
y2 = y1 h (y2iter )2 (iter = 0, 1, 2, ...)

que nos conduce a:


(1)
y2 = 0,9160798 0,1(0,8321595)2 = 0,8468308
(2)
y2 = 0,9160798 0,1 (0,8468308)2 = 0,8443675
(3)
y2 = 0,9160798 0,1 (0,8443675)2 = 0,8447841
(4)
y2 = 0,9160798 0,1 (0,8447841)2 = 0,8447137
(5)
y2 = 0,9160798 0,1 (0,8447137)2 = 0,8447256
(6)
y2 = 0,9160798 0,1 (0,8447256)2 = 0,8447236
(7)
y2 = 0,9160798 0,1 (0,8447236)2 = 0,8447239
por lo que tomaremos como y2 = 0,8447239.

El tercer paso de integracion nos permitira calcular y3 y(0 3) consistira en: Fase de prediccion
mediante Euler explcito:
(0)
y3 = y2 h y22 = 0,8447239 0,1 (0,8447239)2 = 0,7733681
(iter+1)
Fase de correccion mediante Euler implcito y3 = y1 h (y3iter )2 (iter = 0, 1, 2, ...)
Practicas con Octave 65

de lo que obtendramos
(1)
y3 = 0,8447239 0,1(0,7733681)2 = 0,7849141
(2)
y3 = 0,8447239 0,1 (0,7849141)2 = 0,7831149
(3)
y3 = 0,8447239 0,1 (0,7831149)2 = 0,783397
(4)
y3 = 0,8447239 0,1 (0,783397)2 = 0,7833529
(5)
y3 = 0,8447239 0,1 (0,7833529)2 = 0,7833598
(6)
y3 = 0,8447239 0,1 (0,7833598)2 = 0,7833587
(7)
y3 = 0,8447239 0,1 (0,7833587)2 = 0,7833589

por lo que y3 = 0,7833589.

Esta estrategia puede extenderse a esquemas numericos muy diferentes, combinando un esquema
explcito de prediccion y un esquema implcito de correccion. Por ejemplo, si se deseara utilizar un
-metodo con > 0 para la fase correctora y el metodo de Euler explcito para la fase predictora, el
esquema de calculo sera: Fase predictora (Euler explcito):
(0)
yn+1 = y0 hn f (tn , yn )

Fase correctora ( -metodo combinado con aproximaciones sucesivas):


(iter+1) (iter)
yn+1 = yn + (1 ) hn f (tn , yn ) + hn f (tn+1 , yn+1 (iter = 0, 1, 2, ...)

As por ejemplo, se deja como ejercicio propuesto verificar que la estrategia de calculo anterior con = 0,5
aplicada al problema de valor inicial del ejemplo 3 conduce a los valores

y1 = 0,9087121, y2 = 0, 8327505, y3 = 0, 7685438, y4 = 0, 7135529, y5 = 0, 6659224, ....

De hecho algunos metodos de calculo muy utilizados en la practica, y que posteriormente nos reen-
contraremos, podran interpretarse como un esquema predictor corrector en los que se realizan pocas
iteraciones del metodo de aproximaciones sucesivas en la fase de correccion. Es el caso por ejemplo de
combinar el metodo de Euler explcito en la fase de prediccion y realizar una sola iteracion en la fase
correctora utilizando el metodo de Crank-Nicholson, lo que nos conduce a:
(0)
yn+1 = yn + hn f (tn , yn )
hn (0)
yn+1 = yn + (f (tn , yn ) + f (tn+1 , yn+1 ))
2

por lo que, resumiendo las dos etapas en una unica expresion resulta:
hn
yn+1 = y : n + (f (tn , yn ) + f (tn+1 , yn + hn f (tn , yn )))
2
Este esquema de calculo recibe el nombre de metodo de Heun y su generalizacion seran los metodos de
Runge-Kutta.

7.3. Sistemas de Ecuaciones Diferenciales

Los P.V.I. pueden formularse de una forma mas general para sistemas de ecuaciones diferenciales de
primer orden. Mas concretamente, siendo I un intervalo de IR de la forma [t0 , t0 + T ] y siendo f una
funcion continua definida en IxRm y con valores en Rm .
Practicas con Octave 66

La extension de los metodos numericos a problemas en los que intervenga un sistema de ecuaciones
diferenciales ordinarias es automatica y, en cuanto a su analisis, seran validos los teoremas y propiedades
que se presenten con la precaucion de emplear la metrica (normas) correspondiente en IRm.

7.3.1. Ecuacion de Orden Superior

Cabe senalar ademas que numerosos problemas de valor inicial se formulan mediante ecuaciones
diferenciales ordinarias de orden superior a 1 de la forma:

y (t) = f (t, y(t), y 0 (t), ..., y (p1 ),


(p
t[t0 , t0 + T ]



y(t0 ) = y0
(2)
y 00 (t0 ) = y0
..................




(p1 (p1)
y (t0 ) = y0
Tales tipos de P.V.I de orden superior a 1 pueden ser reducidos a sistemas de p ecuaciones diferenciales
de primer orden denominando:

z1 (t) = y(t), z2 (t) = y 0 (t), z2 (t) = y 00 (t), ...., zp (t) = y (p1 (t)

7.3.2. Usando Symbolic. Con Dsolve

Con el paquete Symbolic, dependera de la version de Phyton que tengamos instalada en el ordenador,
por eso voy a hacerlo en octave online. Si lo intentamos directamente en nuestro octave puede que nos
de problemas y solo nos resuelva los homogeneos. https://octave-online.net/ Con los sistemas lineales no
tendremos problemas.

Por ejemplo, para resolver el sistema

( 2t
x0 = 2 x y e2t + cose 3 (t)
y 0 = 17 x + 6 y + 25 t2
Practicas con Octave 67

Podemos probar en nuestro programa resolver la homogenea y la hara, aunque no la completa

>> A = [2, 1, 2; 1, 0, 2; 1, 1, 1]; roots(poly(A))

>> pkg load symbolic

>> syms x(t) y(t)

>> e1= diff(x,t)==-2*x-y

>> e2= diff(y,t)==17*x+6*y

>> dsolve([e1,e2])

Pero con sistemas no lineales no funciona. Veamos con este ejemplo de una reaccion qumica:

Sea la ecuacion qumica


A+B C D+E
donde A, B, C, D, y E representan distintos compuestos que reaccionan entre s. En esta ecuacion, la
concentracion de la especie A, que llamaremos y1 , y de la especie C, que denotaremos y2 reaccionan entre
Practicas con Octave 68

si mediante el sistema de ecuaciones diferenciales


 dy1 2
dt = y1 + y2
dy2 2 ,
dt = 2y2 + y1

teniendo en cuenta las condiciones iniciales y1 (0) = 1 e y2 (0) = 0 Utilizando Octave Online sera

Como vemos no la resuelve.

7.3.3. Resolucion con lsode

Intentamos resolver el problema de la reaccion qumica con lsode Definimos la funcion, los valores
iniciales y el intervalo entre 0 y 60 con h = 0,1

>> function xdot = f(y,t)

>> xdot(1) = y(1)2 + y(2);

>> xdot(2) = y(1)2 2 y(2);

>> endfunction

>> y0 = [0; 1];


Practicas con Octave 69

>> t = [0 : 0,1 : 60];

Aplicamos la orden Isode

>> y=lsode(f, y0 , t);

7.3.4. Resolucion por Metodos Numericos

Resolvamos ahora el sistema anterior aplicando los otros metodos. Empezemos con Euler Explcito.
El planteamiento es el mismo, pero la funcion y los datos seran vectores. En primer lugar definimos la
funcion, para ellos utilizamos la funcion function / endfunction :

>> function R=REACCION(t,R)

K1=1;

K2=1;

K3=1;

K=0;

RR(1)=-K1*R(1)*(R(1)-K)+K2*R(2);

RR(2)=-(K2+K3)*R(2)+K1*R(1)*(R(1)-K);

R=RR

>> endfunction

Se debe utilizar una variable auxiliar, en este caso RR, ya que sino, si hubiesemos puesto

R(1)=-K1*R(1)*(R(1)-K)+K2*R(2);
Practicas con Octave 70

R(2)=-(K2+K3)*R(2)+K1*R(1)*(R(1)-K);

al calcular R(2) ya R(1) se habra actualizado en el calculo de la lnea anterior. Definimos los valores
iniciales para este problema:

>> RA0=1

>> RC0=0;

>> R 0 = [RA0 RC0];

>> t 0=0;

>> t f=60;

>> h=0.1;

>> N=(t f-t 0)/h;

Y aplicamos la orden feuler

>> [t,Re]=feuler(REACCION,[t 0, t f],R 0,N);

Pulsamos q para que no salgan todos los ficheros. Podemos aplicar tambien del mismo modo Euler
Implcito y Crank-Nicholson

>> [t,Ri]=beuler(REACCION,[t 0, t f],R 0,N);

>> [t,Rc]=cranknic(REACCION,[t 0, t f],R 0,N);

Representamos las tres juntas

>> figure1

>> plot(t,Re,-.,t,Ri,-,t,Rc, o)

>> title( Euler Explcito,Implcito y Crank Nicholson. Concentracion de las especies)

>> legend( A exp, C exp, A imp, C imp, A exp, C Cran);


Practicas con Octave 71

Obtenemos

En el caso de los sistemas no se cumple que el en del caso de que Euler Explcito e Implcito sean
convergente, Crank-Nicholson estara entre ambos, al menos en todas las variables.
0
x = xy
Ejemplo. Modelo de Epidemias. Sea la ecuacion y 0 = xy y , donde
0
z = y

x(t) representa a los individuos susceptibles, es decir, aquellos que no han enfermado anteriormente
y por lo tanto pueden resultar infectados al entrar en contacto con la enfermedad. El tiempo medido
en semanas
y(t) representa a los individuos infectados y por lo tanto en condiciones de transmitir la enfermedad
a los del grupo anterior x
z(t), por ultimo, representa a los individuos recobrados de la enfermedad, y que ya no estan en
condiciones ni de enfermar nuevamente ni de transmitir la enfermedad a otros.

Resolver para = 0,2 y = 0,7 en el intervalo [0, 5] sabiendo que al principio haba una persona infectada
en una poblacion de 20 habitantes. Que situacion habra en la semana 3.

Con LSODE Definimos la funcion para esos valores

>> function sis = f(y,t) b=0.2,g=0.7;

sis(1) = -b*y(1)*y(2);

sis(2) = b*y(1)*y(2)-g*y(2);

sis(3)=g*y(2)

>>endfunction

Damos los valores iniciales, en un principio habra 1 enfermo, 19 sanos y nadie que haya pasado la
enfermedad, luego x = 19, y = 1, z = 0
Practicas con Octave 72

>> y0=[19; 1;0];

Tomamos el intervalo y h = 0,1

>> t=[0:0.1:5];

>> y=lsode(f, y0 , t);

sis =

-3.80000 3.10000 0.70000

sis =

-3.80000 3.10000 0.70000

Pulsamos q para no seguir viendo los valores.

Representamos con plot.

>> figure(1)

>> plot(t,y)

Y obtenemos

Observando los valores iniciales, vemos que x esta en azul, y en rojo y z en amarillo. Si queremos asignar
nosotros los colores:

>>figure 2; plot (t, y(:,1),b, t, y(:,2), r,t,y(:,3),y);legend( y 1(t), y 2(t), y 3(t))

En la semana 3, tendremos

>> t(31)
Practicas con Octave 73

ans = 3

>> y(:,1)(31)

ans = 0.27486

>> y(:,2)(31)

ans = 4.8994

>> y(:,3)(31)

ans = 14.826

Habra 5 enfermos y 15 que han pasado la enfermedad.

Resolucion por Metodos Numericos: Definimos la funcion con su variable auxiliar:

>>function R=EPIDEMIA3(t,R)

b=0.2; g=0.7; RR(1)=-b*R(1)*R(2);

RR(2)=b*R(1)*R(2)-g*R(2); RR(3)=g*R(2); R=RR

>>endfunction

Ahora los valores iniciales

>>R 0=[19 1 0];t 0=0;t f=5; h=0.1;N=t f/h;

>>[t,Re]=feuler(EPIDEMIA3,[t 0, t f],R 0,N);

>>figure 2; plot(t,Re);title( Euler Explcito. Epidemia 3x3)

Obtenemos

Probamos con Euler implcito


Practicas con Octave 74

>>[t,Ri]=beuler( EPIDEMIA3,[t 0, t f],R 0,N);

>>figure 3; plot(t,Rb); title( Euler Implcito. Epidemia 3x3)

Como vemos, en este caso Euler Implcito no da buenos resultados, y por tanto, tampoco lo dara
Crank-Nicholson.

Resolvamos una ecuacion de oden superior no lineal, en el estudio de algunas capas lmite de flujos
laminares aparece la denominada ecuacion de Blasius que es una EDO de tercer orden de la forma:

y 000 (x) + y(x) y 00 (x) = 0 x0

Se ha llamado a la variable independiente x porque en esta ocasion la variable independiente no es el


tiempo sino que es una variable adimensional relacionada con la coordenada espacial. La ecuacion de
Blasius se acompana de las tres condiciones iniciales y(0) = y 0 (0) = 0, y 00 (0) = donde es un valor
conocido = 0,47. Con ello se puede plantear el problema de valor inicial de Blasius en forma de sistema,
denotando z1 (x) = y(x), z2 (x) = y 0 (x), z3 (x) = y 00 (x), de la forma siguiente:
0
z (x) = z2 (x) x0
10


z2 (x) = z3 (x) x0
0
z (x) = z 1 (x) z3 (x) x0
3


z1 (0) = o z2 (0) = 0 z3 (0) =

o expresado de manera matricial


z 0 (x) = f (x, z(x))

x0
z(0) = [0, 0, ]
donde z(x) =[z1 (x), z2 (x), z3 (x)] y

f (x, z(x)) = [z2 (x), z3 (x), z1 (x)z3 (x)]

Realizamos la resolucion en fichero resolucionblasius.m, donde se llama a la funcion blasius, definida


en el fichero ejercicioblasius.m
Practicas con Octave 75

ejercicioblasius.m:

function Z=blasius(x,Z)

Z(1)= Z(2);

Z(2)=Z(3)

Z(3)= -Z(1)*Z(3);

return

resolucionblasius.m:

alpha=0.47

z0=[0 0 alpha];

x0=0;

xf=6;

h=0.1;

N=xf/h;

[x,Z]=feuler(fblasius, [x0,xf],z0,N);

umbral=inline(0.*x+1,x);

figure

plot(x,Z,x,umbral(x),.g);

title(perfil blasius)

Obteniendo
Practicas con Octave 76

7.3.5. Metodos de Runge-Kutta

Los metodos de Runge-Kutta representan el ejemplo mas clasico de los metodos de pasos libres.
Consideramos el problema de valor inicial (P.V.I.) y la subdivision del intervalo [t0 , tN ] generando los
puntos t0 < t1 < t2 < .... < tn < tn+1 < .... < tN , y con subintervalos [tn , tn+1 ] de longitud hn (n = 0, 1,
..., N - 1).

Siendo y(tn ) el valor de la solucion en tn , el valor exacto de la solucion en tn+1 puede estimarse
mediante la expresion: Z tn+1
y(tn+1 ) = y(tn ) + f (t, y(t))dx.
tn

Una forma de obtener aproximaciones de dicho valor consistira en aproximar la integral de la expresion
anterior mediante una formula de integracion numerica:
p
X
yn+1 = yn + hn aj f (tn,j , yn,j ),
j=1

donde p es el numero de puntos de integracion usados en la formula escogida, aj (j = 1, ..., p) son los
pesos de dicha formula, tn,j (j = 1, ..., p) son los p puntos pertenecientes al intervalo [tn , tn+1 ] que actuan
como soporte para la formula de integracion y, finalmente, yn,j son los valores (o una aproximacion de
ellos) de y(t) en los puntos tn,j . El problema que se plantea es como evaluar yn,j . Para ello, procediendo
de forma similar, se considerara que:
Z tn,j
y(tn,j ) = y(tn ) + f (t, y(t))dx j = 1, 2, ..., p,
tn

por lo que una aproximacion de dichos valores puede obtenerse, nuevamente, aproximando la integral
anterior. Y en los metodos de Runge-Kutta esta aproximacion se realiza utilizando los mismos puntos
que en la expresion anterior, es decir:
p
X
yn,j = yn + hn bi,j f (tn,i , yn,i ),
j=1

donde bj,k (j, k = 1, ..., p) es el peso otorgado al punto tn,k en la formula de integracion numerica utilizada
para aproximar el valor de y(t) en tn,j . Las expresiones dadas forman un sistema de (p+1) ecuaciones
en las que las incognitas son los p valores yn,j (j = 1, ..., p) y el valor yn+1 . El uso de una u otra formula
de integracion numerica en las expresiones conduce a muy distintos esquemas de tipo Runge-Kutta. Por
ello para definir una formula de Runge-Kutta se debe concretar cuales son los puntos tn,j (j =1, ..., p)
utilizados en las formulas de integracion numerica, cuales son los coeficientes aj y bj,k (j, k = 1, ..., p)
usados en las formulas. Habitualmente, los puntos tn,j se suelen definir mediante una expresion del tipo:

tn,j = tn + cj hn j = 1, ..., p

y el esquema se define mediante la tabla siguiente:

c1 b1,1 b1,2 ... b1,p


c2 b2,1 b2,2 ... b2,p
. . . ... .
. . . ... .
cp bp,1 bp,2 ... bp,p
a1 a2 . ap
Practicas con Octave 77

En dicha tabla designaremos por vector a, matriz B y matriz C al vector y matrices siguientes:

b1,1 b1,2 ... b1,p c1 0 ... 0
a1 b2,1
a1 b2,2 ... b2,p

0
c2 ... 0
a= . B= . . ... . , B = . . ... . .

. . ... . . . ... .
ap
bp,1 bp,2 ... bp,p 0 0 ... cp

Ejemplo de Runge-Kutta.

Puede disenarse un metodo de Runge-Kutta en el que la formula que nos proporcione yn+1 utilice la
formula de Simpson:
Z b  
ba a+b
(x)dx (a) + 4 ( ) + (b)
a 6 2
Para ello, se tomara p = 3 y en el intervalo [tn , tn+1 ] los puntos de integracion seran:

tn,1 = tn ( c1 = 0)
tn,2 = tn + 0,5 hn ( c2 = 0,5)
tn,3 = tn + hn ( c3 = 1)

y los pesos de integracion en la formula considerada seran: a1 =1/6, a2 =4/6, a3 =1/6, resultando:
 
1 4 1
yn+1 = yn+1 + hn f (tn,1 , yn,1 ) + f (tn,2 , yn,2 ) + f (tn,3 , yn,3 )
2 6 6

Para emplear la formula anterior es necesario evaluar: yn,1 (= yn ),yn,2 e yn,3 . Para ello se sabe que:

yn,1 = yn
Rt
yn,2 = yn + tnn,2 f (t, y(t))dt
Rt
yn,3 = yn + tnn,3 f (t, y(t))dt

y evaluando la primera de las integrales mediante la formula del trapecio:


Z tn,2
tn,2 tn hn
f (t, y(t))dt (f (tn , yn ) + f (tn,2 , yn,2 )) = (f (tn , yn ) + f (tn,2 , yn,2 )
tn 2 4

y la segunda mediante el metodo del punto medio:


Z tn,3
f (t, y(t))dt (tn,3 tn ) f (tn,2 , yn,2 ) = hn f (tn,2 , yn,2 )
tn

resultara:
yn,1 = yn ( b1,1 = 0, b1,2 = 0, b1,3 = 0)
yn,1 = yn + h4n (f (tn , yn ) + f (tn,2 , yn,2 )) ( b2,1 = 1/4, b2,2 = 1/4, b2,3 = 0)
yn,3 = yn + hn f (tn,2 , yn,2 ) ( b3,1 = 0, b3,2 = 1, b3,3 = 0)

La segunda de las expresiones anteriores es una ecuacion (en general no lineal) que debera resolverse
mediante algun metodo numerico como los presentados en el tema anterior. El esquema en forma de
tabla sera:
0 0 0 0
1/2 1/4 1/4 0
1 0 1 0
1/6 4/6 1/6
Practicas con Octave 78

El metodo de Euler, puede considerarse como un caso particular de los metodos de Runge-Kutta en
el que p = 1 y:
0 0
1

El algoritmo rk2 contiene el metodo de Heun, mientras que el algoritmo rk3 contiene el metodo de
Runge-Kutta de orden 3 dado por la tabla
0 0 0 0
1/2 1/2 0 0
1 1 2 0
1/6 4/6 1/6

El metodo de Euler modificado y el metodo de Heun. Siendo un numero real, el metodo dado por:
0 0 0
0
1 1
1 2 2

se traduce en las expresiones:


yn,1 = yn
yn,2 = yn + hn f (tn , yn )
1 1

yn+1 = yn + hn (1 2 ) (f (tn , yn ) + 2 f (tn + hn , yn,2 )
Para el caso = 0,5, el metodo se denomina de Metodo de Euler modificado:
 
hn hn
yn+1 = yn + hn f tn + , yn + f (tn + yn )
2 2
Para el caso = 1, el metodo se denomina de Metodo de Heun:
hn
yn+1 = yn + (f (tn , yn ) + f (tn + hn , yn + hn f (tn + yn )))
2

El ejemplo de Runge-Kutta clasico responde a la tabla:


0 0 0 0 0
1/2 1/2 0 0 0
1/2 0 1/2 0 0
1 0 0 1 0
1/6 1/3 1/3 1/6
Por tanto, en este metodo, los puntos intermedios escogidos en el paso n seran:

tn,1 = tn
tn,2 = tn + 0,5 hn
tn,3 == tn + 0,5 hn (= tn,2 )
tn,4 = tn + hn

y como vemos se repite el punto medio. Con los puntos as tomados, se considera yn,1 = yn . El valor
de yn,2 se evalua aproximando la integral correspondiente mediante la formula del rectangulo con soporte
en el extremo izquierdo del intervalo de integracion, es decir:
Z tn,2
hn
y(tn,2 ) = y(tn ) + f (t, y(t))dt yn,2 = yn + f (tn , yn )
tn 2
Practicas con Octave 79

El valor de yn,3 se calcula aproximando la integral correspondiente mediante la formula del rectangulo
pero esta vez con el punto de soporte en el extremo derecho del intervalo y tomando precisamente yn,2
como valor aproximado de la funcion y(t) en dicho extremo derecho:
Z tn,3
hn hn
y(tn,3 ) = y(tn ) + f (t, y(t))dt yn,3 = yn + f (tn + , yn,2 )
tn 2 2
En cuanto al valor de yn,4 lo evaluaremos aproximando la integral correspondiente mediante una formula
de punto medio, considerando como valor de y(t) en el punto medio del intervalo en el que se plantea la
formula el valor yn,3 que se acaba de calcular, es decir
Z tn +hn
hn
y(tn,4 ) = y(tn ) + f (t, y(t))dt yn,4 = yn + hn f (tn + , yn,3 )
tn 2
Por ultimo, el valor de yn+1 se evalua, con ayuda de los valores anteriores, aproximando la integral
correspondiente mediante una formula de Simpson en la cual el peso asignado al punto medio del intervalo
se reparte por igual entre las dos aproximaciones del valor de y(t) que hemos obtenido en dicho punto
medio (y(tn,2 e yn,3 ):
Z tn +hn
y(tn+1 ) = y(tn ) + f (t, y(t))dt
tn
hn
yn+1 = yn + (f (tn , yn ) + 2 f (tn,2 , yn,2 ) + 2 f (tn,3 , yn,3 ) + f (tn,4 , yn,4 ))
6
hn hn hn
= yn + (f (tn , yn ) + 2 (f (tn + , yn,2 ) + f (tn + , yn,3 )) + f (tn + hn , yn,4 ))
6 2 2
Metodo de Euler Implcito Mejorado es el metodo de Runge-Kutta definido mediante la tabla:
1 1
1
que es el metodo
yn,1 = yn + hn f (tn+1 , yn,1 )
yn+1 = yn + hn f (tn+1 , yn + hn f (tn+1 , yn,1 ))
En resumen, el algoritmo del metodo de Runge-Kutta clasico, esta definido, en cada paso, por las expre-
siones:
tn,j = tn + cj hn (j = 1, .., p)
X p
yn,j = yn + hn bi,j f (tn,i , yn,i ), (j = 1, .., p)
j=1
p
X
yn+1 = yn + hn aj f (tn,j , yn,j )
j=1
A la hora de realizar un algoritmo de un metodo como el anterior, computacionalmente es mas eficaz
denotar por:
p
X
Wn,j = f (tn,j , yn + hn bi,j Wn,i ), (j = 1, .., p)
j=1
con lo que:
p
X
yn+1 = yn + hn aj Wn,j .
j=1
Se trata de dos sistemas de ecuaciones, en general no lineales, el primero nos proporcionara los valores
de Wn,j en cada paso. Estos valores introducidos en el segundo nos determinaran la solucion aproximada
yn+1 . Facilmente puede comprobarse que ambas expresiones son equivalentes a las antes utilizadas para
describir el metodo.
Practicas con Octave 80

7.4. Problemas de Valor Inicial y de Contorno

7.4.1. Problemas de transporte estacionario 1-dimensionales

Dado el siguiente problema de transporte

u00 (x) + u0 (x) + u(x) = f (x) x (a, b)


(

u(a) = ua , u(b) = ub

se resuelve mediante el comando:

[x,u] = bvp(a,b,N,mu,eta,sigma,f,ua,ub)

en donde mu= , eta= , sigma= , f es una funcion inline y N es el numero de nodos internos (es decir,
N = (No. Intervalos) 1 = ba
h 1 en donde h es el paso de discretizacion.

En la salida, x = (x1 , . . . , xN +1 ) es el vector que contiene los puntos del mallado y u = (u1 , . . . , uN +1 )
contiene las aproximaciones obtenidas por el metodo en los puntos del mallado.

7.4.2. Problemas de difusion evolutiva 1-dimensionales

El siguiente Problema de Valor Inicial y de Contorno (PVIC)

2u

u

= + f (x, t) (x, t) (0, L) (0, T )
t x2


u(x, t) = g(x, t) x = 0, x=L


x (0, L)

u(x, 0) = u0 (x)

se resuelve mediante el comando:

[x,u] = heattheta(xspan,tspan,nstep,theta,mu,u0,g,f)

en donde

xspan = [a,b] - Intervalo espacial.


tspan = [0,T] - Intervalo temporal.
nstep = [Nx,Nt] - Nx, Nt numero de intervalos espaciales y temporales respect.
theta = - -metodo de la parte temporal ( = 0 EE, = 0,5 CN, = 1 EI)
mu = - constante positiva
u0,g,f - funciones inline

En la salida Octave muestra directamente la grafica de la aproximacion de la solucion exacta u(x, t)


en el instante t = T y almacena en el vector x = (x1 , x2 , . . . , xN +1 ) los puntos del mallado espacial y en
u = (uT1 , uT2 , . . . , uTN +1 ) los valores de la aproximacion buscada en el instante t = T .

t 1
Observacion. El metodo es estable (1 2) .
(x)2 2
Captulo 8

Otros comandos y funciones utiles

8.0.1. Los comandos max y min

Dado un vector cualquiera u los comandos de Octave max y min devuelven los valores maximo y
mnimo que contiene el vector u.

Por ejemplo, si definimos el vector u = (2, 3, 4, 5, 6, 5, 4, 3, 2, 1), entonces max(u) devuelve 6 y min(u)
devuelve 1:

u = [2,3,4,5,6,5,4,3,2,1]
max(u)
min(u)

Si ademas incluimos dos parametros de salida de la forma

[Max,PosMax] = max(u)
[Min,PosMin] = min(u)

en las variables Max y Min se almacenan el valor maximo y el mnimo de u respectivamente, y en PosMax
y PosMin se almacenan las posiciones de u en donde se alcanzan.

8.0.2. Calculo de posiciones. El comando find.

Dado un vector cualquiera u el comando find devuelve la posicion (dentro del vector) en la que se
encuantra uno o varios valores de u. Es importante tener en cuenta que en Octave los vectores empiezan
en la posicion 1.

Por ejemplo, si tomamos de nuevo el vector u = (2, 3, 4, 5, 6, 5, 4, 3, 2, 1) y escribimos:

find(u==6)
find(u==4)

81
Practicas con Octave 82

el primer comando devuelve el valor (posicion) 5 y el segundo comando devuelve los valores 3 y 7, que
son en efecto las posiciones en las que se encuentra el 4 dentro de u.

El comando find permite tambien recuperar las posiciones en donde los valores del vector verifican
alguna condicion >, <, >=, <=, =.
Por ejemplo, el comando

find(u>=4)

devuelve las posiciones 3, 4, 5, 6 y 7.

Forma alternativa de calcular posiciones. En la mayor parte de los problemas que trataremos, las
busquedas de posiciones las realizaremos en vectores que representan los mallados

t0 < t1 < t2 < . . . < tm < . . . < tN 1 < tN

que consideramos para resolver de manera numerica los problemas que se nos plantean. Es este caso, si
tomamos como constante el paso de discretizacion h (constante), podemos recuperar todos los puntos del
mallado dentro del vector t en la posicion m mediante la formula:

t(m) = t0 + (m 1)h

la cual nos sirve para calcular la posicion m.

Por ejemplo, si queremos calcular la aproximacion obtenida a partir del metodo de Euler explcito en
un intervalo [1, 3] en el instante t = 1,6 habiendo tomado un paso de discretizacion h = 0,1, tenemos que
1,6 1
t(m) = 1 + (m 1)0,1 = 1,6 = m = +1=7
0,1
Captulo 9

Transformada de Laplace. Funciones


definidas a trozos. La funcion
Heaviside

9.0.1. Transformada de Laplace. Funciones definidas a trozos. La funcion


Heaviside

Se puede definir y representar una funcion derinida a trozos, como



1 2x ,x < 0
f (x) = 1/2 , x 1
1!(x + 1)3 + 2x , x > 1

de la siguiente forma >> x = linspace(-2, 3, 1000); >> y = (1 2 x). (x <= 1) + ((x + 1).3 +
2 x). (x > 1); >> plot(x,y) >> plot(x,y,.)

Las funciones definidas a trozos tambien pueden definirse usando la funcion Heaviside o funcion
escalon:
0 ,x < 0
H(x) = 1/2 , x = 0
1 ,x > 0

Para utilizarla en Octave usamos la funcion heaviside.m, la cual podremos combinar para construir todo
tipo de funciones definidas a trozos.

Por ejemplo, prueba a dibujar las siguientes funciones en el intervalo [0, 5] usando Octave:

f = inline(heaviside(x-2),x)
f = inline(heaviside(x-2)-heaviside(x-4),x)
f = inline(exp(x).*(heaviside(x-2)-heaviside(x-4)),x)

83
Practicas con Octave 84

9.1. Transformada de Laplace

Se puede calcular la transformada de Laplace con Octave Symbolic. Con la orden laplace(f(t),t,s) o
bien laplace(f) o laplace(f,s) se puede calcular la transformada de Laplace. La transformada inversa se
puede calcular con ilaplace.

>> load symbolic

>> syms t

>> f (t) = t2 + t3 sin(t)

>> laplace(f)

>> g = t heaviside(t) + t2 heaviside(t 1)

>> laplace(g)

>> ilaplace((s2 + s + 1)/(s3 + 4 s2 + 13 s))

>> G(s) = 1/s exp(2 s) s/(s3 4 s2 + 4 s)

>> ilaplace(G)
Captulo 10

Analisis Vectorial

10.0.1. Representacion de Campos Vectoriales

De manera similar a como se representaron los campo de direcciones


h de iuna ecuacion diferencial 7.1,
y x
se puede representar un campo de vectores, por ejemplo F = x2 +y2 , x2 +y2

>> close all; clear all; clc;

>> x = 1 : 0,1 : 1;

>> y = x;

>> [X, Y ] = meshgrid(x, y);

>> F X = Y./sqrt(X.2 + Y.2 );

>> F Y = X./sqrt(X.2 + Y.2 );

>> quiver(X, Y, F X, F Y );

>> grid on;

85
Practicas con Octave 86

h i
y x z2
Del mismo modo podramos representar un campo en R3 , x2 +y 2 , x2 +y 2,1 + 2

>> x = 0 : 0,2 : 1; y = x; z = 0 : 0,2 : 2;

>> [X, Y, Z] = meshgrid(x, y, z);

>> U = Y./sqrt(X.2 + Y.2 );

>> V = X./sqrt(X.2 + Y.2 );

>> W = Z.2 /2 + 1;

>> h = quiver3(X, Y, Z, U, V, W );

>> grid on;

>> set(h,0 linewidth0 , 2);


Practicas con Octave 87

 
Del mismo modo podramos representar 0, 0, 9 x2 y 2

10.0.2. Representacion de curvas y superficies

Vemos diversas representaciones que nos pueden ayudar en los ejercicios de Analisis Vectorial.

Para representar una curva en polares usamos la orden polar(x,y)

>> x = linspace(pi, pi, 100);

>> y = cos(2. x);


Practicas con Octave 88

>> polar(x, y)

Una curva en parametricas [t cos(t), t sin(t)] se podra representar directamente con plot

>> t = [4 pi : pi/50 : 4 pi];

>> plot(t. cos(t), t. sin(t))

O en tres dimensiones [t cos(t), t sin(t), 2 t]

>> plot3(t. cos(t), t. sin(t), 2 t)

>>grid( on);

O bien, en dos dimensiones en polares, r = 3 5 t, pasandolas a parametricas

>> theta = linspace(0, 10 pi, 300);

>> ro = 3 5. theta;

>> x = ro. cos(theta); y = ro. sin(theta);


Practicas con Octave 89

>> plot(x, y)

>> axis equal

Con la orden mesh se puede representarp una superficie, sus curvas de nivel con contour, o ambas cosas
en una sola grafica con meshc, para z = 9 + x2 + y 2 ,

Creamos una malla

>> x = [2 : 0,1 : 2]; y = x;

>> [X, Y ] = meshgrid(x, y)

Definimos la componente Z

>> Z3 = sqrt(9 + X.2 Y.2 )

Y representamos

>> mesh(X, Y, Z3)

>> contour(X, Y, Z3)

>> meshc(X, Y, Z3)


Practicas con Octave 90

Con la orden surf se pueden representar superficies en parametricas. Para representar un toro definimos

>> R = 2; r = 1;

>> t1 = 0 : pi/25 : 2 pi; p = t1;

>> [T, P ] = meshgrid(t1, p);

>> X = R cos(P ) + r cos(T ). cos(P );

>> Y = R sin(P ) + r cos(T ). sin(P );

>> Z = r sin(T );

>> surf (X, Y, Z);

Hay ordenes que representan directamente una superficie conocida, se pueden ver en

https://www.gnu.org/software/octave/doc/interpreter/Three 002ddimensional-Geometric-Shapes.html

por ejemplo para una esfera basta:

>> sphere,axis square


Practicas con Octave 91

10.0.3. Calculos de gradiente, divergencia, rotaciona. Representaciones.

Octave Symbolic nos permite diversos calculos de analisis vectorial como el gradiente, la divergencia
o el rotacional con las ordenes gradient, divergence o curl respectivamente.

>> pkg load symbolic

>> syms x y z

Para la divergencia y rotacional

>> F = [x2 x, y 2 z, x2 + y 2 + z 2 ]

>> divergence(F )

ans = (sym) 2*x + 2*y + 2*z - 1

>> curl(F )

[2 y + 1]

[ 2 x ]

[ 0 ]

Por ejemplo para el gradiente de la funcion f = x2 y 3 + 3 x z,

>> f = x2 y 3 + 3 x z

>> g = gradient(f )

g = (sym 3x1 matrix)

[2*x + 3*z]

[ 3 y 2 ]

[ 3x ]

Y para su valor en un punto concreto

>> g1 = subs(g, x, y, z, 1, 2, 3)
Practicas con Octave 92

g1 = (sym 3x1 matrix)

[-7 ]

[-12]

[3]

Tambien lo podramos haber calculado directamente sin usar la orden, con

>> f x = dif f (f, x)

>> f y = dif f (f, y)

>> f z = dif f (f, z)

>> gx = subs(f x, x, y, z, 1, 2, 3)

>> gy = subs(f y, x, y, z, 1, 2, 3)

>> gz = subs(f z, x, y, z, 1, 2, 3)

Calculemos el gradiente de f = 3 x2 4 y 2 , y representamos la superficie y las curvas de nivel, la


particular que pasa por el punto (1, 2) y los vectores gradiente y tangente

>> f = 3 x2 4 y 2 ;

>> g = gradient(f );

>> gs = subs(g, x, y, 1, 2)

>> mg = sqrt(gs(1)2 + gs(2)2 )

>> c1 = gs(1)/mg

>> c2 = gs(2)/mg

>> vpa(c1)

ans = (sym) -0.3511

>> vpa(c2)

ans = (sym) -0.9363

>> t1 = 3 : 0,2 : 3;

>> [X, Y ] = meshgrid(t1, t1);

>> Z = 3 X.2 4 Y.2 ;

>> surf (X, Y, Z)

y para las curvas de nivel

>> cn = contour(X, Y, Z, 10);

>> clabel(cn)

>> axisequal
Practicas con Octave 93

Y para el punto (1, 2)

>> holdon

>> plot(1, 2,0 o0 )

El vector gradiente >> quiver(1, 2, 0,35, 0,94)

y el vector tangente >> quiver(1, 2, 0,94, 0,35)

Vous aimerez peut-être aussi