You are on page 1of 56

Captulo

10

Aplicaciones
a problemas con MATLAB

10.1 INTRODUCCIN A MATLAB


En este captulo haremos una breve introduccin a MATLAB dirigida a usuarios que no han trabajado
nunca con MATLAB. El objetivo principal de este captulo es que Usted aprenda a programar en MATLAB, es
decir, que sea capaz de crear y modificar programas basados en los algoritmos dados en el libro Mtodos
Numricos aplicados a la Ingeniera. Vale la pena aadir de que el uso de este software adquiere gran
importancia cuando se aplica a sistemas de gran nmero de ecuaciones, ya sea de tipo algebraicas o del
tipo de sistemas de ecuaciones algebraicas no lineales. Una ventaja adicional es la fcil representacin
grfica del resultado para su anlisis e interpretacin.

10.2 QU ES MATLAB?
MATLAB (MATrix LABoratory) es un entorno integrado de computacin orientado hacia la resolucin de
problemas cientficos y de ingeniera. MATLAB integra en un solo paquete clculo (numrico y simblico),
visualizacin grfica y programacin.
Algunas caractersticas notables de MATLAB son:
La programacin es ms sencilla.
No hay distincin entre nmeros enteros, reales y complejos.
La amplitud de intervalo y la exactitud de los nmeros son mayores.
Cuenta con una biblioteca matemtica amplia.
Abundantes herramientas grficas.
Capacidad de vincularse con los lenguajes de programacin tradicionales, tales como FORTRAN, C/
C++, Visual Basic, etc.
Transportabilidad de los programas MATLAB.
Adems, el entorno bsico de MATLAB se complementa con una amplia coleccin de cajas de herramientas
(toolboxes) que contienen funciones especficas para determinadas aplicaciones en diferentes ramas de
las ciencias y la ingeniera (por ejemplo: modelado, simulacin y optimizacin de sistemas, control de
procesos, adquisicin de datos, estadstica y control de calidad, etc.)
Estas caractersticas han hecho de MATLAB una herramienta muy efectiva para la educacin y la
investigacin.

Mtodos Numricos - Aplicados a la Ingeniera

10.3 EJECUTANDO MATLAB


Si ya tiene instalado MATLAB, para ejecutarlo proceda igual que con cualquier otra aplicacin WINDOWS,
hacer doble clic sobre el icono correspondiente. En seguida se presentar la ventana de comandos, similar
a la figura mostrada:

El smbolo nos indica que MATLAB est esperando que introduzcamos datos o alguna instruccin
(comando). Una vez que se escribe la orden deseada, hay que pulsar la tecla de retorno, entonces el
programa realiza la operacin indicada y muestra la respuesta (ans=). En las guas de uso y de referencia
(PDF) que acompaan al programa, as como en la ayuda (HELP) del programa pueden consultarse
informacin adicional sobre las instrucciones y el uso de MATLAB.

10.4 TIPOS DE DATOS


Los tipos de datos bsicos que soporta MATLAB son nmeros (enteros, reales y complejos), vectores y
matrices.
Ejemplos:
-2

(entero)

0.8205

(real)

1.600 + 2.800i

(complejo, donde i es la unidad imaginaria)

[1, -2, 0, 5.23]

(vector fila de 4 elementos)

[1; -2; 0; 5.23]

(vector columna de 4 elementos)

[2, 3, 0;

(matriz de orden 2 3)

[1, 4, 3]
Observar que los elementos de un vector fila estn separados por comas (o alternativamente por espacios
en blanco), mientras que los elementos de un vector columna estn separados por punto y coma. De
igual forma los puntos y comas separan las filas de una matriz, mientras que los elementos de la misma
fila deben separarse mediante comas.

Aplicaciones a problemas con MATLAB

CAP. 10

10.5 VARIABLES
Una variable almacena un dato cuyo valor puede cambiar durante la ejecucin de un programa. En
MATLAB no es necesario declarar las variables ni sus tipos. Sencillamente se crea la variable mediante
asignacin directa de su valor. La sintaxis es:
NOMBRE_VARIABLE = VALOR
Ejemplos:
Para definir una variable de tipo real, se puede realizar mediante la siguiente orden:
R = 0.08205
Para definir una variable de tipo vector, la orden a utilizar sera similar a la siguiente:
X1 = [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
Para definir una variable tipo matriz, se puede realizar de la siguiente forma:
A = [2, 3, 0;
1, 4, 3;
2, 1, 0]
Luego, para acceder a un elemento individual de un vector o matriz lo hacemos escribiendo el nombre de
la variable y a continuacin el o los ndices entre parntesis. Por ejemplo:
X1(6)
ans = 0.5
A(2, 3)
ans = 3
Importante: Tener en cuenta que MATLAB distingue las letras maysculas de las minsculas en los
nombres dados a las variables, as por ejemplo:
VOLUMEN

Volumen

volumen

Son identificadores vlidos y diferentes entre s.

10.6 OPERADORES EN MATLAB


Operadores aritmticos
A+B
AB
A*B
A
A^B
A/B
A\B
A.*B
A./B y A.\B
A.^B

Adicin
Sustraccin
Multiplicacin
Transpuesta
Potenciacin
Divisin-derecha
Divisin-izquierda
Producto elemento a elemento
Divisin elementoa a elemento
Elevar a una potecia elemento a elemento

Mtodos Numricos - Aplicados a la Ingeniera


Ejemplo 10.1
R = 2
V = (4/3) * pi * R^3
V = 33.5103
Observar que hemos utilizado la orden pi, la cual es una constante predefinida de MATLAB y que
corresponde al nmero = 3.14159265358979.
Ejemplo 10.2
A = [1 2
A =
1
3
A * 2
ans =
2
6
A - 4
ans =
-3
-1

; 3 4]
2
4

4
8

-2
0

Operadores relacionales:
A == B
A ~= B
A<B
A>B
A <= B
A => B

Igual a
Diferente
Menor
Mayor
Menor o igual
Mayor o igual

Operadores lgicos:
~P
P&Q
P|Q
xor(P, Q)

Negacin
Conjuncin
Disyuncin inclusiva
Disyuncin exclusiva. Devuelve unos donde x o y es distinto de cero (verdadero). Devuelve
ceros donde ambos x e y son ceros (falso) o ambos son distintos de ceros (verdadero).

Funciones relacionales y lgicas


Funciones exponenciales y logartmicas

any(x)

Devuelve uno si algn elemento en un vector x no es nulo. Devuelve uno


para cada columna en una matriz x que tiene elementos no nulos

all(x)

Devuelve uno si algn elemento en un vector x no es nulo. Devuelve uno


para cada columna en una matriz x que tiene elementos no nulos

isnan(x)

Devuelve unos en magnitudes no numricas (NaN) en x.

isinf(x)

Devuelve unos en magnitudes no numricas (NaN) en x.

finite(x)

Devuelve unos en magnitudes no numricas (NaN) en x.

Aplicaciones a problemas con MATLAB

CAP. 10

En MATLAB los valores lgicos 0 y 1 corresponden a verdadero y falso, respectivamente.


Ejemplo:
Q = (15 > 22) & (18 < 20)
Q = 0
Funciones predefinidas de MATLAB
Funciones con nmeros enteros y divisibilidad
mod(n,m)
sign(n)

Resto de la divisin de n entre m


Signo de n (1 para n < 0, 1 para n > 0)

max(n,m)

Mximo de los nmeros n y m

min(n,m)

Mnimo de los nmeros n y m

gcd(n,m)

Mximo comn divisor de n y m

lcm(n,m)

Mnimo comn mltiplo de n y m

factorial(n)
factor(n)

Factorial de n
Descompone n en factores primos

Funciones trigonomtricas

Funciones hiperblicas

Funcin

Inversa

Funcin

Inversa

sin(x)

asin(x)

sinh(x)

asinh(x)

cos(x)

cos(x)

cosh(x)

cosh(x)

tan(x)

atan(x), atan2(x)

tanh(x)

atanh(x)

cot(x)

acot(x)

coth(x)

acoth(x)

sec(x)

asec(x)

sech(x)

asech(x)

csc(x)

acsc(x)

csch(x)

acsch(x)

Funciones exponenciales y logartmicas


exp(x)

Funcin exponencial en base e

log(x)

Funcin logartmica en base e de x

log10(x)

Funcin logartmica en base 10 de x

log2(x)

Funcin logartmica en base 2 de x

pow2(x)

Funcin potencial en base 2 de x

sqrt(x)

Funcin raz cuadrada de x

Mtodos Numricos - Aplicados a la Ingeniera

Funciones especficas de variable numrica real


abs(x)

Valor absoluto del real x

floor(x)

Valor entero ms prximo hacia

ceil(x)

Valor entero ms prximo hacia +

round(x)

Redondeo haca el entero ms prximo de x

fix(x)

Redondeo haca el entero ms prximo a 0

mod(a,b)
sign(x)

Resto de la divisin entre los reales a y b


Devuelve 1 si x>0 y 1 si x<0. Aplicado en nmeros complejos
devuelve un vector unitario en la misma direccin

10.7 FORMATOS DE VISUALIZACIN DE NMEROS


En la Tabla siguiente se muestran los formatos numricos establecidos por MatLab.
Orden de MatLab

Comentarios

Format long

16 dgitos

Format ahort e

5 dgitos ms exponente

Format long e

16 dgitos ms exponente

Format hex

Hexadecimal

Format bank

2 dgitos decimales

Format +

Positivo, negativo o cero

Format rat

Aproximacin racional

Format short

Visualizacin por defecto

10.8 INFORMACIN SOBRE LAS VARIABLES


MatLab por defecto almacena los resultados en la variable ans. Las variables son sensibles a las maysculas
y puede contner hasta 19 caracteres y todos deben comenzar por una letra. Algunas variables especiales
se muestran a continuacin:
Variable
ans

Nombre por defecto de la variable usada para los resultados.

pi

Razn de una circunferencia a su dimetro.

eps

Nmero ms pequeo tal que, cuando se le suma 1, crea un nmero


en coma flotante en el computador mayor que 1.

inf

Infinito.

NaN

Magnitud no numrica.

i y j

Valor

i=1=v1

realmin

El nmero real positivo ms pequeo que es utilizable.

realmax

El nmero real positivo ms grande que es utilizable.

Aplicaciones a problemas con MATLAB

CAP. 10

10.9 MATRICES
La potencia de MATLAB radica en la capacidad de clculo matricial que posee, se puede trabajar con
matrices de forma muy cmoda y extensa.
Hay ciertas matrices espaciales que se pueden definir en MATLAB de forma directa, usando las siguientes
funciones:
Variable

Valor

diag(VECTOR)

Crea un matriz diagonal con los elementos de VECTOR en la diagonal.

eye(n)
zeros(m,n)

Crea una matriz de orden n


Crea una matriz de orden mxn

ones(m,n)

Crea una matriz de orden mxn con todos sus elementos 1

rand(m,n)

Crea una matriz aleatoria uniforme de orden mxn

randn(m,n)

Crea una matriz aleatoria normal de orden mxn

Ejemplos:
A = diag([5, 4, 3])
A =
5
0
0
0
4
0
0
0
3
I4 = eye(4)
I4 =
1
0
0
0
1
0
0
0
1
0
0
0
K = zeros(4, 3)
K =
0
0
0
0
0
0
0
0
0
0
0
0
B = ones(2, 3)
B =
1
1
1
1
1
1

0
0
0
1

Para el caso de las operaciones matriciales estas se rigen por las reglas del lgebra lineal. A continuacin
se especifican las operaciones ms importantes:
A+B

Suma de matrices

AB

Resta de matrices

A*B

Multiplicacin de matrices

Transpuesta de una matriz

A^n

Potencia escalar de una matriz

Mtodos Numricos - Aplicados a la Ingeniera


Ejemplo 10.4
B = [1, 13, 169]
B = B
B =
1
13
169
A = [1, 1, 1; 7, 9, 11; 49, 81, 121]
A =
1
1
1
7
9
11
49
81
121
X = A^(-1) * B
X =
1.0000
-3.0000
3.0000
El mismo resultado se obtiene si utilizamos cualquiera de las siguientes rdenes:
X = inv(A) * B
X = A \ B
El operador divisor izquierda es aplicable aunque la matriz no tenga inversa e incluso no sea cuadrada,
encuyo caso la solucin que se obtiene es la que proporciona el mtodo de mnimos cuadrados.
Ejemplo 10.5
A = [1, 2], B =[2]
A =
1
2
B =
2
A \ 2
x =
0
1
Observar que mediante el ejemplo anterior hemos obtenido la solucin del sistema de ecuaciones
lineales dado por:

x+ y+ z= 1
7x + 9y + 11z = 13
49x + 81y + 121z = 169

Una de las caractersticas ms tiles de MATLAB es que dispone de un conjunto de operadores que operan
sobre una matriz, elemento a elemento, estos son:
A .* B
A ./ B
A.^n

Aplicaciones a problemas con MATLAB

CAP. 10

Ejemplo 10.6
A = [0, 2; -1, 3]
A =
1
2
2
4
A^2
ans =
-2
6
-3
7
A.^2
ans =
0
4
1
9

10.10 GRAFICACIN
El comando plot grafica el conjunto de puntos (x, y) sobre el plano euclidiano (2D). Su sintaxis es:
plot(X, Y, S)
Donde X e Y son vectores fila que representan a las abscisas y las ordenadas, respectivamente. S es una
cadena que indica el tipo de lnea y/o carcter a usar en el ploteo y el color de la curva. Su formato es:
S = [TIPO DE LNEA][MARCA][COLOR]

Tipos de lnea
Continua
Guiones
Punteada
Guiones y puntos

Tipo de marca

:
.

Punto
Cruz
Astersco
Crculo
Aspa

.
+
*

Color de lnea
Rojo
Amarillo
Verde
Azul
Magenta
Cian
Negro
Blanco

r
y
g
b
m
c
k
w

Ejemplo 10.7
X = [0: 0.05: 10];
Y = sin(X) .* exp(-0.4 * X);
plot(X, Y, k);
xlabel(X);
ylabel(Y);
title(Graficacin en 2D);

Mtodos Numricos - Aplicados a la Ingeniera

En la primera lnea se especifica el dominio y el tamao de paso, en este caso 0.05. En la siguiente lnea
se define la funcin. Luego mediante la orden plot graficamos la funcin mediante una curva simple de
color negro (k). La cuarta y quinta lneas muestran un rtulo para los ejes X e Y, respectivamente. La ltima
lnea muestra un ttulo para el grfico.
El comando plot3 es la versin tridimensional de plot. Todas las reglas y comandos ya explicados para plot
se aplican a plot3.
Ejemplo 10.8
Como ejemplo vamos a graficar la hlice paramtrica definida por:
x(t) = sin(t) ; y(t) = cos(t) ; z(t) = t

10

t = [0: pi/50: 10*pi];


X = sin(t);
Y = cos(t);
Z = t;
plot3(X, Y, Z);
grid on;
xlabel(X); ylabel(Y); zlabel(Z);
title(Hlice paramtrica);

Aplicaciones a problemas con MATLAB

CAP. 10

Las grficas de superficie permiten obtener representaciones densas de figuras tridimensionales y en


especial de funciones de dos variables, de la forma:
z = (x, y)
Para graficar una funcin de este tipo, el procedimiento es el siguiente:
1. Utilizar el comando meshgrid para definir la malla (matriz de puntos) sobre los cuales se evaluar la
funcin para hacer su representacin grfica.
2. Usar el comando surf o contour, o cualquiera de sus variantes.
La sintaxis bsica de estos comandos es:
[X, Y] = meshgrid(VECTORX, VECTORY)
surf(X, Y, Z)
countour(X, Y, Z)
Ejemplo 10.9
Como ejemplo vamos a graficar la superficie dada por la siguiente ecuacin:

[X, Y] = meshgrid(-7.5: 0.5: 7.5);


warning off all;
Z = sin(sqrt(X.^2 + Y.^2)) ./ sqrt(X.^2 + Y.^2);
warning on all;
figure(1);
surf(X, Y, Z);
xlabel(X); ylabel(Y); zlabel(Z);

figure(2);
contour(X, Y, Z);
xlabel(X); ylabel(Y);

11

Mtodos Numricos - Aplicados a la Ingeniera

Mediante el comando contour tambin es posible graficar funciones implcitas, cuya sintaxis para graficar
curvas implcitas es:
contour(X, Y, F(X, Y), [0, 0])
Donde X e Y son vectores fila que representan los valores de x e y, respectivamente. F(X, Y) es la funcin en
x e y. El vector [0, 0] sirve para especificar el nivel de contorno, pues el nico contorno que nos interesa es
el del nivel 0, pero los niveles de contorno deben estar en forma de vector, por lo que repetimos el cero.
Ejemplo 10.10
Suponga que se desea graficar la siguiente funcin implcita:
y3 + exp(y) tanh(x) = 0

12

X = [-3: 0.2: 3];


Y = [-2: 0.2: 1];
[X, Y] = meshgrid(X, Y);
F = Y .^3 + exp(Y) - tanh(X);
contour(X, Y, F, [0, 0]);
xlabel(X); ylabel(Y);

Aplicaciones a problemas con MATLAB

CAP. 10

10.11 ESCRITURA DE PROGRAMAS


Un programa MATLAB es una secuencia de instrucciones escritas en lenguaje MATLAB, que puede aceptar
argumentos de entrada y produce una salida (resultados). Los programas de MATLAB suelen escribirse en
archivos denominados archivos M. La ventaja de escribir programas es que estos se pueden guardar en
disco y pueden modificarse tantas veces como sea necesario.
Los archivos M se pueden crear utilizando el editor de programas de MATLAB, para ello teclear la siguiente
orden en la ventana de comandos:
edit
En la ventana de edicin de programas (Editor/Debugger) se abre con un archivo en blanco en el cual
debemos crear nuestro archivo M. Para guardar los cambios realizados en un archivo M ingresar al men
File Save. Si se desea crear un nuevo archivo M ingresar File New. Para abrir un archivo M ya existente
utilizar File Open.

10.12 INSTRUCCIONES DE ENTRADA Y SALIDA


Un programa MATLAB puede aceptar datos de entrada a travs del teclado mediante el comando input.
Si se desea leer un valor numrico (escalar, vector o matriz), su sintaxis es la siguiente:
N = input(MENSAJE)
Donde MENSAJE es una cadena que se exhibe en la pantalla y le indica al usuario que informacin debe
ingresar.
De forma similar un programa MATLAB puede imprimir mensajes y resultados numricos si se utiliza el
comando disp, cuya sintaxis es:
disp(EXPRESIN)
Donde EXPRESIN puede ser un valor numrico o una cadena de caracteres.

13

Mtodos Numricos - Aplicados a la Ingeniera


Ejemplo 10.11
Suponga que se le pide escribir un programa MATLAB para resolver el siguiente sistema de dos ecuaciones
lineales:
ax + by = c
dx + ey =
Recordar que la solucin del sistema est dada por:

Para resolver este problema, cargar el editor de programas de MATLAB e ingresar el siguiente cdigo:
Listado SISLIN2.m
% Ingreso de datos
a = input(INGRESE A? );
b = input(INGRESE B? );
c = input(INGRESE C? );
d = input(INGRESE D? );
e = input(INGRESE E? );
f = input(INGRESE F? );
% Clculo de x e y
x = (c * e - b * f) / (a * e - b * d);
y = (a * f - c * d) / (a * e - b * d);
% Impresin de resultados
disp(SOLUCIN (X,Y)= );
disp([x, y]);
Una vez escrito el cdigo mostrado, guarde el programa como SisLin2.M. Para probar el cdigo que
acaba de escribir, vamos a resolver el sistema:
6x + y = 9
2x + 5y = 17
Para ello ingrese en la ventana de comandos de MATLAB lo siguiente:
SISLIN2
INGRESE A? 6
INGRESE B? 1
INGRESE C? 9
INGRESE D? 2
INGRESE E? 5
INGRESE F? 17
SOLUCIN (X, Y)=
1 3

Observar que las sentencias que comienzan con el smbolo % son comentarios, es decir son ignoradas
por el programa, pero sirven como referencia para hacer ms legible el cdigo.

14

Aplicaciones a problemas con MATLAB

CAP. 10

10.13 CONTROL DE FLUJO


Las estructuras de control permiten tomar decisiones y en funcin de ello el flujo de control de un
programa se bifurca a una de entre dos o ms posibles acciones. Tambin se utilizan para realizar un
proceso repetidas veces (procesos iterativos). MATLAB dispone de las estructuras de control if, for y
while, las cuales operan de manera similar a sus homlogas en otros lenguajes de programacin. Estas
instrucciones adoptan la sintaxis bsica siguiente:
if CONDICIN
COMANDOS_VERDADEROS;
else
COMANDOS_FALSOS;
end
------------------------------------------for CONTADOR = INICIO : INCREMENTO/DECREMENTO : FINAL
COMANDOS A EJECUTARSE;
end
------------------------------------------while CONDICIN
COMANDOS A EJECUTARSE;
end
------------------------------------------Ejemplo 10.12
Escrbase un programa que permita leer un entero y determine todos sus divisores.
Listado DIVISORES.m
N = input(INGRESE UN ENTERO?);
disp(LOS DIVISORES SON:);
for I = 1 : N
if mod(N, I) == 0
disp(I);
end
end
DIVISORES
INGRESE UN ENTERO? 12
LOS DIVISORES SON:
1
2
3
4
6
12

15

Mtodos Numricos - Aplicados a la Ingeniera


Ejemplo 10.13
Escriba un programa que permita leer un nmero e imprima en pantalla la suma de cifras del mismo.
Listado SUMCIFRASM.m
S = 0;
NUM = input(INGRESE UN NMERO?);
while NUM > 0
S = S + mod(NUM, 10);
NUM = fix(NUM / 10);
end
disp(SUMA DE CIFRAS DEL NMERO=);
disp(S);
SUMCIFRAS
INGRESE UN NMERO?
SUMA DE CIFRAS DEL NMERO=
24

290175

Ejemplo 10.14
Escriba un programa que para un nmero x permita calcular la siguiente sumatoria:

Hasta que el valor absoluto del trmino

sea menor que el error = 1 106.

Listado SUMCIFRASM.m
EPS = 1e-6;
X = input(VALOR DE X?);
SUMA = 1 + X;
TERMINO = X;
N = 1;
while abs(TERMINO) > EPS
N = N + 1;
TERMINO = TERMINO * X / N;
SUMA = SUMA + TERMINO;
end
disp(SUMA=);
disp(SUMA);
SERIE_EXP
VALOR DE X? 1
SUMA=
2.71828180114638
Ejemplo 10.15
Escriba un programa para obtener una solucin real de la ecuacin:
cosx 3x = 0
Utilizando el algoritmo de NewtonRaphson, tomando como valor inicial

16

Aplicaciones a problemas con MATLAB

CAP. 10

Listado NEWTON.m
X0
= input(VALOR INICIAL?);
EPS1 = input(CRITERIO DE CONVERGENCIA?);
EPS2 = input(CRITERIO DE EXACTITUD?);
MAXIT = input(MXIMO NMERO DE ITERACIONES?);
for I = 1 : MAXIT
FX = cos(X0) - 3 * X0;
dFX = -1 * sin(X0) - 3;
Xp = X0 - FX / dFX;
if (abs(Xp - X0) < EPS1) | (abs(FX) < EPS2)
disp(RAIZ APROXIMADA Xp=);
disp(Xp);
break;
end
X0 = Xp;
end
if K == MAXIT
disp(EL MTODO NO CONVERGE A UNA RAZ);
end
NEWTON
VALOR INICIAL?
pi/8
CRITERIO DE CONVERGENCIA?
1e-6
CRITERIO DE EXACTITUD?
1e-6
MXIMO NMERO DE ITERACIONES? 10
RAIZ APROXIMADA Xp=
0.31675082877122
La instruccin break permite salir de un bucle antes de que este se complete.

10.14 FUNCIONES
MATLAB dispone de una amplia gama de funciones que permiten realizar una gran variedad de tareas. Sin
embargo, se pueden crear funciones definidas por el usuario para realizar tareas especficas. Para ello se
debe definir la funcin como un archivo M, el nombre del archivo debe ser igual al nombre de la funcin
y se debe guardar en el directorio de trabajo por defecto.
La sintaxis para definir una funcin es:
function PARMETROS_SALIDA = NOMBRE_FUNCIN(PARMETROS _ENTRADA)
.
.
CUERPO DE LA FUNCIN
.
.
return;
Para invocar una funcin hacemos uso de la siguiente sintaxis:
VARIABLE = NOMBRE_FUNCIN(LISTA_ARGUMENTOS)
Donde LISTA_ARGUMENTOS debe coincidir con el nmero de PARMETROS_ENTRADA, de lo contrario
se produce un error.

17

Mtodos Numricos - Aplicados a la Ingeniera


Ejemplo 10.16
Escriba la siguiente funcin en MATLAB:
(x) = x3 + 2x2 + 10x = 20
Listado FX.m
function y = FX(x)
y = x^3 + 2 * x^2 + 10 * x - 20;
return;
Importante: No olvide guardar el archivo con el nombre FX.M. En MATLAB el nombre la funcin debe
coincidir con el nombre del correspondiente archivo M.
Luego, desde la ventana de comandos vamos a invocar a la funcin recientemente creada:
y = FX(3)
y = 55
Sin embargo, en MATLAB es comn evaluar una funcin mediante la orden feval, tal como se indica a
continuacin:
y = feval(FX, 3)
Lo cual produce el mismo resultado.
Ejemplo 10.17
La ecuacin de Antoine para estimar la presin de vapor est dada por:

Escriba una funcin en MATLAB que acepte como argumentos de entrada los valores de las constantes de
Antoine y la temperatura, y retorne el valor de la presin de vapor.
Listado ANTOINE.m
function P = ANTOINE(A, B, C, T)
P = exp(A - B / (T + C));
return;
Para probar la funcin que acaba de crear estimar la presin de vapor del etilbenceno a 347.2 K
Las constantes de Antoine para el etilbenceno son (donde PSat est en KPa y T en C):
A = 14.0045
B = 3279.47
C = 213.2
PSAT = ANTOINE(14.0045, 3279.47, 213.2, 347.20 - 273.15)
PSAT= 13.2994
Una forma eficiente de construir programas es crear nuevas funciones que se almacenan como
archivos m. Estas funciones nos permiten especificar los datos que se deben introducir y los nos
retornan los resultados que deben mostrarse y pueden ser llamados como subprogramas desde
otros programas.

18

Aplicaciones a problemas con MATLAB

CAP. 10

10.15 PROBLEMAS DESARROLLADOS APLICANDO MATLAB


Listado BISECCION.m
Aproximacin a una solucin de la ecuacin no lneal (x) = 0 mediante el mtodo de la biseccin.
function [Xp, ITER, FLAG] = BISECCION(F, a, b, EPS1, EPS2, MAXIT)
% Sintaxis
%
[Xp, ITER, FLAG] = BISECCION(F, a, b, EPS1, EPS2, MAXIT)
% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- a, b son los extremos del intervalo inicial
%
- EPS1 es el criterio de convergencia
%
- EPS2 es el criterio de exactitud
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el valor de la raz aproximada
%
- ITER es el nmero de iteraciones realizadas
%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
Ya = feval(F, a);
Yb = feval(F, b);
if (Ya * Yb > 0)
disp(Detenido porque F(a)*F(b) > 0);
return;
else
for K = 1 : MAXIT
Xm = (a + b) / 2;
Ym = feval(F, Xm);
if Ym > 0
a = Xm;
else
b = Xm;
end
if (abs(a - b)) < EPS1 | abs(Ym) < EPS2
Xp = Xm;
ITER = K;
FLAG = 1;
return;
end
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
end
Para usar este programa y resolver la ecuacin (x) = lnx x + 2 = 0, dada en el Problema 1.1 (pg. 17), es
necesario almacenar la funcin de iteracin como un archivo M, por ejemplo F1.m, tal como se muestra
a continuacin:
Listado F1.m
function Y = F1(X)
Y = log(X) - X + 2;
return;

19

Mtodos Numricos - Aplicados a la Ingeniera


Luego, para obtener el resultado, en la ventana de comandos de MATLAB ingresar lo siguiente:
[Xp, ITER, FLAG] = BISECCION(@F1, 2, 4, 1e-6, 1e-6, 25)
Xp =
3.14619445800781
ITER =
17
FLAG =
1
Listado PUNTOFIJO.m
Aproximacin a una solucin de la ecuacin x = g(x) mediante el mtodo del punto fijo.
function [Xp, ITER, FLAG] = PUNTOFIJO(G, X0, EPS1, MAXIT)
% Sintaxis
%
[Xp, ITER, FLAG] = PUNTOFIJO(G, X0, EPS1, MAXIT)
% Entrada
%
- G es la funcin, almacenada como un archivo G.m
%
- X0 es el valor inicial
%
- EPS1 es el criterio de convergencia
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el valor de la raz aproximada
%
- ITER es el nmero de iteraciones realizadas
%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
for K = 1 : MAXIT
X = feval(G, X0);
if (abs(X - X0)) < EPS1
Xp = X;
ITER = K;
FLAG = 1;
return;
end
X0 = X;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
La funcin de iteracin g(x) = lnx + 2 , dada en el Problema 1.2 (pg. 24) la ingresamos como un archivo
M, en este caso G1.m, cuya codificacin se muestra a continuacin:
Listado G1.m
function Y = G1(X)
Y = log(X) + 2;
return;

20

Aplicaciones a problemas con MATLAB

CAP. 10

Luego, en la ventana de comandos tipear lo siguiente para obtener el resultado:


[Xp, ITER, FLAG] = PUNTOFIJO(@G1, 3, 1e-6, 25)
Xp =
3.14619305968798
ITER =
12
FLAG =
1
Listado NEWTON.m
Aproximacin a una solucin de la ecuacin no lineal (x) = 0 mediante el mtodo de Newton Raphson
function [Xp, ITER, FLAG] = NEWTON(F, dF, X0, EPS1, EPS2, MAXIT)
% Sintaxis
%
[Xp, ITER, FLAG] = NEWTON(F, dF, X0, EPS1, EPS2, MAXIT)
% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- dF es la derivada de de la funcin, almacenada como un archivo dF.m
%
- X0 es el valor inicial
%
- EPS1 es el criterio de convergencia
%
- EPS2 es el criterio de exactitud
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el valor de la raz aproximada
%
- ITER es el nmero de iteraciones realizadas
%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
for K = 1 : MAXIT
Xp = X0 - feval(F, X0) / feval(dF, X0);
if (abs(Xp - X0) <= EPS1) | (abs(feval(F, Xp)) <= EPS2)
ITER = K;
FLAG = 1;
return;
end
X0 = Xp;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
En este caso vamos a utilizar el programa NEWTON.m para resolver la ecuacin (x) = lnx x + 2 = 0,
Problema 1.5 (pg. 33), la cual ya est almacenada como un archivo F1.m (problema anterior, mtodo de
la biseccin).
Listado F1.m
function Y = F1(X)
Y = log(X) - X + 2;
return;

21

Mtodos Numricos - Aplicados a la Ingeniera


Sin embargo, para el mtodo de Newton Raphson es necesaria la derivada de la funcin:

la cual tambin debe ser guardada como un archivo, por ejemplo dF1.m.
Listado dF1.m
function Y = dF1(X)
Y = 1 / X - 1;
return;
Para obtener el resultado ingresar lo siguiente en la ventana de comandos de MATLAB:
[Xp, ITER, FLAG] = NEWTON(@F1, @dF1, 3, 1e-6, 1e-6, 25)
Xp = 3.14619344079791
ITER = 2
FLAG = 1
El mtodo de Newton Raphson tambin es aplicable para la obtencin de races complejas, con la
diferencia que el valor inicial debe ser un valor complejo. Por ejemplo, para hallar las races complejas de
la ecuacin (x) = x2 + 8, dada en el Problema 1.4 (pg. 31), primero almacenamos la funcin y su derivada
como archivos, por ejemplo F2.m y dF2, respectivamente.
Listado F2.m
function Y = F2(X)
Y = X^2 + 8;
return;
Listado dF2.m
function Y = dF2(X)
Y = 2 * X;
return;
Luego, en la ventana de comandos:
[Xp,
Xp = 0
ITER =
FLAG =

ITER, FLAG] = NEWTON(@F2, @dF2, 2*i, 1e-6, 1e-6, 25)


+ 2.82842712474938i
4
1

Donde la raz compleja es 2.828427i y la raz compleja conjugada ser 2.828427i . Para obtener el valor de
la raz conjugada dar como valor inicial 2i (esto ltimo se deja como ejercicio para el lector).
Listado SECANTE.m
Aproximacin a una solucin de la ecuacin (x) = 0 mediante el mtodo de la secante.
function [Xp, ITER, FLAG] = SECANTE(F, X0, X1, EPS1, EPS2, MAXIT)
% Sintaxis
% [Xp, ITER, FLAG] = SECANTE(F, X0, X1, EPS1, EPS2, MAXIT)
% Entrada
% - F es la funcin, almacenada como un archivo F.m
% - X0, X1 son los valores iniciales

22

Aplicaciones a problemas con MATLAB

CAP. 10

% - EPS1 es el criterio de convergencia


% - EPS2 es el criterio de exactitud
% - MAXIT es el nmero mximo de iteraciones
% Salida
% - Xp es el valor de la raz aproximada
% - ITER es el nmero de iteraciones realizadas
% - FLAG es una variable lgica, es 1 si hubo convergencia, caso
% contrario es 0
for K = 1 : MAXIT
Xp = X0 - (X1 - X0) * feval(F, X0) / (feval(F, X1) - feval(F, X0));
if (abs(Xp - X1) <= EPS1) | (abs(feval(F, Xp)) <= EPS2)
ITER = K;
FLAG = 1;
return;
end
X0 = X1;
X1 = Xp;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
En este caso vamos a utilizar el programa SECANTE.m para resolver la ecuacin (x) = lnx x + 2 = 0, dada
en el Problema 1.6 (pg. 35), la cual ya est almacenada como un archivo F1.m (problema anterior, mtodo
de la biseccin). Por tanto, para obtener el resultado ingresar lo siguiente en la ventana de comandos de
MATLAB:
[Xp, ITER, FLAG] = SECANTE(@F1, 3, 3.15, 1e-6, 1e-6, 25)
Xp = 3.14619320852215
ITER = 2
FLAG = 1
Listado MULLER.m
Aproximacin a una solucin de la ecuacin (x) = 0 mediante el mtodo de la Mller.
function [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT)
% Sintaxis
% [Xp, ITER, FLAG] = MULLER(F, X0, X1, X2, EPS1, EPS2, MAXIT)
% Entrada
% - F es la funcin, almacenada como un archivo F.m
% - X0, X1, X2 son los valores iniciales
% - EPS1 es el criterio de convergencia
% - EPS2 es el criterio de exactitud
% - MAXIT es el nmero mximo de iteraciones
% Salida
% - Xp es el valor de la raz aproximada
% - ITER es el nmero de iteraciones realizadas
% - FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
for K = 1 : MAXIT
F10 = (feval(F, X1) - feval(F, X0)) / (X1 - X0);
F21 = (feval(F, X2) - feval(F, X1)) / (X2 - X1);

23

Mtodos Numricos - Aplicados a la Ingeniera


F210 = (F21 - F10) / (X2 - X0);
A2 = F210;
A1 = F21 - (X2 + X1) * A2;
A0 = feval(F, X2) - X2 * (F21 - X1 * A2);
D1 = -A1 + sqrt(A1^2 - 4 * A0 * A2);
D2 = -A1 - sqrt(A1^2 - 4 * A0 * A2);
if abs(D1) > abs(D2)
X3 = 2 * A0 / D1;
else
X3 = 2 * A0 / D2;
end
if (abs(X3 - X0) <= EPS1) | (abs(feval(F, X3)) <= EPS2)
Xp = X3;
ITER = K;
FLAG = 1;
return;
end
X0 = X1;
X1 = X2;
X2 = X3;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
Para resolver la ecuacin (x) = lnx x + 2 = 0, Problema 1.9 (pg. 45), mediante el programa MULLER.m,
ingresar lo siguiente en la ventana de comandos de MATLAB:
[Xp, ITER, FLAG] = MULLER(@F1, 2, 3, 4, 1e-6, 1e-6, 25)
Xp = 3.14619322048079
ITER = 3
FLAG = 1
Grficas
Como las grficas son parte natural de MATLAB se puede aprovechar esa caracterstica para graficar
previamente la funcin de la cual deseamos encontrar sus races, Sabiendo el comportamiento
de la funcin, el nmero de races y su valor aproximado, el resto puede hacerse fcilmente con una
computadora, o incluso con una calculadora de bolsillo.
Por ejemplo, para analizar grficamente la siguiente funcin (x) = lnx x + 2 = 0, escribimos el siguiente
programa MATLAB:
Listado GRAFICA_F1.m
close all;
clear;
X = [0: 0.1: 5];
Y = feval(@F1, X);
plot(X, Y, k, X, 0, k);
xlabel(X);
ylabel(Y);

24

Aplicaciones a problemas con MATLAB

CAP. 10

Luego, para ejecutar el programa en la ventana de comandos de MATLAB ingresar la siguiente orden:
GRAFICA_F1

Como puede apreciar en la grfica obtenida se puede ver claramente que la funcin presenta dos races,
una de las cuales se encuentra aproximadamente entre 0.1 y 0.2, y la otra que se encuentra entre 3.0 y 3.2.
Listado APROXILIN.m
Aproximacin polinomial simple. Construccin del polinomio interpolador de grado N que pasa
por los (N + 1) puntos
function [YINT, C] = APROXLIN(X, Y, XINT)
% Sintaxis
% [YINT, C] = APROXLIN(X, Y, XINT)
% Entrada
% - X es un vector fila que contiene la lista de abscisas
% - Y es un vector fila que contiene la lista de ordenadas
% - XINT es el valor para el que se desea la interpolacin
% Salida
% - YINT es el valor de la funcin en XINT
% - C es el vector de coeficientes (en forma ascendente, a0, a1, ..., aN)
% del polinomio de grado N que pasa por los (N + 1) puntos
N = length(X) - 1;
X = X;
Y = Y;
for I = 1 : N + 1
B(I, 1) = 1;
for J = 2 : N + 1
B(I, J) = B(I, J - 1) * X(I);
end
end
C = inv(B) * Y;
YINT = 0;
for I = N + 1 : -1 : 1
YINT = YINT * XINT + C(I);
end

25

Mtodos Numricos - Aplicados a la Ingeniera


Por ejemplo para la funcin tabular dada en el Problema 2.7 (pg. 101):
x

y = f (x)

15

Para hallar el valor de la funcin en x = 3, en la ventana de comandos de MATLAB tipear:


X = [0, 1, 2, 5];
Y = [5, 7, 9, 15];
[YINT, C] = APROXLIN(X, Y, 3)
YINT = 11
C = 5
2
-7.7715611723761e-016
-5.55111512312578e-017
Listado LAGRANGE1.m
Interpolacin con polinomios de Lagrange de grado N.
function YINT = LAGRANGE1(X, Y, XINT)
% Sintaxis
%
YINT = LAGRANGE1(X, Y, XINT)
% Entrada
%
- X es un vector que contiene la lista de abscisas
%
- Y es un vector que contiene la lista de ordenadas
%
- XINT es el valor para el que se desea la interpolacin
% Salida
%
- YINT es el valor de la funcin en XINT
N = length(X) - 1;
YINT = 0;
for I = 1 : N + 1
L = 1;
for J = 1 : N + 1
if I ~= J
L = L * (XINT - X(J)) / (X(I) - X(J));
end
end
YINT = YINT + L * Y(I);
end
Para el mismo caso anterior (Problema 2.7, pg. 107), tipear en la ventana de comandos de MATLAB lo
siguiente:
X = [0, 1, 2, 5];
Y = [5, 7, 9, 15];
YINT = LAGRANGE1(X, Y, 3)
YINT = 11

26

Aplicaciones a problemas con MATLAB

CAP. 10

Listado LAGRANGE2.m
Construccin del polinomio interpolador de Lagrange de grado N que pasa por los (N + 1) puntos
function [YINT, C, L] = LAGRANGE2(X, Y, XINT)
% Sintaxis
%
[YINT, C, L] = LAGRANGE2(X, Y, XINT)
% Entrada
%
- X es un vector que contiene la lista de abscisas
% - Y es un vector que contiene la lista de ordenadas
%
- XINT es el valor para el que se desea la interpolacin
% Salida
%
- YINT es el valor de la funcin en XINT
%
- C es la matriz que contiene los coeficientes del polinomio
%
interpolador de Lagrange, en forma ascendente (a0, a1, a2, ..., aN)
%
- L es la matriz que contiene los coeficientes de los polinomios
%
coeficientes de Lagrange
N = length(X) - 1;
L = zeros(N + 1, N + 1);
for I = 1 : N + 1
V = 1;
for J = 1 : N + 1
if I ~= J
V = conv(V, poly(X(J))) / (X(I) - X(J));
end
end
L(I, :) = V;
end
C = (Y * L);
C = flipud(C);
YINT = 0;
for I = N + 1 : -1 : 1
YINT = YINT * XINT + C(I);
end
Para el mismo caso anterior (Problema 2.7, pg. 107), tipear en la ventana de comandos de MATLAB lo
siguiente:
[YINT, C, L] = LAGRANGE2(X, Y, 3)
YINT = 11
C =
5
2
-1.11022302462516e-016
0
L =
-0.1000
0.8000
-1.7000
0.2500
-1.7500
2.5000
-0.1667
1.0000
-0.8333
0.0167
-0.0500
0.0333

1.0000
0
0
0

27

Mtodos Numricos - Aplicados a la Ingeniera


Listado NEVILLE.m
Interpolacin mediante el mtodo de Neville
function [YINT, Q] = NEVILLE(X, Y, XINT)
% Sintaxis
%
[YINT, Q] = NEVILLE(X, Y, XINT)
% Entrada
%
- X es un vector fila que contiene la lista de abscisas
%
- Y es un vector fila que contiene la lista de ordenadas
%
- XINT es el valor para el que se desea la interpolacin
% Salida
%
- YINT es el valor de la funcin en XINT
%
- Q es el esquema de Neville
N = length(X);
Q = Y;
for J = 2 : N
for I = J : N
Q(I, J) = ((XINT - X(I - J + 1)) * Q(I, J - 1) - (XINT - X(I)) ...
* Q(I - 1, J - 1)) / (X(I) - X(I - J + 1));
end
end
YINT = Q(end);
Para la funcin tabular mostrada en el Problema 2.9 (pgina 109), vamos a hallar el valor de y = (x) cuando
x = 1.5, veamos:
x

1.0

1.3

1.6

1.9

2.2

y = f (x)

0.7651977

0.6200860

0.4554022

0.2818186

0.1103623

Para ello en la ventana de comandos de MATLAB ingresar la siguiente orden:


X = [1.0, 1.3, 1.6, 1.9, 2.2];
Y = [0.7651977, 0.6200860, 0.4554022, 0.2818186, 0.1103623];
[YINT, Q] = NEVILLE(X, Y, 1.5)
YINT = 0.511819994238683
Q =
0.7652
0
0
0
0
0.6201 0.5233
0
0
0
0.4554 0.5103 0.5125
0
0
0.2818 0.5133 0.5113 0.5118
0
0.1104 0.5104 0.5137 0.5118 0.5118
Listado MINCUAD.m
Interpolacin por mnimos cuadrados.
function [YC] = MINCUAD(X, Y, N)
% Sintaxis
%
YC = MINCUAD(X, Y, N)
% Entrada
%
- X es un vector fila que contiene la lista de abscisas
%
- Y es un vector fila que contiene la lista de ordenadas
%
- N es el orden del polinomio

28

Aplicaciones a problemas con MATLAB

CAP. 10

% Salida
%
- YC es un vector que contiene los coeficientes del polinomio en forma
%
ascendente (a0, a1, a2, ..., aN), es decir de menor a mayor exponente
%
de la variable
M =
X =
Y =
for

length(X);
X;
Y;
I = 1 : M
B(I, 1) = 1;
for J = 2 : N + 1
B(I, J) = B(I, J - 1) * X(I);
end

end
YC = inv(B * B) * (B * Y);
Por ejemplo para la funcin dada en el Problema 2.11 (pgina 135), se tiene:
x

y = f (x)

Para ajustar la funcin a una recta escriba las siguientes instrucciones en la ventana de comandos de
MATLAB:
X = [-2, -1, 0, 1, 2];
Y = [0, 0, 1, 1, 3];
YC = MINCUAD(X, Y, 1)
YC = 1
0.7
Con los mismos datos del problema anterior, para ajustarlos a un polinomio de segundo grado, tipear lo
siguiente en la ventana de comandos:
YC = MINCUAD(X, Y, 2)
YC =
0.571428571428571
0.700000000000000
0.214285714285714
Para ajustar los datos anteriores a un polinomio de tercer grado hacer:
YC = MINCUAD(X, Y, 3)
YC =
0.5714285714285710
0.4166666666666670
0.2142857142857140
0.0833333333333335

29

Mtodos Numricos - Aplicados a la Ingeniera


Listado MINCUAD2.m
Ajuste por mnimos cuadrados para una ecuacin de la forma
function [YC] = MINCUAD2(X1, X2, Y)
% Sintaxis
% YC = MINCUAD2(X1, X2, Y)
% Entrada
%
- X1 es un vector fila que contiene los valores de la variable
%
independiente X1
%
- X2 es un vector fila que contiene los valores de la variable
%
independiente X2
%
- Y es un vector fila que contiene los valores de la variable
%
dependiente Y
% Salida
%
- YC es un vector que contiene los coeficientes de la curva ajustada
%
en el orden: a0, a1, a2
N = length(X1);
X1 = X1;
X2 = X2;
Y = Y;
X = [ones(N, 1), X1, X2];
YC = inv(X * X) * (X * Y);
Para utilizar el programa anterior con los datos de la tabla mostrada en el Problema 2.16 (pgina 140):
y

x1

x2

27.8

2.0

18.0

28.0

3.5

16.5

28.8

4.5

10.5

29.1

2.5

2.5

30.0

8.5

9.0

31.0

10.5

4.5

32.0

13.5

1.5

En la ventana de comandos de MATLAB ingresamos lo siguiente:


X1
X2
Y
YC
YC =

=
=
=
=

[2.0, 3.5, 4.5, 2.5, 8.5, 10.5, 13.5]


[18.0, 16.5, 10.5, 2.5, 9.0, 4.5, 1.5]
[27.5, 28.0, 28.8, 29.1, 30.0, 31.0, 32.0]
MINCUAD2(X1, X2, Y)
28.6917135088340000
0.25693926572616200
-0.0960681843122408

30

Aplicaciones a problemas con MATLAB

CAP. 10

Grficas
Para graficar los siguientes datos del problema 2.11 (pg. 135) y las curvas ajustadas mediante mnimos
cuadrados:
x

y = f (x)

Lo podemos realizar mediante el siguiente programa:


Listado GRAFICA_MC.m
close all;
clear;
X = [-2, -1, 0, 1, 2];
Y = [0, 0, 1, 1, 3];
YC1= MINCUAD(X, Y, 1);
YC2= MINCUAD(X, Y, 2);
YC3= MINCUAD(X, Y, 3);
YC1 = YC1(1) + YC1(2) .* X;
YC2 = YC2(1) + YC2(2) .* X + YC2(3) .* X.^2;
YC3 = YC3(1) + YC3(2) .* X + YC3(3) .* X.^2 + YC3(4) .* X.^3;
figure(1);
plot(X, Y, *, X, YC1)
xlabel(X); ylabel(Y);
title(Polinomio de 1er. grado);
figure(2);
plot(X, Y, *, X, YC2);
xlabel(X); ylabel(Y);
title(Polinomio de 2do. grado);
figure(3);
plot(X, Y, *, X, YC3)
xlabel(X); ylabel(Y);
title(Polinomio de 3er. grado);

31

Mtodos Numricos - Aplicados a la Ingeniera

Listado DIFLAGRANGE.m
Diferenciacin numrica mediante el polinomio interpolador de Lagrange
function DY = DIFLAGRANGE(X, Y, XD)
% Sintaxis
% DY = DIFLAGRANGE(X, Y, XD)
% Entrada
%
- X es un vector que contiene la lista de abscisas
%
- Y es un vector que contiene la lista de ordenadas
%
- XD es punto en que se desea evaluar la derivada
% Salida
%
- DY es la aproximacin a la primera derivada en XD
N = length(X);
DY = 0;
for I = 1 : N

32

Aplicaciones a problemas con MATLAB

CAP. 10

P = 1;
for J = 1 : N
if I ~= J
P = P * (X(I) - X(J));
end
end
S = 0;
for K = 1 : N
if I ~= K
P1 = 1;
for J = 1 : N
if (J ~= I) & (J ~= K)
P1 = P1 * (XD - X(J));
end
end
S = S + P1;
end
end
DY = DY + Y(I) / P * S;
end
Para evaluar la derivada de la funcin dada en el Problema 3.1 (pg. 169), cuando x = 0:
x

y = f (x)

25

55

105

Ingresar lo siguiente en la ventana de comandos de MATLAB:


X = [0, 1, 2, 3, 4, 5]
Y = [-5, 1, 9, 25, 55, 105]
DY = DIFLAGRANGE(X, Y, 0)
DY = 7
Para evaluar la derivada de la misma funcin para x = 0.5 y x = 3.5 (Problema 3.2, pg. 170), hacemos lo
siguiente:
DY
DY =
DY
DY =

= DIFLAGRANGE(X, Y, 0.5)
5.75
= DIFLAGRANGE(X, Y, 3.5)
29.75

Para evaluar la primera derivada de la funcin tabular dada en la pgina 180,


x

y = f (x)

13

10

11

105

Tipear lo siguiente en la ventana de comandos de MATLAB:


X = [1, 2, 3, 4, 5]
Y = [-13, -10, -5, 2, 11]
DY = DIFLAGRANGE(X, Y, 2.5)
DY = 5

33

Mtodos Numricos - Aplicados a la Ingeniera


Listado DIFLIM.m
Diferenciacin numrica mediante lmites
function [L, N] = DIFLIM(F, X, EPS)
% Sintaxis
%
[L, N] = DIFLIM(F, X, EPS)
% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- X es el punto en el que se deriva
%
- EPS es la tolerancia para el error
% Salida
%
- L = [H, D, E]
%
H es el vector de los incrementos
%
D es el vector de las aproximaciones a la derivada
%
E es el vector de las cotas del error
%
- N es la coordenada de la mejor aproximacin
EPS = 2^(-52);
MAX = 15;
h = 1;
H(1) = h;
D(1) = (feval(F, X + h) - feval(F, X - h)) / (2 * h);
E(1) = 0;
R(1) = 0;
for N = 1 : 2
h = h / 10;
H(N + 1) = h;
D(N + 1) = (feval(F, X + h) - feval(F, X - h)) / (2 * h);
E(N + 1) = abs(D(N + 1) - D(N));
R(N + 1) = 2 * E(N + 1) * (abs(D(N + 1)) + abs(D(N)) + EPS);
end
N = 2;
while ((E(N) > E(N + 1)) & (R(N) > TOL)) & N < MAX
h = h / 10;
H(N + 2) = h;
D(N + 2) = (feval(F, X + h) - feval(F, X - h)) / (2 * h);
E(N + 2) = abs(D(N + 2) - D(N + 1));
R(N + 2) = 2 * E(N + 2) * (abs(D(N + 2)) + abs(D(N + 1)) + EPS);
N = N + 1;
end
N = length(D) - 1;
H = H;
D = D;
E = E;
L = [H, D, E];
Por ejemplo para obtener la derivada de (x) = cos(x) en x = 0.8, primero almacenamos la funcin como
un archivo, por ejemplo, F6.m, tal como se indica a continuacin:
Listado F6.m
function Y = F6(X)
Y = cos(X);
return;

34

Aplicaciones a problemas con MATLAB

CAP. 10

Luego en la ventana de comandos de MATLAB ingresar lo siguiente:


[L, N] = DIFLIM(@F6, 0.8, 1e-9)
L =
1.0000 -0.603634336267164 0
0.1000 -0.716161095069120 0.1125267588019560000
0.0100 -0.717344135024456 0.0011830399553358600
0.0010 -0.717355971340150 1.18363156942358e-005
0.0001 -0.717356089703913 1.18363763235152e-007
1e-005 -0.717356090884635 1.18072207566655e-009
1e-006 -0.717356090917942 3.33066907387547e-011
1e-007 -0.717356090640386 2.77555756156289e-010
N = 7
Listado TRAPECIO.m
Regla compuesta del trapecio para aproximar la integral de una funcin dada en forma tabular, en
el intervalo
function S = TRAPECIO(X, FX)
% Sintaxis
%
I = TRAPECIO(X, FX)
% Entrada
%
- X es un vector que contiene la lista de variables independientes
%
- FX es un vector que contiene la lista de variables dependientes o
%
integrando
%
- a y b son los extremos inferior y superior del intervalo de
%
integracin
% Salida
%
- S es la aproximacin a la integral con la regla compuesta del
%
trapecio
N = length(X);
a = X(1);
b = X(N);
H = (b - a) / (N - 1);
S = 0;
for K = 2 : (N - 1)
S = S + FX(K);
end
S = (H / 2) * (FX(1) + 2 * S + FX(N));
Para integrar la funcin dada en forma tabular del Problema 4.1 (pgina 202):
x

y = f(x)

25

55

105

181

Digitar lo siguiente en la ventana de comandos de MATLAB:

X
Y
I
=

= [0, 1, 2, 3, 4, 5, 6]
= [-5, 1, 9, 25, 55, 105, 181]
= TRAPECIO(X, Y)
283

35

Mtodos Numricos - Aplicados a la Ingeniera


Listado SIMPSON13.m
Regla compuesta de Simpson 1/3 para aproximar la integral de una funcin dada en forma tabular,
en el intervalo [a, b].
function S = SIMPSON13(X, FX)
% Sintaxis
%
I = SIMPSON13(X, FX)
% Entrada
%
- X es un vector que contiene la lista de variables independientes
%
- FX es un vector que contiene la lista de variables dependientes o
%
integrando
%
- a y b son los extremos inferior y superior del intervalo de
%
integracin
% Salida
%
- S es la aproximacin a la integral con la regla compuesta del
%
Simpson 1/3
N = length(X);
a = X(1);
b = X(N);
H = (b - a) / (N - 1);
S1 = 0;
S2 = 0;
for K = 2 : 2 : (N - 1)
S1 = S1 + FX(K);
end
for K = 3 : 2 : (N - 2)
S2 = S2 + FX(K);
end
S = (H / 3) * (FX(1) + 4 * S1 + 2 * S2 + FX(N));
Para integrar la misma funcin del ejemplo anterior (Problema 4.1, pgina 202), ingresar lo siguiente en
la ventana de comandos de MATLAB:

X
Y
I
=

= [0, 1, 2, 3, 4, 5, 6]
= [-5, 1, 9, 25, 55, 105, 181]
= SIMPSON13(X, Y)
276

Listado SIMPSON38.m
Regla compuesta de Simpson 3/8 para aproximar la integral de una funcin dada en forma tabular,
en el intervalo [a, b].
function S = SIMPSON38(X, FX)
% Sintaxis
%
I = SIMPSON38(X, FX)
% Entrada
%
- X es un vector que contiene la lista de variables independientes
%
- FX es un vector que contiene la lista de variables dependientes o
%
integrando
%
- a y b son los extremos inferior y superior del intervalo de
%
integracin
% Salida

36

Aplicaciones a problemas con MATLAB

CAP. 10

%
- S es la aproximacin a la integral con la regla compuesta del
%
Simpson 3/8
N = length(X);
a = X(1);
b = X(N);
H = (b - a) / (N - 1);
S1 = 0;
S2 = 0;
for K = 2 : (N - 1)
if mod(K - 1, 3) == 0
S1 = S1 + FX(K);
else
S2 = S2 + FX(K);
end
end
S = (3 * H / 8) * (FX(1) + 2 * S1 + 3 * S2 + FX(N));
Para integrar la misma funcin del ejemplo anterior , ingresar lo siguiente en la ventana de comandos de
MATLAB:

X
Y
I
=

= [0, 1, 2, 3, 4, 5, 6]
= [-5, 1, 9, 25, 55, 105, 181]
= SIMPSON38(X, Y)
276

Para integrar la funcin tabular dada en el Problema 4.2 (pgina 203), desde tal como se muestra:
x

y = f(x)

25

55

105

Como el nmero de subintervalos es impar (en este caso 5) aplicamos una combinacin de las frmulas
de Simpson 1/3 y Simpson 3/8, veamos:

X1 = [0, 1, 2, 3]
Y1 = [-5, 1, 9, 25]
X2 = [3, 4, 5]
Y2 = [25, 55, 105]
I = SIMPSON38(X1, Y1) + SIMPSON13(X2, Y2)
= 135.4167

Listado ROMBERG.m
Aproximacin a la integral de una funcin y = (x) dada en forma analtica mediante el mtodo de
integracin de Romberg, en el intervalo [a, b].
function [R, Q, EPS, H] = ROMBERG(F, a, b, K, TOL)
% Sintaxis
%
[R, Q, EPS, H] = ROMBERG(F, a, b, K, TOL)
% Entrada
%
- F es la funcin integrando, almacenada como un archivo F.m
%
- a y b son los extremos inferior y superior del intervalo de
%
integracin

37

Mtodos Numricos - Aplicados a la Ingeniera


%
- K es el nmero mximo de filas de la tabla
%
- TOL es la tolerancia
% Salida
%
- R es el esquema de Romberg
%
- Q es la aproximacin a la integral
%
- EPS es una estimacin del error
%
- H es el menor de los incrementos utilizados
N = 1;
H = b - a;
EPS = 1;
J = 0;
R = zeros(4, 4);
R(1, 1) = H * (feval(F, a) + feval(F, b)) / 2;
while ((EPS > TOL) & (J < K)) | (J < 4)
J = J + 1;
H = H / 2;
S = 0;
for P = 1 : N
X = a + H * (2 * P - 1);
S = S + feval(F, X);
end
R(J + 1, 1) = R(J, 1) / 2 + H * S;
N = 2 * N;
for M = 1 : J
R(J + 1, M + 1) = R(J + 1, M) + (R(J + 1, M) - R(J, M)) / (4^M - 1);
end
EPS = abs(R(J, J) - R(J + 1, M + 1));
end
Q = R(J + 1, J + 1);
Luego, para obtener el valor de la siguiente integral

, dada en el Problema 4.7

(pg. 217), primero tiene que almacenar la funcin como un archivo, por ejemplo F3.m, tal como se
muestra a continuacin:
Listado F3.m
function Y = F3(X)
Y = 4 * X^3 - 3 * X^2 + 2 * X + 1;
return;
Luego, en la ventana de comandos de MATLAB ingresar las siguientes instrucciones:
[R, I, EPS, H]
R =
2.500000000
2.125000000
2.031250000
2.007812500
2.001953125
I = 2
EPS = 0
H = 0.0625

38

= ROMBERG(@F3, 0, 1, 4, 1e-2)
0
0
0
0
2.0000 0
0
0
2.0000 2.0000 0
0
2.0000 2.0000 2.0000 0
2.0000 2.0000 2.0000 2.0000

Aplicaciones a problemas con MATLAB

CAP. 10

Listado GAUSS_LEGENDRE.m
Aproximacin a la integral de una funcin dada en forma analtica mediante la frmula de la
cuadratura de Gauss-Legendre, en el intervalo [a, b].
function Q = GAUSS_LEGENDRE(F, a, b, N)
% Sintaxis
%
I = GAUSS_LEGENDRE(F, a, b, N)
% Entrada
%
- F es la funcin integrando, almacenada como un archivo F.m
%
- a y b son los extremos inferior y superior del intervalo de
%
integracin
%
- N es el nmero de puntos a utilizar (2, 3, 4, 5 6)
% Salida
%
- Q es la aproximacin a la integral
NP(1) = 2; NP(2) = 3; NP(3) = 4; NP(4) = 5; NP(5) = 6;
IAUX(1) = 1;
IAUX(2) = 2;
IAUX(3) = 4;
IAUX(4) = 6;
IAUX(5) = 9;
IAUX(6) = 12;
Z(1) = 0.577350269; Z(2) = 0.0;
Z(3) = 0.774596669;
Z(4) = 0.339981044; Z(5) = 0.861136312;
Z(6) = 0.0;
Z(7) = 0.53846931; Z(8) = 0.906179846; Z(9) = 0.238619186;
Z(10) = 0.661209387; Z(11) = 0.932469514;
W(1) = 1.0;
W(2) = 0.888888889;
W(3) = 0.555555556;
W(4) = 0.652145155; W(5) = 0.347854845; W(6) = 0.568888889;
W(7) = 0.478628671; W(8) = 0.236926885; W(9) = 0.467913935;
W(10) = 0.360761573; W(11) = 0.171324493;
I= 0;
for J =1 : 5
if N == NP(J)
I = J;
end
if I == 0
Q = 0;
else
J1 = IAUX(I);
J2 = IAUX(I + 1) - 1;
C = (b - a) / 2;
D = (b + a) / 2;
S = 0;
for J=J1 : J2
if Z(J) == 0
S = S + W(J) * F(D);
end
if Z(J) ~= 0
S = S + W(J) * (F(Z(J) * C + D) + F(-Z(J) * C + D));
end
end
Q = C * S;
end
end

39

Mtodos Numricos - Aplicados a la Ingeniera

Luego, para obtener la integral de la funcin


, dada en el Problema 4.8 (pg. 222),
primero se debe almacenar la funcin como un archivo, por ejemplo F4.m, veamos:
Listado F4.m
function Y = F4(X)
Y = X^3 + X^2 + X + 1;
return;
Luego, en la ventana de comandos de MATLAB ingresar las siguientes instrucciones, para calcular la
integral mediante la frmula de Gauss-Legendre de 2 puntos:
I = GAUSS_LEGENDRE(@F4, -1, 1, 2)
I = 2.66666666622874
Para la misma funcin, la integral evaluada desde a = 1 hasta b = 3 (ver pg. 224), el resultado se puede
obtener mediante las siguientes instrucciones en la ventana de comandos:
I = GAUSS_LEGENDRE(@F4, 1, 3, 2)
I = 34.66666666360121
Para calcular la integral de la funcin

(Problema 4.9, pg. 223) mediante la frmula de Gauss-

Legendre de 5 puntos, primero almacenamos la funcin como un archivo, para este caso F5.m, tal como
se indica a continuacin:
Listado F5.m
function Y = F5(X)
Y = 1 / X;
return;
Luego, en la ventana de comandos de MATLAB digitar lo siguiente:
I = GAUSS_LEGENDRE(@F5, 1, 2, 5)
I = 0.69314715819178
Listado THOMAS.m
Mtodo de Thomas para la resolucin de un sistema tridiagonal AX = B
function [X] = THOMAS(A, B)
% Sintaxis
%
X = THOMAS(A, B)
% Entrada
%
- A es la matriz de coeficientes del sistema tridiagonal
%
- B es el vector de trminos independientes (vector columna)
% Salida
%
- X es el vector solucin del sistema tridiagonal AX = B
N = length(B);
b = diag(A, 0);
a = [0; diag(A, -1)];
c = [diag(A, 1); 0];
d = B;
for I = 1 : (N - 1)
if b(I) == 0

40

Aplicaciones a problemas con MATLAB

CAP. 10

disp(El sistema no tiene solucin...);


return;
end
b(I + 1) = b(I + 1) - a(I + 1) * c(I) / b(I);
d(I + 1) = d(I + 1) - a(I + 1) * d(I) / b(I);
end
if b(N) == 0
disp(El sistema no tiene solucin...);
return;
end
X(N) = d(N) / b(N);
for I = (N - 1) : -1 : 1
X(I) = (d(I) - c(I) * X(I + 1)) / b(I);
end
X = X;
Para resolver el sistema dado en el Problema 5.2 (pgina 265), ingresamos las siguientes instrucciones en
la ventana de comandos de MATLAB:
A = [ 4, 1, 0, 0,
-8, -1, 1, 0,
0, 3, -2, 4,
0, 0, 1, -1,
0, 0, 0, 2,
B = [-1; 13; -3; 2.1;
[X] = THOMAS(A, B)
X =
0.9250
-4.7000
15.7000
10.6250
-2.9750

0;
0;
0;
1;
6]
3.4]

Nota: En MATLAB este sistema pudo resolverse directamente mediante la siguiente orden en la ventana
de comandos:
X = inv(A) * B
X =
0.9250
-4.7000
15.7000
10.6250
-2.9750
El mismo resultado se obtiene si hacemos:
X = A^(-1) * B
O tambin:
X = A \ B
Queda como tarea para el lector comprobar los resultados de estas dos ltimas rdenes.

41

Mtodos Numricos - Aplicados a la Ingeniera


Listado TRIDIAG3.m
Resolucin de un sistema tridiagonal por bloques en tres etapas, de la forma:

function [X1, X2, X3] = TRIDIAG3(A1, A2, A3, B1, B2, B3, C1, C2, C3, D1, D2, D3)
P1 = inv(B1) * C1;
Q1 = inv(B1) * D1;
P2 = inv(B2 - A2 * P1) * C2;
Q2 = inv(B2 - A2 * P1) * (D2 - A2 * Q1);
P3 = inv(B3 - A3 * P2) * C3;
Q3 = inv(B3 - A3 * P2) * (D3 - A3 * Q2);
X3 = Q3;
X2 = Q2 - P2 * X3;
X1 = Q1 - P1 * X2;
Luego, para resolver el sistema tridiagonal por bloques planteado en el Problema 5.3 (pgina 269),
primero ingresamos las matrices bloques:
b1 = [1, 2, 1; b2
2, 1, 1;
1, 2, 2]
a1 = zeros(3) a2
0, 0, 1;
0, 0, 2]
c1 = [2, 2, 1; c2
2, 1, 0;
1, 2, 0]
d1 = [9; 7; 8] d2

= [1,
2,
2,
= [0,

2,
2,
1,
1,

1;
b3
0;
1]
3;
a3
0, 0, 2;
0, 0, 1]
= [1, 2, 1;
c3
1, 2, 0;
1, 1, 0]
= [12; 8; 8] d3

= [2,
1,
3,
= [0,

1,
1,
1,
1,

1;
1;
2]
2;

= zeros(3)

= [7; 5; 6]

Luego, llamamos al programa que acabamos de crear:


[X1, X2, X3] = TRIDIAG3(a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3)
X1 = 1.0000 X2 = 1.0000 X3 = 1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
Nota: Otra forma de resolver el problema anterior es aprovechando la capacidad de MATLAB para el
clculo matricial, veamos:
Primero construimos la matriz de coeficientes A y la matriz de trminos independientes B, respectivamente:
A = [b1,
A =
1
2
1
0
0
0
0
0
0

42

c1, zeros(3); a2, b2, c2; zeros(3), a3, b3]


2
1
2
1
0
0
0
0
0

1
1
2
3
1
2
0
0
0

2
2
1
1
2
2
0
0
0

2
1
2
2
2
1
1
0
0

1
0
0
1
0
1
2
2
1

0
0
0
1
1
1
2
1
2

0
0
0
2
2
1
1
1
1

0
0
0
1
0
0
1
1
2

Aplicaciones a problemas con MATLAB

CAP. 10

B = [d1; d2; d3]


B = 9
7
8
12
8
8
7
5
6
Luego, el sistema se resuelve mediante la siguiente orden:
X = inv(A) * B
X =
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
Listado PUNTOFIJO_MV.m
Resolucin de un sistema de ecuaciones no lineales F(X) = 0 mediante el mtodo del punto fijo
multivariable con desplazamientos simultneos
function [Xp, ITER, FLAG] = PUNTOFIJO_MV(G, X0, EPS, MAXIT)
% Sintaxis
%
PUNTOFIJO_MV(G, X0, EPS, MAXIT)
% Entrada
%
- G es el sistema de ecuaciones no lineales, almacenado como G.m
%
- X0 es el vector de valores iniciales
%
- EPS es el criterio de convergencia
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el vector solucin
%
- ITER es el nmero de iteraciones realizadas
%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
for K = 1 : MAXIT
X = feval(G, X0);
if norm(X - X0) <= EPS
Xp = real(X);
ITER = K;
FLAG = 1;
return;
end
X0 = X;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;

43

Mtodos Numricos - Aplicados a la Ingeniera


Luego, para resolver el sistema de ecuaciones no lineales dado en el Problema 6.1 (pgina 287),

Primero tenemos que almacenar el sistema como un archivo, por ejemplo FG_2EC.m, veamos:
Listado FG_2EC.m
function G = FG_2EC(X)
G(1) = (4 - sqrt(X(2)))^3 / 8;
G(2) = sqrt(17 - X(1)^2);
return;
Ahora, en la ventana de comandos de MATLAB digitar lo siguiente:
[Xp, ITER, FLAG] = PUNTOFIJO_MV(@FG_2EC, [0.5, 0.5], 1e-6, 25)
Xp =
0.999999719761863
4.0000000005318
ITER = 17
FLAG = 1
Listado NEWTON_MV.m
Resolucin de un sistema de ecuaciones no lineales mediante el mtodo de Newton Raphson
estndar
function [Xp, ITER, FLAG] = NEWTON_MV(F, JF, X, EPS1, EPS2, MAXIT)
% Sintaxis
%
[Xp, ITER, FLAG] = NEWTON_MV(F, JF, X, EPS1, EPS2, MAXIT)
% Entrada
%
- F es el sistema de ecuaciones no lineales, almacenado como F.m
%
- JF es la matriz jacobiana, almacenada como JF.m
%
- X es el vector de valores iniciales
%
- EPS1 es el criterio de convergencia
%
- EPS2 es el criterio de exactitud
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el vector solucin
%
- ITER es el nmero de iteraciones realizadas
%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
Y = feval(F, X);
for K = 1 : MAXIT
J = feval(JF, X);
Q = X + (inv(J) * (-Y));
Y = feval(F, Q);
if (norm(Q - X) < EPS1) | (abs(Y) < EPS2)
ITER = K;
FLAG = 1;
Xp = real(Q);
return;
end
X = Q;
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;

44

Aplicaciones a problemas con MATLAB

CAP. 10

Luego, para resolver el sistema dado en el Problema 6.2 (pgina 293),

Primero almacenamos el sistema como un archivo F_2EC.m, tal como se muestra a continuacin:
Listado F1_2EC.m
function Y = F1_2EC(X)
Y(1) = 1.6*X(1)^2 + 3.6*X(1)*X(2) - 7.8*X(1) - 2.6*X(2) + 5.2;
Y(2) = 0.9*X(2)^2 + 3.1*X(1)^2 - 6.2*X(1) + 6.2*X(2);
return;
Luego, la matriz jacobiana est dada por:

La cual almacenamos como un archivo, por ejemplo JF_2EC.m, tal como se indica:
Listado JF1_2EC.m
function
W(1,
W(1,
W(2,
W(2,
return;

W = JF1_2EC(X)
1) = 3.2 * X(1)
2) = 6.2 * X(1)
1) = 3.2 * X(1)
2) = 1.8 * X(2)

+
+

3.6 * X(2) - 7.8;


6.2;
2.6 * X(2);
6.2;

Luego, para resolver el sistema, en la ventana de comandos de MATLAB ingresamos la siguiente orden:
[Xp, ITER, FLAG] = NEWTON_MV(@F1_2EC, @JF1_2EC, [0.5, 0.4], 1e-6, 1e6, 25)
Xp = 0.831437674158452
0.45565479630685
ITER = 6
FLAG = 1
Listado NEWTON_MODIF.M
Resolucin de un sistema de ecuaciones no lineales F(X) = 0 mediante el mtodo de Newton
Raphson modificado con desplazamientos sucesivos
function [Xp, ITER, FLAG] = NEWTON_MODIF(F, D, X, EPS1, MAXIT)
% Sintaxis
%
[Xp, ITER, FLAG] = NEWTON_MODIF(F, D, X, EPS1, MAXIT)
% Entrada
%
- F es el sistema de ecuaciones no lineales, almacenado como F.m
%
- D son las derivadas, almacenadas como D.m
%
- X es el vector de valores iniciales
%
- EPS1 es el criterio de convergencia
%
- MAXIT es el nmero mximo de iteraciones
% Salida
%
- Xp es el vector solucin
%
- ITER es el nmero de iteraciones realizadas

45

Mtodos Numricos - Aplicados a la Ingeniera


%
- FLAG es una variable lgica, es 1 si hubo convergencia, caso
%
contrario es 0
for K = 1 : MAXIT
XAUX = X;
for I = 1 : 2
FX = feval(F, X);
DX = feval(D, X);
X(I) = X(I) - FX(I) / DX(I);
end
if norm(XAUX - X) < EPS1
ITER = K;
FLAG = 1;
Xp = X;
return;
end
end
disp(Se ha excedido el mximo nmero de iteraciones...);
ITER = MAXIT;
FLAG = 0;
En este caso para resolver el sistema mostrado en el Problema 6.3 (pgina 297), el cual est dado por las
siguientes ecuaciones:

En primer lugar almacenamos el sistema como un archivo, por ejemplo:


Listado F2_2EC.m
function Y = F2_2EC(X)
Y(1) = 4 - (8 * X(1))^(1/3) - X(2)^(1/2);
Y(2) = 17 - X(1)^2 - X(2)^2;
return;
Adems requerimos las siguientes derivadas:

Las cuales tambin deben estar almacenadas como un archivo, por ejemplo DF2.m:
Listado DF2_2EC.m
function dY = DF2_2EC(X)
dY(1) = -(8/3) * (8 * X(1))^(-2/3);
dY(2) = -2 * X(2);
return
Luego, para resolver el sistema, en la ventana de comandos de MATLAB ingresar la siguiente instruccin:
[Xp, ITER, FLAG] = NEWTON_MODIF(@F2_2EC, @DF2_2EC, [4, 3], 1e-6, 25)
Xp = 0.9999999839973
4.00000000400067
ITER = 9
FLAG = 1

46

Aplicaciones a problemas con MATLAB

CAP. 10

Listado EULER.m
Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) en el intervalo [a, b],
mediante el mtodo de Euler
function [t, Y] = EULER(F, a, b, Y0, N)
% Sintaxis
%
[t, Y] = EULER(F, a, b, Y0, N)
% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- a y b son los extremos del intervalo
%
- Y0 es la condicin inicial YO = Y(a)
%
- N es ell nmero de pasos
% Salida
%
- t es el vector de la abscisas o variable independiente
%
- Y es el vector de las ordenadas o variable dependiente
H = (b - a) / N;
t = zeros(1, N + 1);
Y = zeros(1, N + 1);
t = [a: H: b];
Y(1) = Y0;
for J = 1 : N
Y(J + 1) = Y(J) + H * feval(F, t(J), Y(J));
end
t = t;
Y = Y;
Para resolver la ecuacin diferencial dada en el Problema 7.1 (pgina 367),
;

y(0) = 1

primero almacenamos la funcin como un archivo, por ejemplo ODEF1.m, segn se indica a continuacin:
Listado ODEF1.m
function DYDX = ODEF1(X, Y)
DYDX = (Y + 1) / (X - 1);
return;
Luego, en la ventana de comandos ingresar la siguiente orden:
[X, Y] = EULER(@ODEF1, 0, 0.4, 1, 4)
X = 0
Y =
1.0
0.1
0.8
0.2
0.6
0.3
0.4
0.4
0.2
Listado RK2.m
Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) el intervalo [a, b],
mediante el mtodo de Runge Kutta de segundo orden
function [t, Y] = RK2(F, a, b, Y0, N)
% Sintaxis
%
[t, Y] = RK2(F, a, b, Y0, N)

47

Mtodos Numricos - Aplicados a la Ingeniera


% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- a y b son los extremos del intervalo
%
- Y0 es la condicin inicial YO = Y(a)
%
- N es ell nmero de pasos
% Salida
%
- t es el vector de la abscisas o variable independiente
%
- Y es el vector de las ordenadas o variable dependiente
H = (b - a) / N;
t = zeros(1, N + 1);
Y = zeros(1, N + 1);
t = [a: H: b];
Y(1) = Y0;
for J = 1 : N
K1 = H * feval(F, t(J), Y(J));
K2 = H * feval(F, t(J) + H, Y(J) + K1);
Y(J + 1) = Y(J) + 0.5 * (K1 + K2);
end
t = t;
Y = Y;
Luego, para resolver la ecuacin diferencial del ejemplo anterior Problema 7.1 (pg. 367) simplemente
ingresar la siguiente orden en la ventana de comandos de MATLAB:
[X, Y] = RK2(@ODEF1, 0, 0.4, 1, 4)
X = 0
Y =
1.0
0.1
0.8
0.2
0.6
0.3
0.4
0.4
0.2
Para resolver la ecuacin diferencial del Problema 7.5 (pgina 377), dada por:
;

y(0.5) = 1

En primer lugar la almacenamos como un archivo, por ejemplo ODEF2.m, veamos:


Listado ODEF2.m
function DYDX = ODEF2(X, Y)
DYDX = X + 2 * X * Y;
return;
Luego, en la ventana de comandos de MATLAB ingresar la siguiente orden:
[X, Y] = RK2(@ODEF2, 0.5, 1, 1, 5)
X = 0.5000 Y =
1.0000
0.6000 1.1740
0.7000 1.4057
0.8000 1.7129
0.9000 2.1209
1.0000 2.6661

48

Aplicaciones a problemas con MATLAB

CAP. 10

Listado RK4.m
Aproximacin a la solucin del problema del valor inicial y = (t, x) con y0 = y(a) en el intervalo [a, b],
mediante el mtodo de Runge Kutta de cuarto orden
function [t, Y] = RK4(F, a, b, Y0, N)
% Sintaxis
%
[t, Y] = RK4(F, a, b, Y0, N)
% Entrada
%
- F es la funcin, almacenada como un archivo F.m
%
- a y b son los extremos del intervalo
%
- Y0 es la condicin inicial YO = Y(a)
%
- N es ell nmero de pasos
% Salida
%
- t es el vector de la abscisas o variable independiente
%
- Y es el vector de las ordenadas o variable dependiente
H = (b - a) / N;
t = zeros(1, N + 1);
Y = zeros(1, N + 1);
t = [a: H: b];
Y(1) = Y0;
for J = 1 : N
K1 = H * feval(F, t(J), Y(J));
K2 = H * feval(F, t(J) + H/2, Y(J) + K1/2);
K3 = H * feval(F, t(J) + H/2, Y(J) + K2/2);
K4 = H * feval(F, t(J) + H, Y(J) + K3);
Y(J + 1) = Y(J) + (K1 + 2 * K2 + 2 * K3 + K4)/6;
end
t = t;
Y = Y;
Por ejemplo, para resolver la ecuacin diferencial anterior (Problema 7.7, pg. 379), que est dada por:
;

y(0.5) = 1

Como ya esta almacenada como ODEF2.m, simplemente digitar lo siguiente en la ventana de comandos
de MATLAB:
[X, Y] = RK4(@ODEF2, 0.5, 1, 1, 5)
X = 0.5000 Y =
1.0000
0.6000 1.1744
0.7000 1.4069
0.8000 1.7155
0.9000 2.1260
1.0000 2.6755
Listado RK4_S.m
Aproximacin a la solucin del sistema de ecuaciones diferenciales:
x1 = 1(t, x1(t), x2(t), ... xm(t))
x2 = 2(t, x1(t), x2(t), ... xm(t))
.
.
.
xm = m(t, x1(t), x2(t), ... xm(t))

49

Mtodos Numricos - Aplicados a la Ingeniera


Con x1(a) = 1 , x2(a) = 2 , ... xm(a) = m en el intervalo [a, b], mediante el mtodo de Runge Kutta de
cuarto orden
function [t, Z] = RK4_S(F, a, b, Z0, N)
% Sintaxis
%
[t, Z] = RK4_S(F, a, b, Z0, N)
% Entrada
%
- F es el sistema de ecuaciones diferenciales, almacenado como un
%
archivo F.m
%
- a y b son los extremos del intervalo
%
- Z0 es la condicin inicial ZO = [X10, X20, X30, . . ., XM0]
%
- N es ell nmero de pasos
% Salida
%
- t es el vector de la abscisas o variable independiente
%
- Z es el vector de resultados, Z = [X1, X2, X3, . . ., XM]
H = (b - a) / N;
t = zeros(1, N + 1);
Z = zeros(N + 1, length(Z0));
t = [a : H : b];
Z(1, :) = Z0;
for J = 1 : N
K1 = H * feval(F, t(J), Z(J, :));
K2 = H * feval(F, t(J) + H/2, Z(J, :) + K1/2);
K3 = H * feval(F, t(J) + H/2, Z(J, :) + K2/2);
K4 = H * feval(F, t(J) + H, Z(J, :) + K3);
Z(J+1, :) = Z(J, :)+(K1 + 2*K2 + 2*K3 + K4) / 6;
end
Para resolver el sistema dado en el Problema 7.14 (pgina 400), dado por:
y = 4x y + 1
z = 2z y
Con: y(0) = 1 ; z(0) = 1
En primer lugar debemos almacenar el sistema como un archivo, por ejemplo ODE1_S2.m, tal como se
indica:
Listado ODE1_S2.m
function [F] = ODE1_S2(X, Z)
F(1) = 4 * X - Z(1) + 1;
F(2) = 2 * Z(2) - Z(1);
return;
Luego, en la ventana de comandos de MATLAB ingresar la siguiente instruccin:
[X, Z] = RK4_S(@ODE1_S2, 0, 0.6, [1, 1], 3)
X = 0.0000 Z =
1.0000 1.0000
0.2000 1.0749 1.2403
0.4000 1.2813 1.5646
0.6000 1.5953 1.9850

50

Aplicaciones a problemas con MATLAB

CAP. 10

Listado TC_UESG_CR.m
Aproximacin a la solucin la ecuacin diferencial de transferencia de calor, unidireccional,
rgimen estacionario, sin generacin en coordenadas rectangulares
function T = TC_UESG_CR(TA, TB)
% Sintaxis
%
T = TC_UESG_CR(TA, TB)
% Entrada
%
- TA, TB son las temperaturas en los extremos de la barra
% Salida
%
- T = [T1, T2, T3, T4, T5] es un vector que retorna las temperaturas
%
interiores de la barra
D(1) = -3;
D(5) = -3;
for I = 2 : 4
D(I) = -2;
end
for I = 1 : 4
D1(I) = 1;
end
A = diag(D1, -1) + diag(D, 0) + diag(D1, 1);
B(1) = -2 * TA;
B(5) = -2 * TB;
B = B;
T = inv(A) * B;
Para resolver el problema 8.1 dado en la pgina 562, ingresar la siguiente orden en la ventana de comandos
de MATLAB:
T = TC_UESG_CR(100, 500)
T =
140.00
220.00
300.00
380.00
460.00
Listado TC_UECG_CR.m
Aproximacin a la solucin la ecuacin diferencial de transferencia de calor, unidireccional,
rgimen estacionario, con generacin en coordenadas rectangulares
function T = TC_UECG_CR(TA, TB, G, K, DX)
% Sintaxis
%
T = TC_UECG_CR(TA, TB)
% Entrada
%
- TA, TB son las temperaturas en los extremos de la barra
%
- G es el trmino de generacin
%
- K es el coeficiente de conductividad
%
- DX es el incremento de longitud
% Salida
%
- T = [T1, T2, T3, T4, T5] es un vector que retorna las temperaturas
%
interiores de la barra
C = G * DX^2 / K;

51

Mtodos Numricos - Aplicados a la Ingeniera


D(1) = -3;
D(5) = -3;
for I = 2 : 4
D(I) = -2;
end
for I = 1 : 4
D1(I) = 1;
end
A = diag(D1, -1) + diag(D, 0) + diag(D1, 1);
B(1) = -2 * TA - C;
B(5) = -2 * TB - C;
for I = 2 : 4
B(I) = -C;
end
B = B;
T = inv(A) * B;
Para resolver el problema 8.2 dado en la pgina 563, ingresar la siguiente orden en la ventana de comandos
de MATLAB:
T = TC_UECG_CR(100, 200, 1e6, 0.5, 0.004)
T =
150.00
218.00
254.00
258.00
230.00
Listado TC_COND_CONV_UE_CR.m
Aproximacin a la solucin la ecuacin diferencial de transferencia de calor por conduccin y
conveccin, unidireccional, rgimen estacionario, en coordenadas rectangulares
function T = TC_COND_CONV_UE_CR(TA, TInf, H, K, P, A, DX)
% Sintaxis
%
T = TC_UECG_CR(TA, TInf, H, DX)
% Entrada
%
- TA es la temperatura de la pared de la aleta
%
- TInf es la temperatura del fluido
%
- H es el coeficiente de transferencia de calor por conveccin
%
- K es el coeficiente de transferencia de calor por conduccin
%
- P es el permetro del slido
%
- DX es el incremento de longitud
% Salida
%
- T = [T1, T2, T3, T4, T5] es un vector que retorna las temperaturas
%
interiores de la barra
C = (H * P) / (K * A) * DX^2;
D(1) = -(3 + C);
D(5) = -(1 + C);
for I = 2 : 4
D(I) = -(2 + C);
end
for I = 1 : 4
D1(I) = 1;
end
A = diag(D1, -1) + diag(D, 0) + diag(D1, 1);

52

Aplicaciones a problemas con MATLAB

CAP. 10

B(1) = -(C * TInf) - (2 * TA);


for I = 2 : 5
B(I) = -(C * TInf);
end
B = B;
T = inv(A) * B;
Para resolver el problema 8.3 dado en la pgina 568, ingresar la siguiente orden en la ventana de comandos
de MATLAB:
T = TC_COND_CONV_UE_CR(100, 20, 20, 1, 1, 1, 0.2)
T =
67.3513
39.9351
28.4670
23.7724
22.0958
Listado EXPLICITO.m
Resolucin de la ecuacin diferencial parcial:

Mediante el mtodo explcito.


function [TMALLA] = EXPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA)
% Sintaxis
%
[TMALLA] = EXPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA)
% Entrada
%
- CI es la condicin inicial, almacenada como un archivo CI.m
%
- CF1 y CF2 son las condiciones de frontera, almacenadas como archivos
% CF1.m y CF2.m, respectivamente
% - NX es el nmero de puntos de la malla en el eje X
% - Nt es el nmero de puntos de la malla en el eje t
% - XF es la longitud total del eje X
% - tF es la longitud total del eje t
% - ALFA es el coeficiente de la derivada de segundo orden
% Salida
% - TMALLA es una matriz que contiene la tabla (malla) con los valores de
% la variable dependiente T a lo largo del eje X a distintos tiempos t
DX = XF / (NX - 1);
Dt = tF / (Nt - 1);
LAMBDA = ALFA * Dt / DX^2;
for I = 2 : (NX - 1)
T(I) = CI(DX * (I - 1));
end
T(1) = (CI(DX) + CF1(Dt)) / 2;

53

Mtodos Numricos - Aplicados a la Ingeniera


T(NX) = (CI(XF - DX) + CF2(Dt)) / 2;
TMALLA(1, :) = T;
for J = 1 : (Nt - 1)
for I = 2 : (NX - 1)
T1(I) = LAMBDA * T(I - 1) + (1 - 2 * LAMBDA) * T(I) + LAMBDA * T(I
+ 1);
end
for I = 2 : (NX - 1)
T(I) = T1(I);
end
T(1) = CF1(Dt * J);
T(NX) = CF2(Dt * J);
TMALLA(J + 1, :) = T;
end
Por ejemplo, para resolver el Problema 9.3 (pgina 692), el cual presenta los siguientes datos:
u(x;0) = 0

u(0;t) = 50

u(1;t) = 50

Entonces primero tenemos que crear los archivos para la condicin inicial y para las condiciones de
frontera.
Listado C1.m
function T0 = CI(X)
T0 = 0;
return;
Listado CF1.m
function T = CF1(t)
T = 50;
return;
Listado CF2.m
function T = CF2(t)
T = 50;
return;
Luego, en la ventana de comandos de MATLAB ingresar la siguiente orden:
TMALLA = EXPLICITO(@CI, @CF1, @CF2, 6, 4, 1, 0.03, 1)
TMALLA =
25.0000
0
0
0
0
25.0000
50.0000
6.2500
0
0
6.2500
50.0000
50.0000
15.6250
1.5625 1.5625 15.6250
50.0000
50.0000
20.7031
5.0781 5.0781 20.7031
50.0000
Para obtener de manera grfica una distribucin de la temperatura en la barra para diferentes tiempos,
ingresar las siguientes rdenes en la ventana de comandos de MATLAB:
plot(X, TMALLA(1, :), X, TMALLA(2, :), X, TMALLA(3, :), X, TMALLA(4, :))
xlabel(X);
ylabel(T);

54

Aplicaciones a problemas con MATLAB

CAP. 10

Para obtener la grfica de la solucin numrica de la EDP de conduccin de calor en una sola dimensin
hacer:
surf(X, t, TMALLA)
xlabel(X); ylabel(t); zlabel(T);

Listado IMPLICITO.m
Resolucin de la ecuacin diferencial parcial:

55

Mtodos Numricos - Aplicados a la Ingeniera


Mediante el mtodo implcito.
function [TMALLA] = IMPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA)
% Sintaxis
%
[TMALLA] = IMPLICITO(CI, CF1, CF2, NX, Nt, XF, tF, ALFA)
% Entrada
%
- CI es la condicin inicial, almacenada como un archivo CI.m
%
- CF1 y CF2 son las condiciones de frontera, almacenadas como archivos
%
CF1.m y CF2.m, respectivamente
%
- NX es el nmero de puntos de la malla en el eje X
%
- Nt es el nmero de puntos de la malla en el eje t
%
- XF es la longitud total del eje X
%
- tF es la longitud total del eje t
%
- ALFA es el coeficiente de la derivada de segundo orden
% Salida
% - TMALLA es una matriz que contiene la tabla (malla) con los valores de
%
la variable dependiente T a lo largo del eje X a distintos tiempos t
DX = XF / (NX - 1);
Dt = tF / (Nt - 1);
LAMBDA = ALFA * Dt / DX^2;
for I = 2 : (NX - 1)
T(I) = CI(DX * (I - 1));
end
T(1) = (CI(DX) + CF1(Dt)) / 2;
T(NX) = (CI(XF - DX) + CF2(Dt)) / 2;
TMALLA(1, :) = T;
for I = 1 : (NX - 3)
A(I) = - LAMBDA;
C(I) = - LAMBDA;
end
for I = 1 : (NX - 2)
B(I) = 1 + 2 * LAMBDA;
end
for J = 1 : (Nt 1)
T(1) = CF1(Dt * J);
T(NX) = CF2(Dt * J);
for I = 1 : (NX - 2)
D(I) = T(I + 1);
end
D(1) = D(1) + LAMBDA * T(1);
D(NX - 2) = D(NX - 2) + LAMBDA * T(NX);
AA = diag(A, -1) + diag(B, 0) + diag(C, 1);
X = inv(AA) * D;
for I = 1 : (NX - 2)
T(I + 1) = X(I);
end
TMALLA(J + 1, :) = T;
end
Para el problema del caso anterior, en la ventana de comandos de MATLAB ingresar la siguiente orden:
TMALLA = IMPLICITO(@CI, @CF1, @CF2, 6, 4, 1, 0.03, 1)
TMALLA =
25.0000
0
0
0
0
50.0000
8.6207
1.7241 1.7241 8.6207
50.0000
50.0000 14.8038
4.3401 4.3401 14.8038
50.0000
50.0000 19.4288
7.3578 7.3578 19.4288
50.0000

56

25.0000

You might also like