Professional Documents
Culture Documents
FACULTAD DE INGENIERÍA
Instituto de Ciencias Básicas
Primavera de 2004.
II
ÍNDICE GENERAL
1. Introducción a MATLAB. 1
1.1. Primeros Pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Descripción del ambiente MATLAB. . . . . . . . . . . . . . . . . . . 1
1.1.2. Acceso al directorio de trabajo. . . . . . . . . . . . . . . . . . . . . . 2
1.1.3. Comandos básicos de asignación y comparación. . . . . . . . . . . . . 2
1.1.4. Sentencias lógicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.1.5. Lectura y escritura de variables. . . . . . . . . . . . . . . . . . . . . . 4
1.1.6. Lectura y escritura de archivos. . . . . . . . . . . . . . . . . . . . . . 5
1.1.7. Guardar variables y sesiones. . . . . . . . . . . . . . . . . . . . . . . 6
1.2. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2.1. Definición de funciones y procedimientos. . . . . . . . . . . . . . . . . 7
1.2.2. Funciones predefinidas. . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.2.3. Gráfico de funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.2.4. Definición de polinomios. . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.5. Comandos para polinomios. . . . . . . . . . . . . . . . . . . . . . . . 11
iii
IV ÍNDICE GENERAL
5. Integración Numérica. 41
5.1. Métodos Simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.1. Método del Trapecio simple. . . . . . . . . . . . . . . . . . . . . . . . 41
5.1.2. Método de Simpson simple. . . . . . . . . . . . . . . . . . . . . . . . 41
5.2. Métodos Compuestos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5.2.1. Método del Trapecio compuesto. . . . . . . . . . . . . . . . . . . . . . 42
5.2.2. Método de Simpson compuesto. . . . . . . . . . . . . . . . . . . . . . 42
Introducción
En estas notas se describe de manera breve las sesiones y los objetivos del curso “Métodos
Numéricos en MATLAB ” que fue dictado en la facultad de ingenierı́a de la Universidad Diego
Portales entre los meses de agosto y septiembre de 2004..
El objetivo inicial de este curso es el de enseñar el uso y aplicaciones del sofware para
computación cientı́fica MATLAB.
En partı́cular, se desea entregar una fuerte herramienta de cálculo y analisis matemático
aplicado al área de métodos numéricos y a otras áreas afines en matemáticas aplicadas.
Ası́, se espera contar al final de este curso con un alumnado preparado tanto para ejercer
academia con esta herramienta como para abordar problemas de ingenierı́a que necesiten
cierta especialización en estas áreas.
El perfil recomendado para el estudiante que desee seguir este curso es el de un alumno
con conocimientos en el área de métodos numéricos, que de preferencia haya aprobado el
curso correspondiente en la universidad Diego Portales u otro de un nivel equivalente, y que
además tenga ciertos conocimientos básicos en computación a nivel de usuario.
El apunte esta dividido en cuatro capı́tulos....
v
VI ÍNDICE GENERAL
CAPÍTULO 1
Introducción a MATLAB.
Observación 1 El usuario puede incorporar una de sus carpetas como una carpeta de uso
interno de MATLAB, o lo que usualmente se llama “incorporar una carpeta al Path de
MATLAB”. La manera más fácil de hacer esto es mediante el menú, siguiendo las opciones:
FILE → SET PATH.
1
2 1 Introducción a MATLAB.
>> cd C:\Curso_MATLAB_UDP
cambia el directorio actual al directorio o carpeta “Curso MATLAB UDP” en el disco duro
“C:”.
pwd (Print Working Directory). Nos muestra cual es el directorio actual. Por ejemplo:
>> pwd
ans =
C:\Curso_MATLAB_UDP
copia el archivo “sesion 1.m” en el archivo “sesion 2.m” dentro del directorio actual.
delete. Borra un archivo.
>> a=2
a =
asigna el valor 2 a la variable “a”. Nótese que la variable “a” no necesita ser definida pre-
viamente. Si en el anterior ejemplo se tipea el sı́mbolo “;” después de la asignación, esta
será efectuada pero MATLAB no mostrara ninguna respuesta. El valor de la variable puede
ser luego consultado en el Workspace Browser.
Los operadores relacionales (o de relación) son los siguientes:
< menor que,
> mayor que,
<= menor o igual que,
>= mayor o igual que,
== igual que,
∼= distinto que.
MATLAB asigna un número 1 para el valor “verdadero” y 0 para “falso”. Por ejemplo:
>> 1>=2
ans =
ans =
if condicion1
rutina1
elseif condicion2
rutina2
%....
elseif condicionN
rutinaN
else
rutina_final
end
for. Repite un conjunto de sentencias (es decir, una rutina) un número predeterminado
de veces dada por la primera sentencia.
for j=1:n
rutina
end
while. Se ejecuta una rutina mientras la condición dada en la primera sentencia sea cierta
(es decir tenga valor “verdadero”). Su sintaxis es la siguiente:
while condicion
rutina
end
try
rutina1
catch
rutina2
end
De este modo MATLAB espera que el usuario ingrese una valor para la variable “b”. Para
recuperar un texto se debe incorporar la opción ’s’. Por ejemplo, ejecutando
>> nombre=input(’Cual es tu nombre? ’,’s’);
Cual es tu nombre?
MATLAB espera que el usuario ingrese un texto que identifique su nombre, el cual será guar-
dado en la variable “nombre”.
display (o disp). Estos comandos nos permiten imprimir en pantalla un mensaje de texto
o el valor de una variable. El comando display imprime además el nombre de la variable
mientras que disp no lo hace. Veamos un ejemplo:
>> display(b)
b =
>> display(’Hola’)
ans =
Hola
o bien
>> disp(b)
4
>> disp(’Hola’)
Hola
’r’ lectura,
’w’ escritura reemplazando,
’a’ escribir a continuación,
’r+’ lectura y escritura.
Para cerrar el archivo se usa fclose o close.
>> error=fclose(archivo)
o bien
>> error=close(’all’)
Este último cierra todos los archivos abiertos con el comando “fopen”. Nuevamente la variable
“error” nos entrega información sobre un posible error.
fscanf, fprintf. Estos comandos nos permiten escribir y leer partes del archivo, en formato
ASCII, el cual ya ha sido abierto con fopen.
El comando fscanf permite leer una parte del archivo de la siguiente manera:
>> [var1,var2,...]=fscanf(archivo,’cc’,size)
En este caso “size” nos indica el tamaño de la variable a leer mientras que el carácter ’cc’ el
tipo de variable. Para este último las opciones son:
’ %s’ cadenas de caracteres,
’ %d’ variables enteras,
’ %f’ variables punto flotante,
’ %lf’ variables doble precisión.
Por otro lado el comando fprintf nos permite escribir en el archivo. Por ejemplo, la lı́nea
de comando
escribe en el archivo la lı́nea “El numero es: 2” (dado el valor anterior de la variable “a”),
y luego realiza un salto de lı́nea. Si se omite la variable indicadora “archivo”, este comando
también nos permite imprimir en pantalla.
Ejercicio 1 Cree un archivo de texto plano (puede usar “notepad.exe” o el editor de texto de
MATLAB) con una frase muy simple en su interior, por ejemplo, su nombre. Luego, ocupe
los comandos enseñados anteriormente para leer esta frase y guardarla en una variable.
1.2. Funciones
1.2.1. Definición de funciones y procedimientos.
Para definir funciones o procedimientos en MATLAB se usa un texto plano que debe
terminar en la extensión “.m”. Una manera simple de editar y crear un archivo “.m” es el
editor de texto plano que se incluye en MATLAB, y al cual se puede acceder desde su menú.
Para crear una función se debe tener en cuenta que el archivo “.m” debe tener el mismo
nombre que el de la función. Además, para poder usar la función previamente definida se
debe guardar el archivo en el directorio actual (o directorio de trabajo) o bien en algún
directorio de uso interno de MATLAB.
Veamos como crear la función
f (x) = ex + x2 − x + 1.
En algún editor de texto plano como el que tiene MATLAB se escribe:
function y=f(x);
y=exp(x)+x^2-x+1;
y luego se guarda con el nombre “f.m”.
Ejercicio 2 Crear la función
½ √
cos(x) + x3 + x − 1, si x ≥ 0,
g(x) =
log(x + 1) − x, si x < 0
De esta misma forma se pueden crear funciones con rutinas más complicadas o procedi-
mientos que no necesariamente entregan un valor determinado.
La mejor manera de evaluar una función previamente definida es usando el comando feval
>> feval(’f’,0)
ans =
2
Un procedimiento es creado mediante un archivo “.m” cuyo nombre será el del procedi-
miento o rutina a ejecutar, y que contendrá las instrucciones y sentencias a seguir.
8 1 Introducción a MATLAB.
ans =
67
>> sort(t)
ans =
-5 1 3 23 45
>> min(t)
ans =
-5
>> mean(t)
ans =
13.4000
floor, round. El primero nos da el número entero menor más cercano al valor real al cual
se le aplica. Mientras que el segundo aproxima el valor.
>> floor(3.6)
ans =
>> round(3.6)
1.2 Funciones 9
ans =
rand. Genera matrices o vectores cuyas componentes son números aleatorios entre cero y
uno.
En este caso hemos creado una grilla de puntos equiespaciados entre -10 y 10, con un paso
igual a 0.1, usando el comando “:”. Esto ha sido finalmente guardado en la variable “x”.
Veamos ahora ciertas opciones que nos permiten individualizar nuestro gráfico. Se puede
dar un nombre a los ejes x e y usando los comandos
Color Sı́mbolo
rojo r
amarillo y
azul b
magenta m
verde g
blanco w
negro k
turquesa c
Por ejemplo, reproduciremos nuevamente el gráfico anterior con una marca de cı́rculo de
color azul.
>> plot(x,y,’ob’);
Para dibujar varias funciones al mismo tiempo se debe utilizar una matriz de valores.
Este tópico será estudiado en la proxima clase. Veamos un ejemplo:
>> A= [sin(x); cos(x)];
>> plot(x,A);
Observación 3 Cuando se calculan los valores, ya sea “y” o la matriz “A” en los ejemplos
anteriores, se deben reemplazar las operaciones usuales multiplicación “*” división “/” y
elevado “ˆ” por las versiones “punto” o “componente a componente” de estas operaciones “.*
./ .ˆ ”. Esto evita errores en el manejo de las dimensiones. Esto será explicado en profundidad
en la proxima sesión.
fplot. Este comando grafica directamente una función sin pasar por un grillaje. Su sintaxis
es la siguiente:
>> fplot(’nombre_funcion’,[xmin xmax],’opciones’);
Los valores “xmin” y “xmax” nos dan los valores mı́nimos y maximos del eje x, las “opciones”
de gráficos son las mismas que las del comando plot.
subplot. Permite hacer varios gráficos al mismo tiempo haciendo divisiones de la pantalla
original. Por ejemplo
>> subplot(2,2,1), plot(x,y);
>> subplot(2,2,2), plot(x,A);
>> subplot(2,2,3); fplot(’sin’,[-10 10],’+g’);
>> subplot(2,2,4); fplot(’f’,[-1 1],’:k’);
divide la pantalla gráfica en cuatro partes dibujando en cada uno de los segmentos las
funciones correspondientes.
>> polyval(t,0)
ans =
45
>> roots(t)
ans =
-22.8554
-1.3873
0.6214 + 1.0164i
0.6214 - 1.0164i
>> polyder(t)
ans =
4 69 6 -5
Note que el resultado tiene una dimensión menor que el polinomio original.
conv, deconv. Nos entrega la multiplicación y la división usual de polinomios. En el caso
de la división también nos entrega el polinomio residuo. Revisemos rapidamente su sintaxis.
>> q=conv(p,t);
>> [q,r]=deconv(p,t);
Ejercicio 3 Calcular el producto entre los polinomios “t”, definido anteriormente, y el po-
linomio
p(x) = 1 − x2 + 5x3 + 13x4 − 6x5 .
Ejercicio 4 Calcular el polinomio residuo de la división del polinomio “p” por el polinomio
“t”.
12 1 Introducción a MATLAB.
CAPÍTULO 2
2.1. Matrices.
2.1.1. Definición de Matrices.
Las matrices se crean introduciendo sus elementos entre corchetes cuadrados “[” y “]”.
Se procede primero por filas las cuales se separan por el sı́mbolo “;”. Luego, cada elemento
en una fila es separado por un espacio o coma. Ilustremos su uso:
>> A=[1 2 3; 4 5 6]
A =
1 2 3
4 5 6
Los vectores se consideran como casos partı́culares de matrices donde una de las dimen-
siones es igual a 1.
Existen comandos que también permiten definir matrices, por ejemplo el operador tras-
puesto definido por la comilla simple ’.
>> A’
ans =
1 4
2 5
3 6
Los comandos “zeros” y “ones” permiten crear matrices de una dimensión asignada por
el usuario cuyos elementos son sólo ceros y unos, respectivamente. Por ejemplo:
13
14 2 Métodos Iterativos para Sistemas Lineales.
>> zeros(1,3)
ans =
0 0 0
>> ones(3,2)
ans =
1 1
1 1
1 1
ans =
1 0 0
0 3 0
0 0 4
Si se aplica a una matriz, este comando extrae la diagonal de la matriz y nos da como
respuesta un vector columna cuyas componentes son los elementos de esta diagonal.
>> diag(A)
ans =
1
5
Una manera muy útil para definir y crear matrices es el “concatenar” diferentes subma-
trices. De esta forma se crea una matriz de un tamaño mayor cuyos bloques corresponden a
los valores concatenados. Por ejemplo:
>> B=[A ; x]
B =
1 2 3
4 5 6
1 3 4
2.1 Matrices. 15
crea una nueva matriz “B” donde sus dos primeras filas corresponden a la matriz “A”, y su
tercera fila es el vector “x”.
Ejercicio 6 Recordando el comando rand enseñado en la sesión anterior, crear una matriz
de 7 filas y 9 columnas cuyas componentes sean enteros entre -5 y 10.
Para ver o utilizar en algún cálculo el elemento (i, j) de la matriz “A” se debe usar la
sintaxis:
>> A(i,j)
Ası́ también podemos ver o utilizar una fila o columna completa de una matriz con el
comando “:”. Veamos un ejemplo de su uso.
>> A(1,:)
ans =
1 2 3
muestra la primera fila de la matriz “A”. Similarmente, “A(:,j)” muestra la columna “j” de
la matriz “A”.
Otra aplicación interesante del comando “:” nos permite mostrar solo una parte de cierta
fila o columna. Ejemplifiquemos su uso.
>> A(:,1:2)
ans =
1 2
4 5
muestra las dos primeras columnas de la matriz “A”. También podemos ver o utilizar la
primera y tercera columna de “A” de la siguiente forma
16 2 Métodos Iterativos para Sistemas Lineales.
ans =
1 3
4 6
Finalmente veremos el uso de la variable indicadora “end” que hace referencia a la última
fila o columna de una matriz. Por ejemplo,
>> A(end,:)
ans =
4 5 6
muestra la última fila de la matriz “A”.
ans =
2 -3 16
>> x.^y
ans =
>> x./y
ans =
>> size(A)
ans =
2 3
>> norm(A)
ans =
9.5080
>> norm(A,inf)
ans =
15
>> pinv(A)
ans =
-0.9444 0.4444
-0.1111 0.1111
0.7222 -0.2222
rank. Calcula el rango de una matriz. Esto es la cantidad de filas o columnas linealmente
independientes.
18 2 Métodos Iterativos para Sistemas Lineales.
>> rank(A)
ans =
>> C=A’*A;
>> [Q,D]=eig(C)
Q =
D =
-0.0000 0 0
0 0.5973 0
0 0 90.4027
Nos da como resultado una matriz ortogonal “Q” cuyas columnas son los vectores propios
de la matriz “C” y una matriz diagonal “D” con los valores propios de “C”.
poly. Devuelve un vector con los coeficientes del polinomio caracterı́stico de una matriz
cuadrada.
lu. Calcula la descomposición LU de una matriz. Veamos un ejemplo de su uso.
>> [L,U]=lu(C)
L =
0.6296 1.0000 0
0.8148 0.5000 1.0000
1.0000 0 0
2.2 Métodos Iterativos para Sistemas Lineales. 19
U =
Ax = b, (2.1)
Esta condición en partı́cular implica que los elementos de la diagonal de A no son nulos.
Veamos ahora el código del método de Jacobi en forma de “procedimiento”.
n=lenght(A);
x0=round(10*rand(n,1)) %vector inicial
20 2 Métodos Iterativos para Sistemas Lineales.
error = norm(A*xk-b,inf);
% Se puede usar otra norma
% u otro tipo de error (ej. error relativo)
Luego para resolver el sistema lineal (2.1) se deben modificar los valores de A y b en el
código fuente según desee el usuario, y luego ejecutar el procedimiento desde el command
window de MATLAB.
El código presentado anteriormente se puede mejorar en varios puntos. Para esto, propo-
nemos ciertos ejercicios a continuación.
Ejercicio 7 Agregar al código del método de Jacobi una sentencia que advierta cuando la
matriz A, implicada en el sistema lineal (2.1), no sea diagonal dominante por columnas.
Ejercicio 8 Modificar el código fuente antes mostrado de tal modo que sea el usuario quien
ingrese los valores de la matriz “A” y el vector “b”, del lado derecho del sistema lineal (2.1),
utilizando un formato de función. En otras palabras, modificar levemente el procedimiento
antes expuesto de modo de dejarlo como una función.
xk+1 = MJ xk + B,
Ejercicio 10 Al igual que en el ejercicio 7, agregar una rutina que advierta cuando la matriz
A no es diagonal dominante por filas.
xk+1 = wxgs
k+1 + (1 − w)xk , (2.4)
donde xgs
k+1 corresponde a la iteración k + 1 del método de Gauss-Seidel.
Ejercicio 11 Implementar la regla de actualización del método de SOR dada por (2.4).
22 2 Métodos Iterativos para Sistemas Lineales.
CAPÍTULO 3
En esta parte estudiaremos los distintos métodos para resolver la ecuación no lineal (en
x)
f (x) = 0, (3.1)
donde en un principio asumiremos que la función f y la variable x son escalares, es decir,
f : R → R y x ∈ R.
if fxo*fx1 < 0
while abs(fx1) >= epsilon
x2 =(xo+x1)*0.5;
23
24 3 Solución de Ecuaciones No Lineales.
fx2=feval(fname,x2);
iter=iter+1;
fprintf(’ Iteracion %1.0f\n Valor aprox de la raiz %1.8f
Valor de la funcion %1.8f\n’,iter,x2,fx2);
if fx2*fx1 < 0
xo=x2; fxo=fx2;
else
x1=x2; fx1=fx2;
end
if iter > maxiter
fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end
end
else
fprintf(’ La funcion en los extremos del intervalo
tiene el mismo signo \n’);
end
Para esto, cree esta función y luego dibujela para determinar los posibles puntos iniciales.
fx1=feval(fname,x1);
fxo=feval(fname,xo);
3.1 Métodos Gráficos. 25
cte=(fx1-fxo)/(x1 - xo);
x2=x1-fx1/cte; fx2=feval(fname,x2);
iter=iter+1;
fprintf(’ Iteracion %1.0f \n Aprox de la raiz %1.8f
Valor de la funcion %1.8e\n’,iter,x2,fx2);
xo=x1;
x1=x2;
if iter > maxiter
fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end
end
if fxo*fx1 < 0
while abs(fx1) >= epsilon
fx1=feval(fname,x1);
fxo=feval(fname,xo);
cte=(fx1-fxo)/(x1 - xo);
x2=x1-fx1/cte; fx2=feval(fname,x2);
iter=iter+1;
fprintf(’ Iteracion %1.0f \n Aprox de la raiz %1.8f
Valor de la funcion %1.8e \n’,iter,x2,fx2);
if fx2*fx1 < 0
xo=x2; fxo=fx2;
else
x1=x2; fx1=fx2;
26 3 Solución de Ecuaciones No Lineales.
end
if iter > maxiter
fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end
end
else
fprintf(’ La funcion en los extremos del
intervalo tiene el mismo signo \n’);
end
g(x∗ ) = x∗ . (3.3)
xk+1 = g(xk ) ∀k ≥ 1,
donde x0 es el punto inicial dado por el usuatio. Ası́, si la sucesión converge, esta lo hará a
la solución x∗ .
Este tipo de métodos tiene una gran cantidad de propiedades téoricas y de ventajas
prácticas las cuales no se discutirán en estas notas.
%=========================================================
% Metodo de punto fijo
%=========================================================
% Variables de Entrada
%---------------------------
% fname : Nombre variable que contiene la funcion f
% gname : Nombre variable que contiene la funcion g
% epsilon : Precision o Tolerancia
%---------------------------
% Variables de Salida
%---------------------------
% x1 : Aproximacion del cero de la funcion
% fx1 : Valor de la funcion en el punto
3.2 Método de Punto Fijo. 27
gxo=feval(gname,xo);
x1=gxo;
fx1=feval(fname,x1);
error=abs(x1-xo);%min(abs(x1-xo),abs(fx1)); abs(fx1);
xo=x1;
iter=iter + 1;
end
f (x) = ex − x − 1.
Defina una estrategia de punto fijo, y utilice el esquema enseñado en esta sección para en-
contrar una solución aproximada de (3.1).
%=========================================================
% Metodo de Newton
%=========================================================
28 3 Solución de Ecuaciones No Lineales.
fxo=feval(fname,xo);
fpxo=feval(fprima,xo);
x1=xo-fxo/fpxo
fx1=feval(fname,x1)
error =abs(fx1); %abs(x1-xo);
xo=x1;
iter=iter + 1;
end
Ejercicio 17 Modificar el codigo fuente del método de Newton enseñado en la sección an-
terior aplicando la iteración (3.4).
Newton mostrado anteriormente no difiere mucho salvo por ciertos comandos matriciales y
el uso de vectores en lugar de valores escalares.
El usuario debe ahora ingresar la matriz Jacobiana de f (guardada en la variable “fJa-
cob”) en lugar de la función. Además, en cada iteración se debe resolver un sistema lineal
para determinar la nueva iteración xk+1 , lo cual puede hecho ya sea mediante comandos
internos de MATLAB o con los métodos iterativos Jacobi, Gauss–Seidel y SOR enseñados
en sesiones anteriores.
Veamos como cambia la iteración en este caso.
fxo = feval(fname,xo);
fpxo = feval(fJacob,xo);
x1 = xo-inv(fpxo)*fxo;
% xaux = Jacobi(fpxo,fxo);
% xaux = GaussSeidel(fpxo,fxo);
% w= ; xaux = SOR(fpxo,fxo,w);
% Se puede resolver el sist. lineal usando
% alguna de estas rutinas
% x1 = xo-xaux;
fx1 = feval(fname,x1);
error = norm(fx1); % norm(x1-xo); u otro error posible
Interpolación y Aproximación de
Funciones.
p(xi ) = yi i = 1, ..., n.
donde Ln,i es el polinomio coeficiente de Lagrange para los nodos x1 , ..., xn , que viene dado
por
Πn−1
k=1; k6=i (x − xk )
Ln,i (x) := n−1 ∀i = 1, ..., n. (4.2)
Πk=1; k6=i (xi − xk )
Veamos el código fuente para calcular este polinomio. En este el usuario debe ingresar la
malla de puntos (xi , yi ), i = 1, ..., n, en los vectores x e y.
%==========================================================
% Interpolacion de Lagrange
%==========================================================
31
32 4 Interpolación y Aproximación de Funciones.
% Variables de Entrada
%---------------------------
% x : Vector que contiene la lista de las abscisas
% y : Vector que contiene la lista de las ordenadas
%---------------------------
% Variables de Salida
%---------------------------
% C : Vector que contiene los coeficientes
% del polinomio interpolador de Lagrange
% L : Matriz que contiene los coeficientes
% de los polinomios coeficientes de Lagrange
%----------------------------------------------------------
x= ; y= ; N=length(x); L=zeros(N,N);
for k=1:N
V=1;
for j=1:N
if j~=k
V=conv(V,poly(x(j)))/(x(k)-x(j));
end
end
L(k,:)=V;
end
f (x) = ex sin(x) − x − 1
f [xj ] = f (xj ),
f (xj+1 ) − f (xj )
f [xj , xj+1 ] = ,
xj+1 − xj
...
f [xj+1 , ..., xk ] − f [xj , ..., xk−1 ]
f [xj , xj+1 , ..., xk ] = ∀ 1 ≤ j < k ≤ n.
xk − xj
Calcularemos estas diferencias dividas almacenando los valores en una matriz definida
por
D(k, j) = f [xk−j+1 , ..., xk ] ∀1 ≤ j ≤ k ≤ n. (4.3)
Luego, la definición de diferencias divididas nos permite calcular recursivamente los ele-
mentos de la matriz D:
D(k, j − 1) − D(k − 1, j − 1)
D(k, j) = .
xk − xk−j+1
Veamos el código fuente que nos entrega la matriz D, como variables de entrada se toman
dos vectores filas x e y con los valores de la malla (xi , yi ), i = 1, ..., n.
x=; y= ;
for j=2:n
for k=j:n
D(k,j)=(D(k,j-1)-D(k-1,j-1))/(x(k)-x(k-j+1));
end
end
%=======================================================
% Interpolacion de Newton
%=======================================================
% Variables de Entrada
%---------------------------
% x : Vector que contiene la lista de las abscisas
% y : Vector que contiene la lista de las ordenadas
%---------------------------
% Variables de Salida
%-------------------------
% C : Vector que contiene los coeficientes
% del polinomio interpolador de Newton
% D : Tabla de diferencias divididas
%-------------------------------------------------------
x= ; y= ; n=length(x);
D=zeros(n,n); D(:,1)=y’;
for j=2:n
for k=j:n
D(k,j)=(D(k,j-1)-D(k-1,j-1))/(x(k)-x(k-j+1));
end
end
C=D(n,n);
for k=(n-1):-1:1
C=conv(C,poly(x(k)));
m=length(C);
C(m)=C(m)+D(k,k);
end
function r = plus_pol(p,q)
%===============================================================
% Interpolacion de Hermite
%===============================================================
% Variables de Entrada
%---------------------------
% x : Vector que contiene la lista de las abscisas
% y : Vector que contiene la lista de las ordenadas
36 4 Interpolación y Aproximación de Funciones.
x= ; y= ; yp= ;
N=length(x); L=zeros(N,N);
for k=1:N
V=1;
for j=1:N
if j~=k
V=conv(V,poly(x(j)))/(x(k)-x(j));
end
end
L(k,:)=V;
end
for k=1:N
aux1= conv(L(k,:),L(k,:));
aux2= polyval(polyder(L(k,:)),x(k));
H2(k,:)= conv(poly(x(k)),aux1);
H(k,:)= plus_pol(aux1,-2*aux2*H2(k,:));
end
C=plus_pol(y*H, yp*H2)
p(xi ) = yi i = 1, ..., n.
4.2.1. Interpolación.
Repasaremos los comandos internos de MATLAB relacionados con la interpolación poli-
nomial, en partı́cular la lineal y la cúbica.
Describiremos los comandos interp1, interp2, interp3 e interpn, que nos permiten inter-
polar funciones de 1, 2, hasta n variables.
interp1. La sintaxis es el siguiente
>> yi = interp1(x,y,xi,’metodo’)
Esta intrucción interpola los valores del vector y, cuyos valores en las abscisas corres-
ponden a x. La variable xi nos indica los puntos del eje de las abscisas donde se evaluará la
interpolación y cuyos valores son guardados en yi.
Finalmente, el indicador ’metodo’ nos indica el tipo de método que se va a usar. Por
defecto se utiliza la interpolación lineal. Veamos algunas de las opciones posibles:
’nearest’ interpolación vecindad más cercana,
’linear’ interpolación lineal,
’spline’ interpolación spline cúbica por pedazos (SPLINE).
La sintaxis para los comandos con una dimensión mayor son similares.
Ejemplo 1 En el siguiente ejemplo interpolamos la función seno en los puntos 0, 1, ..., 10,
y luego se dibuja esta interpolación:
>> x = 0:10; y = sin(x); xi = 0:.25:10;
>> yi = interp1(x,y,xi); plot(x,y,’o’,xi,yi)
El comando spline tiene dos formatos de salida posible en dependencia de la sintaxis que
se utilice. La primera es similar a la del comando interp1 enseñado en la sección anterior:
>> yi = spline(x,y,xi)
la cual equivale a aplicar el comando interp1 con el método ’spline’.
Una segunda forma es ejecutando
>> P = spline(x,y)
la cual entrega una función polinomial por pedazos P . Este polinomio contiene como infor-
mación los quiebres, que corresponden a los puntos xi y los coeficientes asociados a cada
polinomio.
Para trabajar con las funciones polinomiales por pedazos explicaremos rápidamente los
siguiente comandos:
mkpp. Crea una función polinomial por pedazos. La sintaxis es la siguiente:
>> P = mkpp(BREAKS,COEFS,D)
crea un polinomio por pedazos P de dimensión D (es decir el vector de entrada tiene dimen-
sión D), cuyos quiebres son las componentes del vector BREAKS, y donde los coeficientes
de cada polinomio vienen dados por los vectores columnas de la matriz COEFS. Se debe
notar que la matriz COEFS tiene tres dimensiones, la primera asociado a la dimensión D
del polinomio, la segunda a cada quiebre y la tercera a los coeficientes.
unmkpp. Nos entrega la información acerca del polinomio. Por ejemplo
extrae del polinomio por pedazos P sus quiebres, coeficientes, número de polinomios, orden
(grado de P + 1) y su dimensión. El polinomio P puede haber sido creado por el comando
spline o mkpp.
ppval. Este comando evalua el polinomio correspondiente.
f (x) = ex sin(x) − x − 1
M C = b, (4.8)
P P P
donde C = (c1 , ..., cm+1 )> , b = ( ni=1 yi , ni=1 yi xi , ..., ni=1 yi xm >
i ) y la matriz M = (Mkl )
viene dada por
n
X
Mkl = xk+l−2
i ∀k, l = 1, ..., m + 1. (4.9)
i=1
for k=0:(2*m)
aux(k+1)= sum(x.^k);
if k<=m
b(k+1)= sum(y.*x.^k);
end
end
M=zeros(m+1);
for k=1:(m+1)
M(k,:)= aux(k:(k+m));
end
c= inv(M)*b’;
% c= Jacobi(M,b); c= Gauss_Seidel(M,b); w= ; c= SOR(M,b,w);
c=flipud(c)
40 4 Interpolación y Aproximación de Funciones.
Ejercicio 21 Aproximar la función f del ejercicio 21 usando los mismos puntos xi , me-
diante el método de minimos cuadrados para un polinomio de grado 2.
Ejercicio 22 Aplicar el código anterior para desarrolar un método que aproxime el sistema
exponencial
y = CeAx ,
donde A y C son las constantes a determinar. Resolver este sistema para los puntos (0,1.5),
(1,2.5), (2,3.5), (3,5) y (4,7.5).
Integración Numérica.
donde los puntos xi satisfacen que x1 = a y xn = b, y son determinados por los respectivos
métodos de integración, al igual que los coeficientes ci .
41
42 5 Integración Numérica.
function s=trap_comp(f,a,b,M)
h=(b-a)/M;
s=0;
for k=1:(M-1)
x=a+h*k;
s=s+feval(f,x);
end
s=h*(feval(f,a)+feval(f,b))/2 + h*s;
function s=simp_comp(f,a,b,M)
h=(b-a)/M;
s=0;
for k=1:M
xi=a+h*(k-1);
xi1= xi + h;
s=s+feval(f,xi)+4*feval(f,(xi+xi1)/2)+feval(f,xi1);
end
s=h*s/6 ;
Ejercicio 25 Calcular la integral entre -1 y 1 de la función f del ejercicio 24, usando ambos
métodos compuestos considerando 10 subintervalos.
44 5 Integración Numérica.
BIBLIOGRAFÍA
[MF00] J. H. Mathews and K. D. Fink. Métodos Numéricos con MATLAB. Prentice Hall,
Madrid, 2000. Tercera edición.
45