You are on page 1of 51

Universidad Diego Portales

FACULTAD DE INGENIERÍA
Instituto de Ciencias Básicas

Apuntes del Curso Métodos Numéricos con


Matlab
Paul Bosch
Roberto Carlos Cabrales
Hector Ramı́rez

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

2. Métodos Iterativos para Sistemas Lineales. 13


2.1. Matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1. Definición de Matrices. . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.2. Operaciones básicas sobre matrices. . . . . . . . . . . . . . . . . . . . 16
2.1.3. Factorización y descomposición matricial. . . . . . . . . . . . . . . . . 18
2.2. Métodos Iterativos para Sistemas Lineales. . . . . . . . . . . . . . . . . . . . 19
2.2.1. Método de Jacobi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.2. Método de Gauss-Seidel. . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.2.3. Método de SOR o Relajación. . . . . . . . . . . . . . . . . . . . . . . 21

3. Solución de Ecuaciones No Lineales. 23


3.1. Métodos Gráficos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.1. Método de la Bisección. . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.1.2. Método de la Secante. . . . . . . . . . . . . . . . . . . . . . . . . . . 24

iii
IV ÍNDICE GENERAL

3.1.3. Método de Regula-Falsi. . . . . . . . . . . . . . . . . . . . . . . . . . 25


3.2. Método de Punto Fijo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2.1. Implementación Método de Punto Fijo. . . . . . . . . . . . . . . . . . 26
3.2.2. Método de Newton. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.3. Método de Newton Modificado. . . . . . . . . . . . . . . . . . . . . . 28
3.2.4. Método de Newton en Varias Variables. . . . . . . . . . . . . . . . . . 28

4. Interpolación y Aproximación de Funciones. 31


4.1. Interpolación Polinomial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.1. Polinomio de Lagrange. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.2. Diferencias Divididas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.1.3. Polinomio de Newton. . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.1.4. Polinomio de Hermite. . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2. Interpolación por pedazos y aproximación de funciones. . . . . . . . . . . . . 37
4.2.1. Interpolación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.2. Spline Cúbica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.3. Mı́nimos cuadrados discretos. . . . . . . . . . . . . . . . . . . . . . . 38

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.

1.1. Primeros Pasos


1.1.1. Descripción del ambiente MATLAB.
Command Window. Ésta es la ventana en la que se ejecutan interactivamente las instruc-
ciones de MATLAB y en donde se muestran los posibles resultados, si corresponde. Luego,
se puede considerar como la ventana más importante de MATLAB.
Launch Pad. Ventana de la cual se puede acceder a otros componentes de MATLAB
como el Help Browser (o Buscador de ayuda), o las Demos asociadas a distintos tópicos de
MATLAB. Esto permite trabajar de una forma más dinámica sin pasar por menús o por
otros comandos.
Workspace Browser. Es el espacio de trabajo de MATLAB donde se nos muestra el con-
junto de variables y funciones que actualmente están definidas en la memoria de MATLAB,
y por lo tanto se puede acceder y trabajar con esta información desde el Command Window.
Command History Browser. Permite el acceso a las sentencias que se han ejecutado
anteriormente en el Command Window. Esto mediante un doble clic de la sentencia deseada.
También se puede acceder a estas sentencias usando las teclas ↑ y ↓.
Current Directory Browser. Permite acceder y determinar el directorio actual de MATLAB,
el cual se define a grandes rasgos como el directorio (o carpeta) que MATLAB utiliza para
“funcionar” en la actual sesión. En efecto, sólo se podrán usar los archivos o ejecutar los
programas, procedimientos y funciones que se encuentran en este directorio o en uno de uso
interno de MATLAB que ya se encuentre especificado. Ésta ventana también permite ver y
trabajar con los archivos que se encuentra en el directorio de trabajo.

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.

1.1.2. Acceso al directorio de trabajo.


Estos comandos nos permiten acceder directamente a la carpeta de trabajo o directorio
actual desde la ventana Command Window, lo cual se puede ver como una manera alternativa
a trabajar con la ventana Current Directory Browser.
La mayorı́a de ellos funcionan igual que en el sistema operativo MS-DOS.
dir. Nos muestra todos los archivos del directorio actual.
mkdir (Make Directory). Crea un directorio (o carpeta). Por ejemplo:

>> mkdir C:\Curso_MATLAB_UDP

crea el directorio o carpeta “Curso MATLAB UDP” en el disco duro “C:”.


cd (Change Directory). Cambia el directorio actual. Por ejemplo:

>> cd C:\Curso_MATLAB_UDP

cambia el directorio actual al directorio o carpeta “Curso MATLAB UDP” en el disco duro
“C:”.

Observación 2 El directorio al que se desea cambiar debe existir.

pwd (Print Working Directory). Nos muestra cual es el directorio actual. Por ejemplo:

>> pwd

ans =

C:\Curso_MATLAB_UDP

type. Nos muestra el contenido de un archivo.


copyfile. Copia un archivo. Por ejemplo:

>> copyfile sesion_1.m sesion__2.m

copia el archivo “sesion 1.m” en el archivo “sesion 2.m” dentro del directorio actual.
delete. Borra un archivo.

1.1.3. Comandos básicos de asignación y comparación.


En esta sección veremos como usar los operadores relacionales y lógicos en MATLAB,
estos son los que nos permiten efectuar una o varias comparaciones asignando un grado de
verdad a una condición matemática.
Para esto primero debemos establecer la forma de asignar valor a las variables. En
MATLAB esto se hace simplemente con el comando “=”. Por ejemplo:
1.1 Primeros Pasos 3

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

Los operadores lógicos son definidos como sigue:


& and (y)
| or (o)
∼ negación lógica
Veamos mediante un ejemplo su uso. Consideremos la variable “a”, a la cual le fue
asignado anteriormente el valor 2. Se obtiene ası́ que:

>> a>0 & ~(a~=2)

ans =

1.1.4. Sentencias lógicas.


MATLAB nos permite programar rutinas usando sentencias que se ejecutaran si ciertas
condiciones son ciertas. Estos comandos funcionan similarmente a cualquier otro lenguaje de
programación y sólo su sintaxis es levemente distinta. Procederemos a explicar brevemente
cada una de ellas.
if, elseif, else. Se describe su uso como sigue:
4 1 Introducción a MATLAB.

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

break. Interrumpe la actual rutina.


try...catch...end. Permite gestionar errores que se pueden producir en la ejecución de un
programa. Su sintaxis es:

try
rutina1
catch
rutina2
end

En el caso de que en la primera rutina (“rutina1”) se produzca un error, MATLAB pasa a


ejecutar la segunda rutina (“rutina2”). Si no se produciera un error en la primera rutina, la
segunda rutina no se ejecutarı́a nunca.

1.1.5. Lectura y escritura de variables.


input. Permite imprimir un mensaje en la lı́nea de comandos de MATLAB y al mismo
tiempo recuperar un valor numérico o un texto (o “string”) que ha sido ingresado por el
usuario. Veamos su modo de uso:

>> b=input(’ingrese numero ’);


ingrese numero
1.1 Primeros Pasos 5

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

1.1.6. Lectura y escritura de archivos.


Existen varias formas de interactuar con archivos en MATLAB y versiones modernas
como la 6.5 nos permite trabajar de una manera bastante amigable desde el menú. Sin
embargo, vale la pena aprender ciertos comandos básicos que pueden ser de bastante utilidad
cuando se crea una rutina.
fopen, fclose, close. Estos comandos nos permiten abrir y cerrar archivos para su uso. Su
sintaxis es:
>> [archivo,error]=fopen(’nombre_archivo’,’c’)
Luego “archivo” sera la variable o indicador para el archivo con que vamos a trabajar, “error”
es una variable que nos proporciona información sobre un posible error al abrir el archivo.
Cuando algún error se produce nos entrega el valor “-1”. El uso de esta última variable es
opcional. Finalmente, el carácter “c” indica el tipo de operación a efectuar. Las opciones son
las siguientes:
6 1 Introducción a MATLAB.

’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

>> fprintf(archivo,’El numero es: %d\n’,a)

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.1.7. Guardar variables y sesiones.


Muchas veces se desea abandonar una sesión de MATLAB pero se desea volver a ella
más adelante. Los siguientes comandos nos permiten solucionar este problema y recuperar
la información que se ha acumulado en el workspace.
save, load. El primer comando nos permite guardar una sesión mientras que el segundo
nos permite cargar una que ya está guardada.
diary. Almacena en un archivo de texto especificado por el usuario lo que se va haciendo
en la sesión. Este comando funciona como sigue:
1.2 Funciones 7

>> diary nombre_archivo.txt


%...
>> diary off
%...
>> diary on
Ası́ “diary off” suspende la ejecución del comando mientras que “diary on” lo reanuda. Se
puede acceder al archivo de texto donde se guarda la sesión solamente cuando “diary” esta
en “off”.

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.

1.2.2. Funciones predefinidas.


MATLAB tiene varias funciones matemáticas predefinidas. Veamos algunas de las más
importantes.
sqrt. raı́z de un número real positivo.
cos, sin, tan. Representan las funciones trigónometricas seno, coseno y tangente.
max, min, sum, mean, sort. Estas funciones se aplican a un conjunto de valores que
generalmente son guardados como un vector (esto se vera en detalle en la proxima sesión).
El comando “max” nos entrega el maximo valor, “min” el mı́nimo, “sum” la suma de
todos los valores, “mean” el promedio y “sort” ordena los valores de menor a mayor. Ejemplo:

>> t=[1 23 3 -5 45];


>> sum(t)

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.

1.2.3. Gráfico de funciones.


El gráfico de una función es una herramienta muy importante en el analı́sis matemático.
Explicaremos brevemente los comandos que nos permiten realizar un gráfico.
plot. Este comando nos permite graficar un conjunto de datos de la forma (xi , yi ), i =
1, ..., n.. Para esto se debe trabajar con dos vectores, por ejemplo x e y, que contengan
la información del eje x e y respectivamente. Veamos como dibujar la función seno en el
intervalo [-10, 10] .

>> x=-10:0.1:10; y=sin(x);


>> plot(x,y);

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

>>xlabel(’eje x’); ylabel(’eje y’);

El tipo de lı́nea se determina con


Tipo de lı́nea Sı́mbolo
continua (por defecto) -
guiones --
puntueada :
guiones y puntos -.
Se pueden usar marcas especiales en vez de lı́neas mediante los códigos
Tipo de marca Sı́mbolo
punto .
más +
estrella *
cı́rculo o
marca x x
Podemos también especificar el color del trazado usando los siguientes codigos:
10 1 Introducción a MATLAB.

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.

1.2.4. Definición de polinomios.


La manera más simple de definir polinomios es a través de un conjunto de valores rea-
les que determinaran los coeficientes del polinomio, por ejemplo, los valores del vector “t”
definido anteriormente nos entregan el polinomio
t(x) = x4 + 23x3 + 3x2 − 5x + 45.
1.2 Funciones 11

1.2.5. Comandos para polinomios.


Describamos brevemente los comandos relacionados con el uso de los polinomios.
polyval. Permite evaluar un polinomio. Consideremos el vector “t” definido anteriormente.

>> polyval(t,0)

ans =

45

roots. Nos entrega las raı́ces del polinomio correspondiente.

>> roots(t)

ans =

-22.8554
-1.3873
0.6214 + 1.0164i
0.6214 - 1.0164i

polyder. Calcula la derivada de un polinomio. El resultado es un vector donde las com-


ponentes son los coeficientes del polinomio derivado.

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

Métodos Iterativos para Sistemas


Lineales.

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

El comando “diag” tiene dos funciones en dependencia si se aplica a un vector o a una


matriz. Si se aplica a un vector, este comando nos entrega una matriz diagonal, donde los
elementos de la diagonal son las componentes del vector.

>> x=[1 3 4]; diag(x)

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 5 Crear directamente la matriz utilizada en el cálculo de la spline cúbica asociada


a una malla de 51 puntos equiespaciados donde la distancia entre los puntos es igual a 1.
Esta matriz viene dada por  
2 1
1 4 1 
 
 .. 
 . 
 .. .
 . 
 
 1 4 1
1 2
Los espacios vacı́os son considerados con el valor 0 y el tamaño de la matriz es 50.

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.

>> A(:, [1 3])

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

2.1.2. Operaciones básicas sobre matrices.


MATLAB permite operar con las operaciones matriciales clásicas: + - * yˆ. Para realizar
estas operaciones se deben respetar las reglas matemáticas básicas sobre las dimensiones de
las matrices implicadas en estas operaciones.
Otro tipo de operaciones aritméticas que se pueden realizar sólo con matrices o vectores de
la misma dimensión son las llamadas “operaciones punto o componente a componente”. Como
su nombre lo dice, estas operaciones se realizan aritméticamente componente a componente,
obteniendo un resultado con la misma dimensión que los vectores o matrices a los cuales fue
aplicada la operación. Ejemplo:
>> y=[2 -1 4];
>> x.*y

ans =

2 -3 16

>> x.^y

ans =

1.0000 0.3333 256.0000

>> x./y

ans =

0.5000 -3.0000 1.0000


2.1 Matrices. 17

c) Comandos especiales para matrices.


Procederemos a describir brevemente algunos de los principales comandos matriciales en
MATLAB.
trace. Calcula la traza de una matriz.
det. Calcula el determinante de una matriz cuadrada.
size. Calcula el tamaño de una matriz.

>> size(A)

ans =

2 3

inv. Calcula la inversa de una matriz cuadrada no singular.


norm. Calcula la norma (inducida) a una matriz. Existe un segundo parámetro que nos
permite especificar la norma utilizada. Por defecto se usa la norma “2”, es decir, la norma
inducida euclidiana.

>> norm(A)

ans =

9.5080

>> norm(A,inf)

ans =

15

cond. Calcula el condicionamiento de una matriz.


pinv. Calcula la pseudo-inversa de una matriz. La pseudo-inversa existe para cualquier
matriz, incluso una que no sea cuadrada.

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

2.1.3. Factorización y descomposición matricial.


Revisaremos ciertos comandos asociados a descomposiciones y factorizaciones de matri-
ces.
chol. Realiza la descomposición de Choleski de una matriz definida positiva.
null. Devuelve una base ortonormal del subespacio nulo o “Kernel” de una matriz.
qr. Nos entrega la descomposición QR de una matriz.
orth. El resultado es una matriz cuyas columnas son una base ortonormal del espacio
generado por las columnas de la matriz a la cual es aplicada esta función.
eig. Calcula la descomposición espectral de una matriz. Ilustremos su uso.

>> C=A’*A;
>> [Q,D]=eig(C)

Q =

-0.4082 -0.8060 0.4287


0.8165 -0.1124 0.5663
-0.4082 0.5812 0.7039

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 =

27.0000 36.0000 45.0000


0 -0.6667 -1.3333
0 0 0

2.2. Métodos Iterativos para Sistemas Lineales.


En esta parte del curso presentaremos los distintos métodos iterativos para resolver
numéricamente el sistema lineal (en x)

Ax = b, (2.1)

donde la matriz cuadrada A ∈ Rn×n se asume invertible y b ∈ Rn es un vector columna.


Los métodos que serán presentados generan una sucesión de vectores xk , hasta que cierta
tolerancia del error sea satisfecha, o bien, un máximo de iteraciones sea excedido.
En estas notas no se discutirán los fundamentos matemáticos de estos métodos ya que se
asume que el lector los conoce.

2.2.1. Método de Jacobi.


Se sabe que este método siempre converge a una solución de (2.1), cualquiera sea el
punto inicial x0 y el vector lado derecho b, si la matriz A = (Ai,j ) es diagonal dominante por
columnas, es decir
Xn
|Ai,j | < |Ai,i | ∀j = 1, . . . , n. (2.2)
i=1, i6=j

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

%%%%%%%%%% Metodo de Jacobi %%%%%%%%%%%%%%%%%%

%%%%%%%%% Sistema a resolver %%%%%%%%%%%%%%%%%


A= [ ]; b= [ ];
% A y b deben ser ingresados por el usuario

%%%%%%%% Programa Principal %%%%%%%%%%%%%%%%%%

eps=1e-9; maxiter=100; iter=1;

n=lenght(A);
x0=round(10*rand(n,1)) %vector inicial
20 2 Métodos Iterativos para Sistemas Lineales.

error = norm(A*x0-b,inf); xk=x0;

while error >= eps

%%%%%%%%%%%%%%%% Regla de actualizacion (Jacobi) %%%%%%%%%%%%%%%%


for j=1:n
x(j)= ( b(j) -A(j,[1:j-1,j+1:n])*xk([1:j-1,j+1:n]) )/ A(j,j);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fprintf(’ Iteracion %1.0f \n’,iter);


xk=x’ % iteracion actual

error = norm(A*xk-b,inf);
% Se puede usar otra norma
% u otro tipo de error (ej. error relativo)

if iter <= maxiter


iter=iter+1;
else
fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end
end

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.

Ejercicio 9 Modificar la regla de actualización escribiendola en su forma matricial

xk+1 = MJ xk + B,

donde MJ = −D−1 (E + F ), B = D−1 b y la matriz A es reescrita como A = D + E + F con


D diagonal, E triangular superior (sin la diagonal) y F triangular inferior (sin la diagonal).
Indicación: Utilice los comandos “diag”, “triu” y “tril”.
2.2 Métodos Iterativos para Sistemas Lineales. 21

2.2.2. Método de Gauss-Seidel.


Este método asegura su convergencia a una solución de (2.1), cualquiera sea el punto
inicial x0 y el vector lado derecho b, si la matriz A = (Ai,j ) es diagonal dominante por filas,
es decir n
X
|Ai,j | < |Ai,i | ∀i = 1, . . . , n. (2.3)
j=1, j6=i

El esquema de este método es el mismo que el de Jacobi, y sólo se cambia la regla de


actualización de la iteración xk que se define en MATLAB como sigue:

%%%%%%%%%% Regla de actualizacion (Gauss-Seidel) %%%%%%%%%%%%%%%%


for j=1:n
if j==1
x(1)= ( b(1) -A(1,2:n)*xk(2:n) )/A(1,1);
elseif j==n
x(n)= ( b(n) -A(n,1:n-1)*x(1:n-1)’ )/A(n,n);
else
x(j)= ( b(j) -A(j,1:j-1)*x(1:j-1)’-A(j,j+1:n)*xk(j+1:n) )/A(j,j);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% x contiene la iteracion actual y xk la anterior
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Ejercicio 10 Al igual que en el ejercicio 7, agregar una rutina que advierta cuando la matriz
A no es diagonal dominante por filas.

2.2.3. Método de SOR o Relajación.


El método de SOR (Successive over-relaxation) o Relajación tiene el mismo esquema que
los métodos anteriores y sólo cambia su regla de actualización. Este método depende de un
parámetro w que mejora su convergencia. Matemáticamente, la regla de actualización es la
siguiente

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

Solución de Ecuaciones No Lineales.

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.

3.1. Métodos Gráficos.


La primera parte de esta sesión trata con métodos basados en una clara “motivación
gráfica”. Los fundamentos matemáticos de cada uno de ellos no serán discutidos ya que se
asumen conocidos por el lector, sólo se presentara el código en MATLAB del respectivo
método.

3.1.1. Método de la Bisección.


Este método esta en forma de procedimiento. El usuario debe ingresar la función f
utilizada en la ecuación (3.1), los primeros valores x0 y x1 donde la función f debe tener
distinto signo, y la tolerancia con que se desea resolver la ecuación (3.1).

%%%%% Ingresados por el usuario %%%%%%%%%%%%%%%


xo= ; x1= ; fname=’’; epsilon=1.e-6;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fx1 = feval(fname,x1); fxo = feval(fname,xo); maxiter = 50; iter =


1;

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

Ejercicio 12 Aplicar el método de la bisección a la función

f (x) := 10 + 2x + log(|x| + 1) − x2 . (3.2)

Para esto, cree esta función y luego dibujela para determinar los posibles puntos iniciales.

Ejercicio 13 Cambiar este procedimiento a modo de función.

3.1.2. Método de la Secante.


Al igual que en el método de la bisección enseñado anteriormente, el método de la secante
esta en forma de procedimiento en el cual el usuario debe ingresar la función f , la tolerancia
y los dos puntos iniciales x0 y x1 , donde la función puede ahora tener valores del mismo
signo. Veamos el código de este procedimiento.

%%%%% Ingresados por el usuario %%%%%%%%%%%%%%%


xo= ; x1= ; fname=’’; epsilon=1.e-6;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fx1 = feval(fname,x1); fxo = feval(fname,xo); maxiter = 50; iter =


1;

while abs(fx1) >= epsilon

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

Ejercicio 14 Cambiar este procedimiento a modo de función.

3.1.3. Método de Regula-Falsi.


El método de Regula-Falsi es una pequeña variante del método de la secante. En efecto,
la única diferencia entre ambos es el hecho que los dos puntos implicados en los cálculos
del método de Regula-Falsi deben satisfacer que la función f tenga distinto signo en estos
puntos. El usuario debe ingresar los mismos datos que en los métodos anteriores. El código
es el siguiente:

%%%%% Ingresados por el usuario %%%%%%%%%%%%%%%


xo= ; x1= ; fname=’’; epsilon=1.e-6;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

fx1 = feval(fname,x1); fxo = feval(fname,xo); maxiter = 50; iter =


1;

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

3.2. Método de Punto Fijo.


Los métodos de punto fijo se basan en una función g : R → R, la cual tiene un punto fijo
en x∗ solución de (3.1) (o raı́z), es decir, se satisface

g(x∗ ) = x∗ . (3.3)

Luego, las iteraciones xk generadas por el método se calculan de la siguiente manera:

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.

3.2.1. Implementación Método de Punto Fijo.


Escribamos el procedimiento de punto fijo donde el usuario debe ingresar las funciones f
y g utilizadas en las ecuaciones (3.1) y (3.3), respectivamente.

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

% iter : Numero de Particiones realizadas


%--------------------------------------------------------

fname=’ ’; gname=’ ’; epsilon=1.e-5;

maxiter = 2000; iter = 1; error=abs(feval(fname,xo));

while error >= epsilon

gxo=feval(gname,xo);
x1=gxo;
fx1=feval(fname,x1);

error=abs(x1-xo);%min(abs(x1-xo),abs(fx1)); abs(fx1);

fprintf(’ Iteracion %1.0f \n Aprox de la raiz


%1.8f Valor de la funcion %1.8e \n’,iter,x1,fx1);

if iter > maxiter


fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end

xo=x1;
iter=iter + 1;
end

Ejercicio 15 Se sabe que x∗ = 0 es raı́z de la función

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

3.2.2. Método de Newton.


El método de Newton es un método de punto fijo donde la iteración tiene una forma
partı́cular. Este es un método de una notable velocidad de convergencia (orden 2), que se ve
reflejada empı́ricamente.
El procedimiento utiliza la función f y su derivada f 0 las cuales deben ser ingresadas por
el usuario.

%=========================================================
% Metodo de Newton
%=========================================================
28 3 Solución de Ecuaciones No Lineales.

xo= ; fname=’ ’; fprima=’ ’; epsilon=1.e-9;

maxiter = 200; iter = 1; error=abs(feval(fname,xo));

while error >= epsilon

fxo=feval(fname,xo);
fpxo=feval(fprima,xo);
x1=xo-fxo/fpxo
fx1=feval(fname,x1)
error =abs(fx1); %abs(x1-xo);

fprintf(’ Iteracion %1.0f \n Aprox de la raiz


%1.8f Valor de la funcion %1.8e \n’,iter,x1,fx1);

if iter > maxiter


fprintf(’ Numero maximo de iteraciones excedido \n’);
break
end

xo=x1;
iter=iter + 1;
end

Ejercicio 16 Repetir el cálculo de la raı́z aproximada del ejercicio 15 con el método de


Newton.

3.2.3. Método de Newton Modificado.


Se sabe el método de Newton pierde su velocidad de convergencia cuadrática cuando
la función f tiene una raı́z múltiple en x∗ , esto quiere decir que f 0 (x∗ ) 6= 0. En estos ca-
sos se procede a modificar la iteración de Newton para recobrar esta buena velocidad de
convergencia. La iteración queda entonces de la siguiente forma:
xk+1 = xk − µ(xk )/µ0 (xk ) ∀k ≥ 1, (3.4)
donde x0 es el punto inicial ingresado por el usuario y la función µ(·) viene dada por
µ(x) := f (x)/f 0 (x).

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

3.2.4. Método de Newton en Varias Variables.


En esta última parte de esta sesión damos a conocer el método de Newton aplicado a la
ecuación (3.1) en el caso vectorial f : Rn → Rn y x ∈ Rn . El código fuente del método de
3.2 Método de Punto Fijo. 29

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;

y la salida del programa se modifica de la siguiente manera:

fx1 = feval(fname,x1);
error = norm(fx1); % norm(x1-xo); u otro error posible

fprintf(’ Iteracion %d \n Aprox de la raiz ’,iter);


x1
fprintf(’ Valor de la funcion ’);
fx1
30 3 Solución de Ecuaciones No Lineales.
CAPÍTULO 4

Interpolación y Aproximación de
Funciones.

4.1. Interpolación Polinomial.


En esta parte del curso supondremos que se tiene una malla de puntos (xi , yi ), i = 1, ..., n,
que se quiere “interpolar ” usando un polinomio p de grado n − 1. Al interpolar nos referimos
a que el polinomio debe cumplir que

p(xi ) = yi i = 1, ..., n.

Recordaremos los principales tipos de interpolación polinomial.

4.1.1. Polinomio de Lagrange.


El polinomio de Lagrange pL se define como sigue
n
X
pL (x) := yi Ln,i (x), (4.1)
i=1

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

% Construccion de los polinomios coeficientes de Lagrange

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

% Calculo de los coeficientes del polinomio interpolador de Lagrange


C=y*L

Ejercicio 18 Interpolar la función

f (x) = ex sin(x) − x − 1

en los puntos xi = −1 + (i − 1)/2, i = 1, ..., 5 usando el polinomio de Lagrange. Grafique el


polinomio de interpolación y la función f en el intervalo [−2, 2].

4.1.2. Diferencias Divididas.


El cálculo de las “diferencias divididas” es crucial para determinar el polinomio de Newton
que presentaremos en la proxima sección. Las diferencias divididas de una función f , para n
4.1 Interpolación Polinomial. 33

puntos x1 , ..., xn , se definen recursivamente como sigue:

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

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

4.1.3. Polinomio de Newton.


El polinomio pN de interpolación de Newton se define por

pN (x) := f [x1 ] + f [x1 , x2 ](x − x1 ) + f [x1 , x2 , x3 ](x − x1 )(x − x2 )+


. . . + f [x1 , ..., xn ](x − x1 )...(x − xn−1 ).

En el siguiente código fuente el usuario debe ingresar, al igual que en el polinomio de


Lagrange, los valores de la malla (xi , yi ), i = 1, ..., n, guardados en las variables vectoriales
x e y. Obviamente los valores yi corresponden a f (xi ).
El programa calcula la matriz D de diferencias divididas usando el código enseñado en
la sección anterior, y el polinomio de Newton.
Notemos que los elementos de la diagonal D(k, k) corresponden a los coeficientes f [x1 , ..., xk ],
para todo k = 1, ..., n, que aparecen en la definición del polinomio de Newton.
34 4 Interpolación y Aproximación de Funciones.

%=======================================================
% 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);

% Construccion de la tabla de diferencias divididas "D"

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

% Calculo del vector que contiene los coeficientes del polinomio


% interpolador de Newton, escrito de forma habitual en potencias
% decrecientes de x

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

4.1.4. Polinomio de Hermite.


En ciertos casos podemos tener información de la derivada de la función a interpolar,
digamos f 0 (xi ) para i = 1, ..., n. Ası́, el nuevo polinomio de interpolación debe ahora satisfacer
dos condiciones en cada punto xi :

p(xi ) = yi := f (xi ) y p0 (xi ) = yi0 := f 0 (xi ).


4.1 Interpolación Polinomial. 35

Un polinomio interpolador que satisface estas condiciones es el “polinomio de Hermite”.


Para calcular el polinomio de Hermite se puede proceder de dos maneras: una es similar
al cálculo del polinomio de Newton, pero se debe considerar la información entregada por la
derivada de f utilizando la siguiente definición en la tabla de diferencias divididas

f [xi , xi ] := f 0 (xi ) ∀i = 1, ..., n,

Una segunda manera consiste en expresar el polinomio de Hermite en función de los


polinomios coeficientes de Lagrange. Adoptaremos esta última forma que es más simple y
directa.
El polinomio de Hermite (que es de grado 2n − 1) se define como sigue
n
X n
X
pH (x) := yi hi (x) + yi0 ĥi (x), (4.4)
i=1 i=1

donde para todo i = 1, ..., n hemos introducido los polinomios

hi (x) := [1 − 2L0n,i (xi )(x − xi )](Ln,i (x))2 ,


(4.5)
ĥi (x) := (x − xi )(Ln,i (x))2 .

En lo que sigue utilizaremos la siguiente relación para evitar errores numéricos

hi (x) = (Ln,i (x))2 − 2L0n,i (xi )ĥi (x). (4.6)

Ası́ consideraremos un procedimiento que nos entrega 3 matrices L, H y H2 cuyas filas


corresponden a los polinomios coeficientes de Lagrange, y los polinomios hi y ĥi involucrados
en la definición del polinomio de Hermite. La salida principal es un vector C que representa
el polinomio de Hermite.
Antes de presentar el procedimiento que genera el polinomio de Hermite, debemos intro-
ducir una funciona que nos permita sumar polinomios que estés escirtos en formato vectorial.
La principal dificultad se presenta aquı́ cuado los polinomios son de distinto grado, y luego
los vectores que los representan son de distinta dimensión, haciendo imposible sumarlos con
la suma vectorial. Esta función fue llamada “plus pol ” y su código es el siguiente:

function r = plus_pol(p,q)

k = length(q) - length(p); r = [zeros(1,k) p] + [zeros(1,-k) q];

Veamos ahora el código asociado al polinomio de Hermite.

%===============================================================
% 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.

% yp : Vector que contiene la lista de las derivadas


%---------------------------
% Variables de Salida
%-------------------------
% C : Vector que contiene los coeficientes del polinomio
% interpolador de Hermite
% L : Matriz que contiene los coeficientes de los
% polinomios coeficientes de Lagrange
% H,H2 : Matrices que contienen los coeficientes de los
% polinomios coeficientes de Hermite
%-------------------------------------------------------------------

x= ; y= ; yp= ;

N=length(x); L=zeros(N,N);

% Construccion de los polinomios coeficientes de Lagrange

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

% Construccion de los polinomios coeficientes de Hermite

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

% Calculo de los coeficientes del polinomio interpolador de Lagrange


% usando suma de polinomios "plus_pol"

C=plus_pol(y*H, yp*H2)

Ejercicio 19 Repetir la interpolación del ejercicio 18 usando el polinomio de Hermite. Para


esto, cálcule los valores f 0 (xi ).
4.2 Interpolación por pedazos y aproximación de funciones. 37

4.2. Interpolación por pedazos y aproximación de fun-


ciones.
En una primera parte de esta sesión supondremos que se tiene una malla de puntos
(xi , yi ), i = 1, ..., n, que se quiere “interpolar ” usando un polinomio p de grado n − 1. Al
interpolar nos referimos a que el polinomio debe cumplir que

p(xi ) = yi i = 1, ..., n.

Describiremos los comandos internos de MATLAB asociados con la interpolación polino-


mial. Luego estudiaremos la “spline cúbica”.
En una segunda parte, estudiaremos la aproximación de funciones via mı́nimos cuadrados
discretos.

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)

4.2.2. Spline Cúbica.


En esta parte nos avocaremos al uso del comando spline de MATLAB y a los comandos
asociados con el manejo de polinomios lineales por pedazos.
Recordemos que la spline cúbica es una función continua que interpola la malla (xi , yi ), i =
1, ..., n, y cuya principal caracterı́stica es ser un polinomio cúbico (de grado 3) en cada in-
tervalo [xi , xi+1 ].
38 4 Interpolación y Aproximación de Funciones.

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

>> [BREAKS,COEFS,L,K,D] = unmkpp(P)

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.

Ejercicio 20 Interpolar la función

f (x) = ex sin(x) − x − 1

en los puntos xi = −1 + (i − 1)/2, i = 1, ..., 5 usando la función de spline cúbica . Grafique


el polinomio de interpolación y la función f en el intervalo [−2, 2].

4.2.3. Mı́nimos cuadrados discretos.


En esta parte permitiremos que el polinomio que obtendremos no interpole la malla de
puntos (xi , yi ). Ası́, buscaremos un polinomio de un grado m determinado por el usuario que
minimice el criterio de mı́nimos cuadrados:
n
X
mı́n (Pm (xi ) − yi )2 , (4.7)
c1 ,...,cm+1
i=1
4.2 Interpolación por pedazos y aproximación de funciones. 39

donde el polinomio resultante es

Pm (x) := c1 + c2 x + ... + cm+1 xm .

Este problema de optimización nos lleva a resolver un sistema lineal

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

Este sistema lineal se conoce como “ecuaciones normales”.


Veamos el código que genera el polinomio de grado m que resuelve (4.7).

% Aproximacion polinomial minimos cuadrados


%-------------------------------------------
% Datos
% x : vector con las abscisas
% y : vector con las ordenadas
% m : grado del polinomio
%-------------------------------------------
% Salida
% c : vector polinomio de aproximacion en
% potencias decrecientes
%-------------------------------------------
x= ; y= ; m= ;

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.

La función flipud simplemente invierte el orden de los coeficientes del vector c.

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

Ejercicio 23 Modificar el código anterior de manera que resuelva el problema de mı́nimos


cuadrados ponderados:
Xn
mı́n pi (Pm (xi ) − yi )2 , (4.10)
c1 ,...,cm+1
i=1

donde los pesos vienen dados por los coeficientes pi > 0.


CAPÍTULO 5

Integración Numérica.

En esta sesión estudiaremos fórmulas númericas para aproximar la integral de cierta


función escalar f , dada por
Z b
f (x)dx, (5.1)
a

donde a y b son valores reales.


Los métodos que veremos a continuación consisten en una fórmula de cuadrátura dada
por
Xn
I(f ) := ci f (xi ), (5.2)
i=1

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 .

5.1. Métodos Simples.


5.1.1. Método del Trapecio simple.
El método del Trapecio simple consiste en usar sólo dos puntos, x1 = a y x2 = b, de la
manera siguiente:
b−a
IT (f ) := (f (a) + f (b)).
2

5.1.2. Método de Simpson simple.


El método de Simpson simple utiliza tres puntos, x1 = a, x2 = (a + b)/2 y x2 = b,
obteniendo
b−a
IS (f ) := (f (a) + 4f ((a + b)/2) + f (b)).
3

41
42 5 Integración Numérica.

Ejercicio 24 Calcular la integral de la función


f (x) = |x|ex
entre los puntos a = −1 y b = 1, usando los métodos de Trapecio y Simpson simples.

5.2. Métodos Compuestos.


Los métodos compuestos consisten en dividir el intervalo [a, b] en M subintervalos [xi , xi+1 ]
usando M +1 puntos equiespaciados xi = a+(i−1)h, donde i = 1, ..., M +1 y h := (b−a)/M ,
para luego aplicar un método simple de integración a cada intervalo [xi , xi+1 ].
El entero positivo M es ingresado por el usuario y determina el grado de precisión con
el cual se calculará la aproximación dada en (5.2).

5.2.1. Método del Trapecio compuesto.


El método del Trapecio compuesto consiste en aplicar la regla del Trapecio simple a cada
intervalo [xi , xi+1 ]. De esta forma se obtiene la fórmula
X M
h
IT C (f ) := (f (a) + f (b)) + h f (xi ), (5.3)
2 i=2

donde h = (b − a)/M y xi = a + (i − 1)h para i = 1, ..., M + 1.


Implementemos la regla (5.3) como una función:

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;

5.2.2. Método de Simpson compuesto.


El método de Simpson compuesto consiste en aplicar la regla de Simpson simple a cada
intervalo [xi , xi+1 ].
Notese que para este método la distancia h a utilizar corresponde a h = (b − a)/2M dado
que se utiliza tres puntos en cada intervalo: xi , xi+1 y su promedio (xi + xi+1 )/2, en lugar
de dos como en el método de Trapecio.
Implementaremos este método también como una función.
5.2 Métodos Compuestos. 43

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

[dJRB01] J. Garcı́a de Jalón, J. I. Rodrı́guez, and A. Brazález. Aprenda MATLAB 6.1


como si estuviera en primero. Escuela Técnica Superior de Ingenieros Industriales.
Universidad Politécnica de Madrid., Octubre 2001.

[MF00] J. H. Mathews and K. D. Fink. Métodos Numéricos con MATLAB. Prentice Hall,
Madrid, 2000. Tercera edición.

[SB80] J. Stoer and R. Bulirsch. Introduction to Numerical Analysis. Springer-Verlag,


1980.

[Var00] M. L. Varas. Introducción al Cálculo Numérico. Departamento de Ingenierı́a


Matemática, Fac. de Cs. Fı́sicas y Matemáticas, Universidad de Chile, Marzo
2000.

45

You might also like