Apuntes HI-1
Apuntes HI-1
Apuntes HI-1
Paco Arandiga
Índice general
1
ÍNDICE GENERAL 2
3. Cálculo simbólico 59
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.2. Definiendo variables simbólicas . . . . . . . . . . . . . . . . . . . . 61
3.3. Expresiones y ecuaciones simbólicas . . . . . . . . . . . . . . . . . . 62
3.3.1. Substituciones . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.3.2. Qué variables simbólicas hay en F? . . . . . . . . . . . . . . 64
3.4. Resolución de ecuaciones . . . . . . . . . . . . . . . . . . . . . . . . 65
3.5. La función inline . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.5.1. Operadores relacionales y lógicos . . . . . . . . . . . . . . . 68
3.5.2. La función inline . . . . . . . . . . . . . . . . . . . . . . . . 69
3.6. Dominios, límites y continuidad . . . . . . . . . . . . . . . . . . . . 72
3.6.1. Cálculo de límites: Límites laterales. . . . . . . . . . . . . . . 74
3.6.2. Continuidad de funciones . . . . . . . . . . . . . . . . . . . 76
3.7. Simplificadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.8. Cálculo de derivadas. . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.9. Aplicaciones de la derivada: Máximos-mínimos-Puntos de Inflexión.
Optimización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
3.10. Cálculo integral e integración numérica . . . . . . . . . . . . . . . . 93
3
1.1. PROGRAMACIÓN EN MATLAB 4
A = [1 2 3; 4 5 6; 7 8 9]
y
1.1. PROGRAMACIÓN EN MATLAB 5
A = [
1 2 3
4 5 6
7 8 9 ]
crea la matriz 3×3 que se espera y la asigna a una variable A. Inténtelo. Los elementos
en una fila de una matriz pueden separarse tanto por comas como por espacios en
blanco.
Cuando alguno de los números se escribe en forma exponencial (por ejemplo
2.34e-9), deben evitarse los espacios en blanco. La escritura de una matriz grande
debe hacerse preferentemente en un archivo .m, donde es más sencillo corregir errores
(ver secciones 1.1.8 y 1.1.10)).
Las funciones internas rand, magic, y hilb, por ejemplo, proporcionan una for-
ma sencilla para crear matrices con las que experimentar. La instrucción rand(n),
resp. rand(m,n), creará una matriz n × n, resp. m × n, con entradas aleatoria-
mente generadas, distribuidas uniformemente entre 0 y 1. magic(n) creará una ma-
triz cuadrada mágica (las filas y las columnas suman la misma cantidad) con entradas
enteras; hilb(n) creará la matriz de Hilbert de orden n, la reina de las matrices mal
condicionadas. m y n, por supuesto, denotan enteros positivos. También se pueden
crear matrices utilizando bucles for (ver sección 1.1.6). Inténtelo.
Las entradas individuales de una matriz o de un vector se pueden obtener poniendo
los índices entre paréntesis de la forma usual. Por ejemplo, A(2, 3) denota la entrada en
la segunda fila y tercera columna de la matriz A y x(3) denota la tercera coordenada
del vector x. Inténtelo. Sólo se pueden usar como índices de vectores y de matrices
enteros positivos.
>> x=A\b
es la solución de A ∗ x = b y, resp.,
>> x=A/b
es la solución de x ∗ A = b.
En la división izquierda, si A es cuadrada, se factoriza utilizando eliminación gaus-
siana. Con los factores se resuelve A ∗ x = b. Si la matriz A no es cuadrada, se fac-
toriza utilizando la ortogonalización de Householder con pivoteo de columnas. Con
los factores se resuelve el sistema indeterminado o sobredeterminado en el sentido
de los mínimos cuadrados. La división derecha se define a partir de la izquierda por
b/A = (A0 \b0 )0 .
Operaciones a coordenadas. Las operaciones de adición y sustracción operan
intrínsecamente a coordenadas pero las otras operaciones matriciales dadas antes no:
Son operaciones matriciales. Es importante observar que para estas otras operaciones,
∗, ˆ, \, y /, puede hacerse que operen a coordenadas precediendolas de un punto. Por
ejemplo, tanto
>> [1,2,3,4].*[1,2,3,4]
como
>> [1,2,3,4].^2
darán
>> [1,4,9,16]
A ans
Para ver el tamaño de las variables hemos de escribir whos y aparecerá:
Name Size Bytes Class
A 2x2 32 double
ans 1x1 8 double
Cada elemento de una matriz real requiere 8 bytes de memoria.
Escribiendo what aparecerá
M-files in the current directory /home/paco/manual/matlab
esto es, todas *.m files (que ya explicaremos más adelante en que consisten) que ten-
emos en el directorio en el que estamos trabajando. Hay otros comandos que tambien
se pueden ejecutar directamente desde MATLAB como cd, ls, mkdir, etc.
Para eliminar una variable de la memoria se utiliza la instrucción clear nom-
bre_variable. Si se escribe sólo clear se borran todas las variables no permanentes.
La variable permanente eps (épsilon) da la precisión de la máquina—alrededor de
−16
10 en la mayoría de ellas. Es útil para determinar la tolerancia en procesos itera-
tivos.
1.1. PROGRAMACIÓN EN MATLAB 8
Cualquier tipo de cálculo, gráfico, o impresión puede detenerse sin salir del pro-
grama con CTRL-C (CTRL-BREAK en PC).
Almacenamiento de sesiones. Cuando salimos de MATLAB se pierden todas las
variables. Para evitarlo se puede utilizar la instrucción save antes de salir. Esto hace
que las variables se almacenen en el archivo de disco matlab.mat. Al acceder de
nuevo a MATLAB, se pueden recuperar todas las variables con la instrucción load.
Con diary se pueden salvar los datos en un fichero que despues se puede editar.
Habria que escribir
>> diary nom
>>
.
.
.
>>
>>diary off
y todo lo que hace entre diary nom y diary off queda archivado en un fichero
ASCII llamado nom.
Al terminar, se puede editar el archivo como se desee.
Con save name podemos salvar datos en un fichero binario llamado name.dat.
Los datos almacenados aquí pueden ser recuperados con load. Si queremos salvar los
datos en formato ASCII lo podemos hacer de la forma siguiente: manera:
>> A=rand(4,2);
>> save enter.dat A -ascii
que crea un fichero llamado enter.dat que contiene
3.4119357e-01 7.2711322e-01 8.3849604e-01 3.7041356e-01
5.3407902e-01 3.0929016e-01 5.6807246e-01 7.0273991e-01
Una vez que se ordena un formato, se mantiene hasta que se ordena un cambio.
La orden format compact evitará la mayor parte de las líneas en blanco, con
lo que se puede mostrar más información en pantalla. Es independiente de las demás
instrucciones de formato.
1.1. PROGRAMACIÓN EN MATLAB 9
Ejercicio 1.1.1. Calcular A=rand(4,2) y ver como queda en cada uno de los for-
matos anteriores.
Por ejemplo, zeros(m,n) produce una matriz nula m×n, y zeros(n) produce
otra cuadrada de orden n; si A es una matriz, entonces zeros(A) produce una matriz
de ceros del mismo orden que A.
Si x es un vector, diag(x) es la matriz diagonal con x en su diagonal; si A es
una matriz cuadrada, diag(A) es un vector formado por la diagonal de A. ¿Qué será
entonces diag(diag(A))? Inténtelo.
Las matrices se pueden construir por bloques. Por ejemplo, si A es 3 × 3, entonces
Funciones escalares
Funciones vectoriales
Otras funciones de MATLAB operan fundamentalmente sobre vectores (fila o colum-
na), aunque también pueden operar sobre matrices m × n (m ≥ 2) haciendolo en este
caso columna a columna, produciendo, por tanto, un vector fila que contiene el resul-
tado de su aplicación a cada columna. Para conseguir que actúen por filas basta usar la
traspuesta; por ejemplo, mean(A’)’. Veamos algunas de estas funciones:
Funciones matriciales
Las funciones matriciales más útiles de MATLAB son las siguientes:
size tamaño
eig autovalores y autovectores
chol factorización de Cholesky
svd descomposición en valores singulares
inv inversa
lu factorización LU
qr factorización QR
hess forma de Hessenberg
schur descomposición de Schur
rref forma escalonada reducida por filas
expm matriz exponencial
sqrtm matriz raíz cuadrada
poly polinomio característico
det determinante
norm norma 1, norma 2, norma de Frobenius, norma ∞
cond número de condición en la norma 2
rank rango
>> x = [];
>> for i = 1:n
>> x = [x, i^2]
>> end
dará el mismo vector en orden inverso. Pruebe con ellas. Las instrucciones
Las instrucciones se repetirán mientras la relación sea cierta. Por ejemplo, dado un
número a, las instrucciones siguientes calculan y muestran el menor entero no negativo
n tal que 2n ≥ a:
>> n = 0;
>> while 2^n < a
>> n = n + 1;
>> end
>> n
1.1. PROGRAMACIÓN EN MATLAB 12
>> if n < 0
>> paridad = 0;
>> elseif rem(n,2) == 0
>> paridad = 2;
>> else
>> paridad = 1;
>> end
Si sólo tenemos dos ramificaciones podemos omitir, desde luego, la porción correspon-
diente a elseif.
Relaciones. Los operadores relacionales en MATLAB son
< menor que
> mayor que
<= menor o igual que
>= mayor o igual que
== igual
∼= no igual.
Hagamos notar que se usa “=” en las asignaciones mientras que para las relaciones se
usa “==”. Las relaciones pueden conectarse o cuantificarse por los operadores lógicos
& y
| o
∼ no.
Cuando se aplica a matrices del mismo orden, una relación entre ellas da lugar a
una matriz de ceros y unos, dando el valor de la relación entre las correspondientes
entradas.
Cuando se utiliza una relación entre matrices en un bucle while o if, la relación
se entiende verdadera si cada una de las entradas de la matriz de relación es no nula.
Por tanto, si se quiere ejecutar algo cuando las matrices A y B sean iguales, se puede
escribir:
if A == B
algo
end
pero si se desea ejecutar la misma instrucción si A y B son distintas, hay que recurrir
a:
if any(any(A ~= B))
algo
end
o, más simplemente,
if A == B else
algo
end
if A ~= B, algo, end
no hará lo que deseamos ya que la instrucción sólo se ejecutará si todas las entradas
de A son distintas de las de B. Las funciones any y all pueden utilizarse de forma
creativa para reducir relaciones entre matrices a relaciones entre vectores y escalares.
Se requieren dos anys en el ejemplo anterior ya que any es un operador vectorial (ver
sección 1.1.6).
>> 0.2:0.2:1.2
da como resultado
>> [0.2 0.4 0.6 0.8 1.0 1.2]
mientras que con
>> 5:-1:1
se obtiene el vector
>> [5 4 3 2 1]
Las siguientes instrucciones, por ejemplo, generarán una tabla de senos. Pruebe.
>> x = [0.0:0.1:2.0]’;
>> y = sin(x);
>> [x y]
Hagamos notar que al operar sin a coordenadas, produce un vector y a partir de x.
La notación de dos puntos permite acceder a submatrices. Por ejemplo, A(1:4,3)
es el vector columna con las cuatro primeras entradas de la tercera columna de A.
Dos puntos sin más especificación denotan una fila o columna completa: A(:,3)
es la tercera columna de A, y A(1:4,:) son las cuatro primeras filas.
Se pueden usar como índices vectores enteros arbitrarios: A(:,[2 4]) está
formada por las columnas segunda y cuarta de A.
Estos índices se pueden usar a ambos lados de una instrucción de asignación:
A(:,[2 4 5]) = B(:,1:3) reemplaza las columnas 2, 4 y 5 de A por las
tres primeras de B. Se muestra y asigna la matriz A alterada completa. Pruebe.
Las columnas 2 y 4 de A pueden multiplicarse por la derecha por una matriz 2 × 2:
>> A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]
Ejercicio 1.1.4. Dado
>> A=round(10*rand(4,5))
calcular
>> A(1:4,3)
>> A(:,3)
>> A(1:4,:)
>> A(:,[2 4])
>> B; A(:,[2 4 5]) = B(:,1:3)}
>> A(:,[2,4]) = A(:,[2,4])*[1 2;3 4]
Si denotamos por x un vector con n componentes, ¿cuál es el efecto de la instruc-
ción x = x(n:-1:1)? Haga la prueba.
Para comprobar la utilidad de esta notación, comparar estas instrucciones de MAT-
LAB con una rutina de Pascal, FORTRAN, o C que dé los mismos resultados.
1.1. PROGRAMACIÓN EN MATLAB 15
1.1.11. Archivos .m
MATLAB puede ejecutar una sucesión de instrucciones almacenadas en archivos
de disco. Estos archivos se denominan “archivos .m", debido a que su sufijo debe ser
“m". Gran parte del trabajo con MATLAB será el de crear y refinar archivos .m.
Hay dos tipos de archivos .m: archivos de instrucciones y archivos de funciones.
Archivos de instrucciones. Un archivo de instrucciones consiste en una suce-
sión de instrucciones normales de MATLAB. Si tuviéramos un archivo denominado
nombre.m, las instrucciones del archivo pueden ser ejecutadas sin más que escribir
la instrucción nombre. Las variables en un archivo de instrucciones son globales y,
por tanto, cambiarán los valores del espacio de trabajo.
Los archivos de instrucciones son utilizados a menudo para introducir datos en una
matriz grande. En un archivo de este tipo es bastante sencillo corregir los errores sin
tener que repetir todo el trabajo. Si, por ejemplo, se escribe en el archivo datos.m
A = [
1 2 3 4
5 6 7 8
];
function a = ental(m,n,a,b)
%ENTAL Matriz entera generada aleatoriamente.
% ental(m,n) produce una matriz mxn con entradas
% enteras entre 0 y 9
% ental(m,n,a,b) produce las entradas de la matriz entre a y b.
if nargin < 3, a = 0; b = 9; end
a = floor((b-a+1)*rand(m,n))+a;
1.1. PROGRAMACIÓN EN MATLAB 17
los cuadrados de las entradas de x, que sum es una función vectorial (sección 1.1.6),
que sqrt es una función escalar (sección 1.1.7), y que la división en sum(x)/m
opera una matriz con un escalar.
La siguiente función, que da el máximo común divisor de dos enteros vía el algo-
ritmo de Euclides, ilustra el uso de un mensaje de error (ver sección siguiente).
function a = mcd(a,b)
% MCD Máximo común divisor
% mcd(a,b) es el máximo común divisor de a y b no nulos a la vez.
a = round(abs(a)); b = round(abs(b));
if a == 0 & b == 0
error(’El mcd no está definido si ambos números son nulos’)
else
while b ~= 0
r = rem(a,b);
a = b; b = r;
end
end
MATLAB esta preparado pera hacer operacions con matrices y vectores más rápido
que si las programaramos como lo haríamos si no existieran esas operaciones directas.
Así, es conveniente vectorizar el algoritmeo al máximo en las M-filas pera obtener
algoritmos más rápidos. Siempre que sea posible hay que convertir secuencias for y
while en operaciones matriciales o vectoriales. Por ejemplo, es equivalente calcular
>> i=0;
>> for t=0:0.001:10;
>> i=i+1;
>> y(i)=sin(t);
>> end
que
>> t=0:0.001:10;
>> y=sin(t);
A pesar de que en MATLAB no es necesario predimensionar los vectores a veces
puede ser conveniente hacerlo. Si no se pre-dimensionan, MATLAB redimensiona los
vectores cada paso de la iteración. Esto se elimina predimensionando y, de esta forma,
lo calcula mas ràpidamente. Para predimensionar (hay que saber la dimensión que
tendrà el vector y) hay que hacer y=zeros(1,10001).
Ejercicio 1.1.5. Comparar la diferencia, en tiempo computacional, de ejecutar los dos
programas anteriores para evaluar y=sin(t) sin tener los vectores predimension-
ados (hacer clear t y previamente) y ejecutarlos despues de haberlos predimen-
sionado previamente (t=zeros(1,10001);y=t;.
1.1. PROGRAMACIÓN EN MATLAB 19
function C=prod2(A,B)
%Producto de la matrices A y B
[n,m]=size(A);
[p,q]=size(B);
for i=1:n
for j=1:q
C(i,j)=A(i,:)*B(:,j);
end
end
function C=prod3(A,B)
%Producto de la matrices A y B
[n,m]=size(A);
for i=1:n
C(i,:)=A(i,:)*B(:,:);
end
function C=prod3(A,B)
%Producto de la matrices A y B
C(:,:)=A(:,:)*B(:,:); %Aco es equivalent a C=A*B;
1.1. PROGRAMACIÓN EN MATLAB 20
Si la matriz tiene una estructura especial podemos aprovecharla para hacer menos
operaciones. Por ejemplo, si queremos evaluar C = A ∗ B con
A11 0 B11 0
A= ; B= (1.1)
0 A22 0 B22
siendo A11, A22, B11 y B22 matrices de dimensión n × n, con cualquiera de las
funciones prod anteriores estaríamos muchas veces multiplicando por cero y, por
tanto, haciendo operaciones no necesarias. Obtendríamos el mismo resuldo haciendo
[n,m]=size(A11);
C=[A11*B11, zeros(n);zeros(n),A22*B22];
pero con muchas menos operaciones.
Ejercicio 1.1.6. Dadas las matrices
>> A11=hilb(20); A22=magic(20); B11=pascal(20); B22=rand(20);
(utilizar el comando help para ver que matrices hemos obtenido), queremos evaluar
(1.1), hacerlo utilizando las distintas alternativas. Calcular el tiempo necesario para
cada una de las alternativas (Utilizar las funciones de MATLAB ETIME, TIC, TOC,
CLOCK i/o CPUTIME) y compararlos.
1.1.12. Gráficos
MATLAB puede producir gráficos planos y gráficos de malla de superficies tridi-
mensionales. Para ver algunas de sus posibilidades escriba plot demo.
Gráficos planos. La instrucción plot crea gráficos en el plano XY; si x e y son
vectores de la misma longitud, la orden plot(x,y) accede a la pantalla gráfica y
realiza un gráfico plano de los elementos de x contra los elementos de y. Por ejem-
plo, podemos dibujar la gráfica de la función seno sobre el intervalo [−4, 4] con las
instrucciones siguientes:
Inténtelo. El vector x es una partición del dominio con paso 0.01 mientras que y
es un vector (sin es vectorial) con los valores que toma el seno en los nodos de esta
partición.
Para volver a la pantalla alfanumérica desde la gráfica, se pulsa cualquier tecla. Por
el contrario, para acceder a la pantalla gráfica, se usa la orden shg (show graph). Si
su máquina soporta ventanas múltiples con una ventana gráfica aparte, puede desear
mantener la ventana gráfica expuesta —aunque a un lado— y la ventana alfanumérica
activa.
2
Como un segundo ejemplo, puede dibujar la gráfica de y = e−x sobre el intervalo
[−1,5, 1,5] como sigue:
1.1. PROGRAMACIÓN EN MATLAB 21
Hagamos notar que ˆ está precedido por un punto para asegurarnos que opera a
coordenadas (ver sección 1.1.2).
Pueden hacerse también gráficos de curvas definidas paramétricamente. Por ejem-
plo,
>> x=0:.01:2*pi;y1=sin(x);y2=sin(2*x);y3=sin(4*x);
>> plot(x,y1,x,y2,x,y3)
Otra forma es con hold. El comando hold congela la pantalla gráfica actual de forma
que los gráficos posteriores se sobreimponen en ella. Escribiendo hold de nuevo se
libera el hold. Los comandos hold on y hold off también se pueden utilizar.
Se pueden evitar los tipos de línea y de punto por defecto. Por ejemplo,
produce líneas a trazos y de puntos para las dos primeras, mientras que para la tercera
se obtiene el símbolo + en cada nodo. Los tipos de líneas y de puntos son:
Tipos de línea: sólido (-), a trazos (-). puntos (:), punto y trazo (-.)
Tipos de puntos: punto (.), más (+), estrella (*), círculo (o), equis (x) Ver help
plot para los colores de las líneas y puntos.
El comando subplot se usa para dividir la pantalla de forma que puedan verse
hasta cuatro gráficos a la vez. Ver help subplot.
Gráficos de malla de superficies tridimensionales. Los gráficos de malla de su-
perficies tridimensionales se hacen con la función mesh. La instrucción mesh(z)
crea un gráfico tridimensional en perspectiva de la matriz z. La superficie de malla
está definida por las coordenadas z de los puntos sobre un cuadriculado rectangular en
el plano XY. Por ejemplo, pruebe con mesh(eye(10)).
Para dibujar la gráfica de una función z = f (x, y) sobre un rectángulo, se definen
en primer lugar los vectores xx e yy que dan particiones de los lados del rectángulo.
Con la función meshdom (mesh domain) se crea una matriz x, en la que cada fila es
igual a xx, y de igual forma una matriz y, con todas sus columnas iguales a yy, como
sigue: [x,y] = meshdom(xx,yy); Entonces se computa la matriz z, obtenida
evaluando f entrada a entrada sobre las matrices x e y, para aplicarle la función mesh.
2 2
Se puede, por ejemplo, dibujar la gráfica de z = e−x −y sobre el cuadrado [−2, 2]×
[−2, 2] como sigue (inténtelo):
>> xx = -2:.1:2;
>> yy = xx;
>> [x,y] = meshdom(xx,yy);
>> z = exp(-x.^2 - y.^2);
>> mesh(z)
Se podría, desde luego, cambiar las tres primeras líneas en lo anterior por
>> [x,y] = meshdom(-2:.1:2, -2:.1:2);
Para más detalles sobre mesh, ver la Guía del usuario.
Consulte la ayuda para plot3, mesh, y surf.
1.1.13. Consulta
Hay muchas características de MATLAB que no pueden incluirse en estas notas
introductorias. Mostraremos a continuación algunas de las funciones disponibles en
MATLAB, agrupadas por áreas (Fuente: MATLAB User’s Guide, versión 3.5.). Use la
instrucción help o consulte la Guía del usuario para una información más detallada
sobre las funciones.
Hay muchas funciones aparte de estas. Existen, en particular, varias “cajas de he-
rramientas” de funciones para áreas específicas; entre ellas, las de proceso de señales,
teoría de control, control robusto, identificación de sistemas, optimización, splines,
1.1. PROGRAMACIÓN EN MATLAB 23
G ENERAL
help ayuda
demo demostraciones
who muestra variables en memoria
what muestra archivos .m en el disco
size número de filas y columnas
length longitud de un vector
clear limpia el espacio de trabajo
computer tipo de computadora
ˆC interrupción local
exit salida de MATLAB
quit lo mismo que exit
C ARACTERES ESPECIALES
= instrucción de asignación
[ usado para formar vectores y matrices
] ver [
( precedencia aritmética
) ver (
. punto decimal
... la instrucción continúa en la siguiente línea
, separa índices y argumentos de función
; acaba filas, suprime la impresión
% comentarios
: indexación, generación de vectores
! ejecuta instrucción del sistema operativo
VALORES E SPECIALES
ans respuesta cuando no se asigna la expresión
eps precisión
pi π
√
i, j −1
inf ∞
NaN No Número (Not-a-Number)
clock reloj de pared
date fecha
nargin número de argumentos de entrada de una función
nargout número de argumentos de salida de una función
A RCHIVOS DE DISCO
chdir cambiar de directorio
delete borrar archivo
diary diario de la sesión
dir directorio de archivos en el disco
load cargar variables de un archivo
save guardar variables en un archivo
type mostrar función o archivo
what mostrar archivos .m en el disco
fprintf escribir en un archivo
pack compactar memoria vía save
1.1. PROGRAMACIÓN EN MATLAB 25
M ATRICES E SPECIALES
compan compañera
diag diagonal
eye identidad
gallery esotérica
hadamard Hadamard
hankel Hankel
hilb Hilbert
invhilb inversa de Hilbert
linspace vectores igualmente espaciados
logspace vectores logarítmicamente espaciados
magic mágica cuadrada
meshdom dominio para puntos de malla
ones constante
pascal Pascal
rand elementos aleatorios
toeplitz Toeplitz
vander Vandermonde
zeros cero
M ANIPULACIÓN DE MATRICES
rot90 rotación
fliplr invierte el orden de las columnas
flipud invierte el orden de las filas
diag diagonal
tril parte triangular inferior
triu parte triangular superior
reshape reordena una matriz en otra
.’ traspuesta
: convierte una matriz en una columna simple; A(:)
C ONTROL DE F LUJO
if ejecuta instrucciones condicionalmente
elseif usado con if
else usado con if
end termina if, for, while
for repite instrucciones un número de veces
while repite instrucciones mientras una sentencia lógica sea verdadera
break sale de los bucles for y while
return salida desde funciones
pause pausa hasta que se pulse una tecla
P ROGRAMACIÓN Y ARCHIVOS . M
input obtiene números desde el teclado
keyboard llamada al teclado como si fuera un archivo .m
error muestra mensaje de error
function define función
eval evalúa un texto en variables
feval evalúa función dada por una cadena
echo permite mostrar las instrucciones en pantalla
exist comprueba si las variables existen
casesen sensibilidad a las mayúsculas
global define variables globales
startup archivo de inicialización
getenv accede a una variable de entorno
menu genera un menú
etime tiempo gastado
T EXTO Y C ADENAS
abs convierte cadena en valores ASCII
eval evalúa texto como instrucciones
num2str convierte números en cadenas
int2str convierte enteros en cadenas
setstr indicador de cadenas
sprintf convierte números en cadenas
isstr detecta variables de cadena
strcomp compara variables de cadena
hex2num convierte cadenas hexadecimales en números
1.1. PROGRAMACIÓN EN MATLAB 27
V ENTANA ALFANUMÉRICA
clc limpia pantalla
home mueve cursor al comienzo
format establece el formato de salida
disp muestra matriz o texto
fprintf imprime número formateado
echo permite la muestra de las instrucciones
G RÁFICOS
plot gráfico lineal en el plano XY
loglog gráfico logarítmico en el plano XY
semilogx gráfico semilogarítmico
semilogy gráfico semilogarítmico
polar gráfico polar
mesh superficie de malla tridimensional
contour plano de contornos
meshdom dominio para gráficos de superficie
bar gráficos de barras
stairs gráficos de escaleras
errorbar añade barras de errores
A NOTACIÓN G RÁFICA
title título
xlabel anotación en el eje x
ylabel anotación en el eje y
grid dibuja cuadriculado
text posiciona un texto arbitrariamente
gtext posiciona un texto con el ratón
ginput input gráfico
I MPRESIÓN DE GRÁFICOS
print envía gráfico a impresora
prtsc volcado de pantalla
meta archivo de gráficos
1.1. PROGRAMACIÓN EN MATLAB 28
F UNCIONES ELEMENTALES
abs módulo complejo
angle argumento complejo
sqrt raíz cuadrada
real parte real
imag parte imaginaria
conj conjugado complejo
round redondeo al entero más cercano
fix redondeo hacia cero
floor redondeo hacia −∞
ceil redondeo hacia ∞
sign función signo
rem resto
exp exponencial base e
log logaritmo natural
log10 logaritmo base 10
F UNCIONES T RIGONOMÉTRICAS
sin seno
cos coseno
tan tangente
asin arcoseno
acos arcocoseno
atan arcotangente
atan2 arcotangente de x/y
sinh seno hiperbólico
cosh coseno hiperbólico
tanh tangente hiperbólica
asinh arcoseno hiperbólico
acosh arcocoseno hiperbólico
atanh arcotangente hiperbólica
F UNCIONES E SPECIALES
bessel función de Bessel
gamma función Gamma
rat aproximación racional
erf función de error
inverf inversa de la función de error
ellipk integral completa elíptica de primera especie
ellipj integral elíptica de Jacobi
1.1. PROGRAMACIÓN EN MATLAB 29
D ESCOMPOSICIONES Y FACTORIZACIONES
balance forma equilibrada
backsub sustitución regresiva
cdf2rdf convierte diagonales complejas en diagonales reales
chol factorización de Cholesky
eig autovalores y autovectores
hess forma de Hessenberg
inv inversa
lu factores de la eliminación gaussiana
nnls mínimos cuadrados con restricciones
null base ortonormal del núcleo
orth base ortonormal de la imagen
pinv pseudoinversa
qr factorización QR
qz algoritmo QZ
rref forma escalonada reducida por filas
schur descomposición de Schur
svd descomposición en valores singulares
C ONDICIONAMIENTO DE MATRICES
cond número de condición en la norma 2
norm norma 1, norma 2, norma de Frobenius, norma ∞
rank rango
rcond estimación de la condición (inverso)
P OLINOMIOS
poly polinomio característico
roots raíces de polinomios—método de la matriz compañera
roots1 raíces de polinomios—método de Laguerre
polyval evaluación de polinomios
polyvalm evaluación polinomio matricial
conv multiplicación
deconv división
residue desarrollo en fracciones parciales
polyfit ajuste por un polinomio
P ROCESO DE S EÑALES
abs módulo complejo
angle argumento complejo
conv convolución
corrcoef coeficientes de correlación
cov covarianza
deconv deconvolución
fft transformada rápida de Fourier
fft2 FFT 2-dimensional
ifft FFT inversa
ifft2 FFT inversa 2-dimensinal
fftshift cambia las dos mitades de un vector
I NTEGRACIÓN N UMÉRICA
quad función de integración numérica
quad8 función de integración numérica
1.1. PROGRAMACIÓN EN MATLAB 31
I NTERPOLACIÓN
spline spline cúbico
table1 genera tablas 1-D
table2 genera tablas 2-D
1.2. CÁLCULO MATRICIAL BÁSICO 32
1. f (x) = 0 ⇔ x = 0.
Ejemplo 1.2.2.
>> sol=nori(x);
>> sol=nor1(x);
>> sol=norp(x,p);
>> sol=norw(x,p,w);
Hacer un único programa, llamado, nor.m, que calcule lo mismo que calculan
las cuatro funciones anteriores. El programa nuevo, para obtener los mismos
resultados que antes, deberia de utilizarse de la forma siguente:
>> sol=nor(x,0);
>> sol=nor(x,1);
>> sol=nor(x,p);
>> sol=nor(x,p,w);
Si haceis
vereis:
NORM(V,P) = sum(abs(V).^P)^(1/P).
NORM(V) = norm(V,2).
NORM(V,inf) = max(abs(V)).
NORM(V,-inf) = min(abs(V)).
Propiedades 1.2.4.
Diremos que dos normas f1 , f2 son equivalentes si ∃M, m > 0 tal que
Desigualdad de Hölder:
1 1
|xT y| ≤ kxkp kykq , ∀x, y ∈ Rn , ∀p, q, + = 1. (1.2)
p q
nor(x, p)
≤ C(≡ nor(x, p) ≤ Cnor(x, q)) ∀x ∈ Rn . (1.4)
nor(x, q)
Utilizar este programa para deducir, que no probar, que las normas kxk2 , kxk1 i kxk∞
son equivalentes. Deducir les constantes m y M en cada caso.
0 1 diagonals positives
-1
diagonals
negatives
>> triu(A),
>> triu(A,0),
>> tril(A),
>> tril(A,0),
Definición 1.2.9. Diremos que una matriz A = (aij ) m × n tiene un ancho de banda
inferior l ≤ m cuando aij = 0, si i > j + l, es decir, cuando las diagonales −m +
1, . . . , −l −1 son nulas (notad que la diagonal −m no existe). Diremos que una matriz
1.2. CÁLCULO MATRICIAL BÁSICO 36
Ejercicio 1.2.12. Haced un programa que dada una matriz A compruebe si la matriz
es diagonalmente dominante por filas.
(AT )T = A.
(A + B)T = AT + B T .
(αA)T = αAT .
(AB)T = B T AT .
Ejercicio 1.2.14. En matlab, para calcular la transpuesta de una matriz haremos A’.
Comprueba con dos matrices, que las propiedades anteriores son ciertas.
Definición 1.2.15. Una matriz A ∈ Rn×n es invertible si existe una matriz B ∈ Rn×n
tal que AB = BA = I; en este caso, la matriu que satisface esta condición es única,
se llama la inversa de A y se representa habitualmente por A−1 .
1.2. CÁLCULO MATRICIAL BÁSICO 37
38
2.1. INTRODUCCIÓN 39
2.1. Introducción
Dada una función real de una variable f (x), tratamos de hallar los valores de x en
los que la función se anula, es decir, las soluciones o raíces de la ecuación f (x) = 0.
Si tenemos un polinomio de grado 2 (o uno), existe una formula para calcular la
solución. Si el polinomio es de grado 3 o 4 también se puede resolver. No existen
formulas generales para obtener la solución de polinomios de grado ≥ 5.
Si no es posible resolver analíticamente la ecuación f (x) = 0 despejando x, nos
vemos abocados a utilizar métodos iterativos, consistentes en obtener una sucesión de
valores x1 , x2 , . . . , xn , . . . cada vez más próximos a la raíz buscada.
En teoría, nos planteamos si tal raíz existe y si es o no única. En la práctica, lo más
importante es determinarla con la precisión necesaria, con el menor número posible de
operaciones. La respuesta a la cuestión de la existencia la proporciona el
Refinar la aproximación inicial mediante una fórmula iterativa que genera nuevos
valores (llamados también iterados), x2 , x3 , x4 , . . ., que idealmente, convergerán
a la solución buscada x∗ .
Los métodos iterativos también pueden consistir en dado un intervalo. [a0 , b0 ], que
contenga a la solución, vamos calculando una sucesión de intervalos, [ak , bk ] cada vez
más pequeños y que también contengan a la solución.
A xk lo llamamos iterado k-ésimo (xk seria (ak + bk )/2 en el caso de intervalos) y
el error de esta aproximación viene determinado por
εk = |xk − x∗ |.
ek = |xk+1 − xk |, k = 1, 2, . . . .
Observemos que ek aproxima εk siempre que εk+1 εk . Por ello, podemos utilizar
en nuestros algoritmos como criterio de parada que la cantidad ek sea suficientemente
pequeña,
|xk+1 − xk | < tol o 0,5 ∗ |xk+1 − xk | < tol.
Si los cocientes ek+1 /ek tienden a K, 0 < K < 1, diremos que el método con-
verge linealmente.
Si los cocientes ek+1 /ek tienden a cero y los ek+1 /e2k tienden a estabilizarse,
diremos que el método converge cuadráticamente.
Si los cocientes ek+1 /ek tienden a cero y los ek+1 /epk , para cierto 1 << p < 2,
tienden a estabilizarse, se dice que el método tiene convergencia superlineal.
2.2. MÉTODOS ITERATIVOS 41
|xn+1 − x∗ |
lı́m 6= 0, ∞.
n (xn − x∗ )2
n n
• Ejemplo: xn = 1 + 0,22 + (n + 1)−2 converge a x∗ = 1.
Algoritme bisecció
2.3. MÉTODO DE LA BISECCIÓN 43
a0 m1 b0
a1 m2 b1
Observemos que el intervalo [a, b] contiene la raíz. La cota del error esta dividida
por 2 a cada iteración
Función bisección.m
func=inline(def_func, ’x’);
fa=func(a);
fb=func(b);
if ( fa*fb > 0 )
fprintf(’No n’’hi ha canvi de signe en [%e, %e]\n’, a, b);
return;
end
i=0;
while ( 0.5*abs(b-a) > tol & i < max_its )
m=0.5*(a+b);
fm=func(m);
fprintf(’%d\t% .16e\t% .16e\n’, i,m, fm);
if ( fm*fa < 0 )
b=m;
fb=fm;
else
a=m;
fa=fm;
end
i=i+1;
end
Las iteraciones convergen a la solución más rápidamente que las de bisección, pero la
a0 m1 b0
a1 m2 b1
amplitud del intervalo de búsqueda, b − a, no tiende a 0. Por ello, hay que modificar el
criterio de convergencia, terminando cuando dos iteraciones sucesivas difieran poco.
Algoritme regulafalsi
Régula falsi
2.4. MÉTODO DE RÉGULA FALSI 46
Función regulafalsi.m
function [m i]=regulafalsi( a, b, def_func, max_its, tol)
% [m i]=regulafalsi( a, b, max_its, tol)
% Biseccio per a trobar solucio de f(x)=0
% La funció seria def_func
%
% INPUT:
% a: a_0
% b: b_0
% max_its: maxim número d’iteracions %’
% tol: tolerancia per a error relatiu iteracio
%
% OUTPUT:
% m: solucio
%
% LOCALS
% a: a_i % fa: f(a_i)
% b: b_{i} % fb: f(b_i)
% m: m_i
% fm: f(m_i)
% i: index iteracions
% EXEMPLES:
% [m,i]=regulafalsi(1,2,’x^3-3*x+1’,100000,.0001)
2.5. MÉTODO DE NEWTON-RAPHSON 47
% [m,i]=regulafalsi(0,1,’x^3-3*x+1’,100000,.0001)
func=inline(def_func, ’x’);
fa=func(a);
fb=func(b);
mo=b;
if ( fa*fb > 0 )
fprintf(’No n’’hi ha canvi de signe en [%e, %e]\n’, a, b);
return;
end
i=0;
while ( 0.5*abs(b-a) > tol& 0.5*abs(m-mo) > tol & i < max_its )
m=(fb*a-fa*b)/(fb-fa);
fm=func(m);
fprintf(’%d\t% .16e\t% .16e\n’, i,m, fm);
if ( fm*fa < 0 )
b=m;
fb=fm;
else
a=m;
fa=fm;
end
i=i+1;
mo=m;
end
x0 x2 x1
f (x1 )
x2 ≡ x = x1 −
f 0 (x1 )
f (xk )
xk+1 = xk − , k = 1, 2, . . . (2.1)
f 0 (xk )
Algoritme de Newton-Raphson
Newton-Raphson
Input: x0 , f , f 0 , max_its, tol
Output: x1
for i = 1, . . . , max_its
x1 = x0 − f (x0 )/f 0 (x0 )
if ( |x1 − x0 | < tol )
break
end
x0 = x1
end
Función newton.m
2.5. MÉTODO DE NEWTON-RAPHSON 49
% INPUT:
% x0: x_0
% max_its: maxim número d’iteracions
% tol: tolerancia per a error relatiu iteracio
%
% OUTPUT:
% x2: solucio
%
% LOCALS
% xin: x_0
% x0: x_n % x1: x_{n+1}
% fx0: f(x0) % fpx0: f’(x0)
% i: index iteracions
% EXEMPLES:
% [m,i]=newton(2,’x^3-3*x+1’,’3*x^2-3’,100000,.0001)
% [m,i]=newton(1,’x^3-3*x+1’,’3*x^2-3’,100000,.0001)
func=inline(def_func, ’x’);
derfunc=inline(def_derfunc, ’x’);
i=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% bucle,
% condicio d’entrada: # iteracions < maxim # iteracions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while ( i < max_its )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% calcular fx0 i fpx0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fx0= func(x0);
fpx0= derfunc(x0);
if ( fpx0 ~= 0 )
2.5. MÉTODO DE NEWTON-RAPHSON 50
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Si fpx0 != 0 calcular x1, si no eixir
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1=x0-fx0/fpx0 ;
else
error(’tangent horizontal\n’);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% renovar i, x0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x0= x1 ;
i=i+1;
end
Teorema 2.5.1. Sea f ∈ C 2 ([a, b]). Si x∗ ∈ [a, b] es una raíz de la ecuación f (x) = 0
tal que f 0 (x∗ ) 6= 0 (es decir, es una raíz simple), entonces la sucesión de iterados
xk obtenida por el método de Newton converge a x∗ , para cualquier aproximación
inicial x1 elegida suficientemente próxima a la raíz. Además, la citada convergencia
es cuadrática.
x0 x2 x3 x4 x1
Algoritme de la secant
Secant
Input: x0 , x1 , f , max_its, tol
Output: x2
for i = 1, . . . , max_its
x2 = (f (x1 )x0 − f (x0 )x1 )/(f (x1 ) − f (x0 ))
if ( |x2 − x1 | < tol )
break
end
x0 = x1
x1 = x2
end
2.6. MÉTODO DE LA SECANTE 52
Función secante.m
func=inline(def_func, ’x’);
t=linspace(x0,x1,100);hold off;plot(t,func(t));grid;hold on
i=0;
while ( 0.5*abs(x1-x0) > tol & i < max_its )
fx0=func(x0);
fx1=func(x1);
m=(fx1*x0-fx0*x1)/(fx1-fx0);
fm=func(m);
plot(x0,fx0,’*’,x1,fx1,’*’,m,fm,’o’);pause(1)
fprintf(’%d\t% .16e\t% .16e\n’, i,m, fm);
x0=x1;
x1=m;
2.7. RAÍCES MÚLTIPLES 53
i=i+1;
end
Gráficamente parece que x = −1 es una raíz del polinomio p(x), en efecto p(−1) =
0. Observando la Figura 2.5 partiremos del intervalo [a1 , b1 ] = [0, 2] para hallar la raíz
positiva. Procediendo de forma análoga, se obtendría la otra raíz negativa.
10
−5
−10
−15
−2 −1.5 −1 −0.5 0 0.5 1 1.5 2
Verificamos que el polinomio tiene distinto signo en los extremos del intervalo
A continuación, comprobamos que p(b1 )· (c1 ) < 0 por lo que el intervalo [c1 , b1 ] =
[1, 2] contiene a la raíz, nos centramos en él haciendo a2 = c1 y b2 = b1 , realizamos
una nueva iteración en [a2 , b2 ] = [1, 2]:
2
a
a
a
a
0
b
b
b
b
−2
2
Ejercicio 2.8.2. Halla la menor raíz positiva de la ecuación e−x − cos x = 0 con una
tolerancia de 10−5 , utilizando el método de regula falsi y mostrando los pasos en las
primeras iteraciones.
x = -3:0.1:3;
y = exp(-x.^2)-cos(x);
plot(x,y)
grid on
Observando la gráfica de la función (Figura 2.7) partimos del intervalo [a1 , b1 ] = [1, 2]
para hallar la raíz.
Evaluamos la función en los extremos:
2
f (a1 ) = e−a1 cos(a1 ) = −0,172423
2
f (b1 ) = e−b1 cos(b1 ) = 0,434462
Calculamos el punto c1 donde la recta que une los puntos (a1 , f (a1 )) y (b1 , f (b1 ))
corta al eje x:
1.2
0.8
0.6
0.4
0.2
−0.2
−3 −2 −1 0 1 2 3
0.5
0.4
0.3
0.2
0.1
−0.1
−0.2
1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2
Ejercicio 2.8.3. Utiliza el método de Newton para aproximar la raíz quinta de 2 con
tres cifras decimales exactas, ilustrando el método paso a paso.
Comprueba la convergencia del método de Newton.
2.9. PROBLEMAS PROPUESTOS 57
√
Solución. Notemos que 5 2 es la solución de la ecuación f (x) = x5 − 2 = 0, cuya
derivada f 0 (x) = 5x4 utilizamos en el método de Newton.
Tomando una estimación inicial x1 = 1 y aplicando el método de Newton calcu-
lamos las siguientes iteraciones con
x51 − 2 −1 6
x2 = x1 − 4
=1− = = 1,2
5x1 5 5
5 5
x −2 1,2 − 2
x3 = x2 − 2 4 = 1,2 − = 1,152901
5x2 5 · 1,24
siguiendo este proceso con dos iteraciones más tenemos x5 = 1,148698, valor que
1
podemos comparar con el obtenido directamente al hacer 2 5 y observar que se tienen
más de tres cifras exactas.
Utilizamos el fichero newton.m para realizar los cálculos. Haciendo
>> [sol, x]=newton( 1,’x.^5-2’, ’5*x.^4’, 30, 1e-4)
obtenemos la solución sol = 1,148698, el vector de iterados x, el error 3,052991×10−5
y el número de iteraciones k = 5. Obsérvese que con una iteración más se obtiene la
solución con un error menor que 10−8, lo cual, en este caso, nos asegura que tenemos
al menos 7 decimales exactos.
Para estudiar la velocidad de convergencia, calculamos las tasas de convergencia a
partir del vector de iterados x:
Observamos que las componentes del vector tcl tienden a cero y las tcc se estabilizan
por lo que la convergencia es cuadrática. Conclusión que también puede obtenerse a
partir de las gráficas de estos vectores. √
Un planteamiento más general consistiría en obtener una aproximación de n a con
a > 0, resolviendo la ecuación f (x) = xn − a = 0.
2. sin(x) − x + 0,5 = 0;
3. exp(x) + exp(−3 ∗ x) − 4 = 0;
2.9. PROBLEMAS PROPUESTOS 58
√
4. x − 2 ∗ sin(x) − π/3 + x = 0;
5. x10 − 1 = 0;
Confeccionar una tabla indicando para cada método cuántas iteraciones son
necesarias para alcanzar la solución con la precisión requerida.
Capítulo 3
Cálculo simbólico
59
3.1. INTRODUCCIÓN 60
3.1. Introducción
Como su propio nombre indica, el cálculo simbólico consiste en manipular expre-
siones matemáticas haciendo abstracción de los valores numéricos concretos de las
variables involucradas, es decir tratándolas como símbolos. Según la escuela favorita
del autor de un artículo, este tipo de cálculo puede recibir también los nombres de
cálculo formal, cálculo algebraico, álgebra computacional, etc.
En un principio, las computadoras fueron diseñadas para realizar cálculos numéri-
cos (sólo con números) como las calculadoras de mano o el famoso ábaco. La razón era
muy simple; resultaba relativamente fácil reducir operaciones complejas a sucesiones
de sumas y restas o aproximar funciones complicadas por un polinomio determinado
(interpolación) o una función racional de polinomios (aproximantes de Padé). Toda la
teoría matemática de sucesiones y series permitió mas tarde elaborar algoritmos com-
plejos para obtener resultados aproximados de casi cualquier función y la rapidez de
los cálculos hizo el resto.
Pero de la misma forma que se puede reducir un producto de dos números a un
conjunto repetitivo (un algoritmo) de sumas ordenadas mediante una tabla de multi-
plicar de acceso rápido (y la división mediante otro algoritmo que use una tabla de
dividir), hay un conjunto finito de derivadas elementales que se pueden considerar
Reglas de Derivación como la derivada de un producto, la de un cociente, la de una
función de función, etc.. También es finito el número de funciones elementales que
sabemos derivar directamente, es decir, la Tabla de Derivar £No se podrán construir
algoritmos formales que usen esta Tabla de Derivar y apliquen repetitivamente las Re-
glas de Derivación para automatizar estos cálculos tediosos y permitir que las mentes
matemáticas dediquen mas tiempo a los problemas no resueltos aún?
En julio de 1836, Charles Babbage escribe en su libro de notas: “Hoy tuve por
primera vez una concepción general, pero muy confusa, sobre la posibilidad de hacer
una máquina que realice desarrollos algebraicos; es decir, sin ninguna referencia a los
valores de las letras...”. También Leibniz soñaba con construir un lenguaje formalizado
con el que una máquina de cálculo pudiera deducir todos los teoremas y resultados
apetecidos. Son estas intuiciones y sueños las que motivaron a tantos y tantos seres
humanos en la ardua tarea de construir máquinas con memoria suficiente para albergar
largas extensiones de desarrollos algebraicos y lo bastante rápidas para que el tiempo
necesario para realizarlos estuviera a escala humana.
Con cierto retraso, se pusieron a la tarea los creadores de software para generar
aplicaciones propietarias (de pago) o de libre uso (gratuitas) que poco a poco fueron
dando lugar a los actuales sistemas simbólicos. Entre ellos destacan el legendario Mac-
syma y el no menos potente Maple. Una rápida visión de la actual disponibilidad de
herramientas simbólicas la podéis ver en:
http://en.wikipedia.org/wiki/Comparison_of_computer_algebra_systems
Donde Matlab aparece como Symbolic Math Toolbox o con las características de
Maple que es el motor simbólico que usa. A su vez, Maxima, es un derivado gratuito
del Macsyma del MIT (Instituto Tecnològico de Massachusetts) y Scilab es lo mas
3.2. DEFINIENDO VARIABLES SIMBÓLICAS 61
función Salida
syms Crea variables simbólicas
sym Convierte a variable simbólica
double Convierte a variable numérica
Ejemplos:
>syms x y b t; % Crea 4 variablas simbólicas x, y, b, t
>a=sym(pi) % Guarda en a la constante pi dato simbólico
a =
pi
>n=double(a) % Guarda en n el valor numérico de a
n =
3.1416
3.3. EXPRESIONES Y ECUACIONES SIMBÓLICAS 62
3.3.1. Substituciones
Si en una expresión simbólica queremos sustituir una variable por otra o por una
constante para obtener su valor en un punto utilizamos la orden
subs(f,antiguas,nuevas)
Si hay que sustituir más de una variable se ponen entre llaves separadas por comas.
Por ejemplo, si queremos calcular f(3) y g(1) haríamos:
>subs(f,x,3), subs(g,’z’,1)
ans =
15
ans =
2
Solución
>syms x a b c t
>f=a*x^2+b*x+c;
>g=subs1(f,x,t)
g =
a*t^2+b*t+c
>h=subs(g,{a,b,c},{2,1,0}) % 3 variables y 3 valores ==> llaves
h =
2*t^2+t
3.3. EXPRESIONES Y ECUACIONES SIMBÓLICAS 64
>u=subs(h,t,2)
u =
10
>v=subs(h,t,[1:4]) % 1 variable con 4 valores
v =
3 10 21 36
Ejemplo 3.3.2. Realizar los cambios que se indican en las siguientes fórmulas:
a) En x3 + 2x + 5 ln(x) + 1 sustituir x por e.
b) En x + cosx realizar el cambio de variable x = y 2 + 1
a) >> syms x
>> subs(x^3+2*x+5*log(x)+1,exp(1))
>> ans =
31.5221
b) >> syms y
>> subs(x+cos(x),y^2+1)
>> ans =
y^2+1+cos(y^2+1)
Notad que la substitución para obtener ’v’ no precisa llaves { y } pues los 4 valores
reemplazan a la misma variable ’t’ y dan 4 respuestas. Por lo tanto se puede sustituir
una variable por todo un vector o matriz de constantes definido previamente.
variable principal find1. Si queremos saber cual de todas las variables simbólicas es
find1 en la expresión A, basta hacer findsym(A,1)
Ejemplos:
solve(’ecuación’, variable)
solve(f(x),x)
1. x2 + 2x + 1 = 0
2. x3 + 8 = 0
1. >> solve(x^2+2*x+1)
ans =
-1
-1
2. >> solve(x^3+8)
ans =
-2
1+i*3^(1/2)
1-i*3^(1/2)
3.4. RESOLUCIÓN DE ECUACIONES 66
>> double(ans)
ans =
-2.0000
1.0000 + 1.7321i
1.0000 - 1.7321i
>> S.x
ans =
5^(1/2)/2 + 1/2
1/2 - 5^(1/2)/2
5^(1/2)/2 + 1/2
1/2 - 5^(1/2)/2
>> S.y
ans =
(5^(1/2)/2 + 1/2)^(1/2)
(1/2 - 5^(1/2)/2)^(1/2)
-(1/2*5^(1/2) + 1/2)^(1/2)
-(1/2 - 1/2*5^(1/2))^(1/2)
obtenemos
Si tenemos dos ecuaciones con tres incógnitas podemos calcular las soluciones de
dos en función de la tercera. Esto es:
>> x=1:8
x =
1 2 3 4 5 6 7 8
Ahora escribimos
>> x>5
ans =
0 0 0 0 0 1 1 1
O PERADORES RELACIONALES
< Menor que
> Mayor que
<= Menor o igual
>= Mayor o igual
== Igual
∼= distinto
Además estos operadores relacionales se pueden combinar con los operadores lógi-
cos
O PERADORES LÓGICOS
& y
| o
∼ no
Observar la notación del punto delante de la operación del producto (.*) para
operar elemento a elemento.
Ahora la dibujaríamos con
>> plot(x,y,’.’);grid on
(conviene dibujarla con un trazado de puntos o cruces para que se vean las discon-
tinuidades si las hay)
3.5. LA FUNCIÓN INLINE 69
f =
Inline function:
f(x) = (x.^2+1).*(x<0)+1.*((0<=x)&(x<1))+(-x+3).*(1<=x)
>> f(-2)
ans =5
>> f(0)
ans =1
>> f(2)
ans =1
3.5. LA FUNCIÓN INLINE 70
Hay dos nociones distintas aunque relacionadas que son importantes para el Cál-
culo:
Una son las expresiones simbólicas como sen x o x2.
La otra son las “reglas” o algoritmos que permiten obtener una salida numérica a
partir de unas entradas también numéricas.
La segunda “definición” es más general; sirve, por ejemplo, para definir una fun-
ción f(x) como x2 si x es negativa o 0 y sen x si x es positiva.
Por otro lado, cualquier expresión simbólica implica una regla de evaluación. Es
decir, si sabemos que f (x) = x2 entonces sabemos que f (4) = 42 = 16.
En MATLAB, la diferencia fundamental entre una función y una expresión sim-
bólica radica en que una función puede ser invocada con argumentos y una expresión
simbólica no.
Por otra parte, una expresión simbólica puede ser derivada mientras que una fun-
ción no puede.
En MATLAB las funciones son creadas de dos formas: como ficheros .m y como
funciones inline.
La forma típica de definir una expresión simbólica es la siguiente:
syms x
f=x^2-sin(x)
f =
x^2-sin(x)
Las dos líneas siguientes muestra que podemos derivar f, pero que no podemos eval-
uarla, al menos de una forma obvia. Nótese que MATLAB reconoce la variable. En
caso de que haya varias variables simbólicas, podemos especificar aquella respecto a
la cual queremos derivar
diff(f)
ans =
2*x-cos(x)
f(4)
??? Index exceeds matrix dimensions.
Podemos evaluar f(4) sustituyendo x por 4 de la siguiente forma:
subs(f,x,4)
ans =
16.7568
Podemos también convertir f en una función inline con el comando:
fin=inline(char(f))
fin =
Inline function:
fin(x) = x^2-sin(x)
3.5. LA FUNCIÓN INLINE 71
Lo que está sucediendo aquí es que el comando inline requiere una cadena como en-
trada y char convierte f, expresión simbólica, en la cadena ’x^2-sin(x)’. (Si sim-
plemente hubiéramos escrito fin=inline(f) obtendríamos un mensaje de error
puesto que f no es una cadena). La función inline fin acepta ahora argumentos:
fin(4)
ans =
16.7568
fxin=inline(char(diff(f)))
fxin =
Inline function:
fxin(x) = 2*x-cos(x)
La función MATLAB char reemplaza el argumento que recibe por la cadena que lo rep-
resenta, haciéndolo así accesible a funciones que requieren cadenas como argumento,
como por ejemplo inline.
Sin embargo, cuando char es aplicado a una expresión simbólica, el resultado aún
es una expresión simbólica y puede ser derivada:
diff(char(f))
ans =
2*x-cos(x)
La otra forma de crear una función evaluable es escribiendo una función en fichero .m
Esta es la forma principal de definir funciones en la mayor parte de aplicaciones de
MATLAB. Recordemos que un fichero .m se crea de forma separada.
Supongamos que hemos escrito el fichero .m fun1.m que contiene lo siguiente:
function out=fun1(x)
out=x^2-sin(x);
fun1(4)
ans =
16.7568
Una de las cosas que podemos querer hacer con una función es representar su
gráfica. La operación más elemental en MATLAB es dibujar un punto con unas coor-
denadas específicas: plot(4,4)
La salida de este comando es el punto azul centrado en la figura. Para dibujar una
curva MATLAB dibuja una secuencia de puntos conectados mediante segmentos de
recta.
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 72
La entrada para tales dibujos consiste en dos vectores (listas de números). El primer
argumento es el vector de coordenadas x y el segundo el vector de coordenadas y.
MATLAB conecta los puntos cuyas coordenadas aparecen en posiciones consecu-
tivas de los vectores de entrada.
Dibujemos la función que definimos en la transparencia anterior. En primer lugar
se necesita un vector de coordenadas x:
X1=-2:.5:2
X1 =
Columns 1 through 7
-2.0000 -1.5000 -1.0000 -0.5000 0 0.5000 1.0000
Columns 8 through 9
1.5000 2.0000
fin=inline(vectorize(f))
fin =
Inline function:
fin(x) = x.^2-sin(x)
Y1=fin(X1)
Y1 =
Columns 1 through 7
4.9093 3.2475 1.8415 0.7294 0 -0.2294
0.1585
Columns 8 through 9
1.2525 3.0907
plot(X1,Y1)
−2
−4
−6
−8
−4 −3 −2 −1 0 1 2 3 4
√
Figura 3.1: función f (x) = x2 − x − 6
√
Ejemplo 3.6.1. Determinar el dominio de la función f (x) = x2 − x − 6.
>> sym x
>> solve(x^2-x-6)
>> ans =
3
-2
Esto es suficiente para darse cuenta que ] −∞, −2[ es positiva, ] −2, 3[ es negativa
y ]3, +∞[ es positiva.
Luego el dominio de f (x) es ] − ∞, −2[∪]3, +ı́nf].
Si intentamos dibujar la gráfica de la función inicial (Figure 3.2), sin pensar en el
dominio de la función,
Nos avisa de que estamos tomando valores de x que producen raíces de números
negativos, es decir, complejos, aún así dibuja la gráfica, aunque podríamos pensar que
entre [−2, 3] la función vale cero y eso no es cierto, pues en ese intervalo la función
no existe.
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 74
−1
−4 −3 −2 −1 0 1 2 3 4
√
Figura 3.2: función f (x) = x2 − x − 6
Ésto nos permite darnos cuenta que hay imagen para los x que caen dentro de
] − ∞, −2[∪]3, +∞], pero cuidado cómo ya he dicho antes, podríamos pensar que
entre [−2, 3] la función vale cero y eso no es cierto, pues en ese intervalo la función
no existe.
función Salida
limit(f,x,a) lim. cuando x → a
limit(f,a) Como no está x usa find1 → a
limit(f) Si tampoco está a, usa a=0
limit(f,x,a,’left’) lim. por la izquierda.
limit(f,x,a,’right’) lim. por la derecha.
función Salida
limit(sin(x)/x) 1
limit((x-2)/(x^2-4),2) 1/4
limit((1+2*t/x)^(3*x),x,inf) exp(6*t)
limit(1/x,x,0,’right’) inf
limit(1/x,x,0,’left’) -inf
limit((sin(x+h)-sin(x))/h,h,0) cos(x)
>> limit(((2*x+3)/(2*x+5))^(x+1))
>> ans =
3/5
>> limit(((2*x+3)/(2*x+5))^(x+1),x,inf)
>> ans =
exp(-1)
y resuelve la indeterminación 1∞ .
1
Ejemplo 3.6.3. Calcular lı́m .
x→0 x
Tal y como sabemos por teoría, hay una división por cero y por tanto hay que
estudiar lateralidad.
Si calculamos con matlab el límite total, se obtiene
>> limit(1/x)
>> ans =
NaN
lo que nos obliga a estudiar lateralidad para poder concluir.
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 76
>> limit(1/x,x,0,’right’)
>> ans =
Inf
>> limit(1/x,x,0,’left’)
>> ans =
-Inf
Concluyendo como ya debemos saber que el límite no existe, pues los laterales existen
pero son distintos.
0
Veamos que Matlab resuelve perfectamente las indeterminaciones .
0
x2 − 4
Ejemplo 3.6.4. Calcular lı́m .
x→2 x − 2
>> limit((x^2-4)/(x-2),x,2)
>> ans =
4
El estudio gráfico (Figura 3.3) nos permite afirmar que la función está definida en
todos los reales menos en x = −1, x = 1, que analíticamente se puede deducir pues
son los únicos puntos que anulan el denominador y el numerador está definido para
todo número real. Observar como Matlab dibuja el comportamiento asintótico en esos
puntos.
Gráficamente también puedo afirmar que los límites totales en −1 y en 1 no existen,
pues para ambos puntos los límites laterales dan diferente. Compruebo esta afirmación
analíticamente:
Hay una forma de evaluar la función en un punto concreto: comando inline
>> f=inline(’(sqrt(x^2+3)-1)/(x^2-1)’)
f =
Inline function:
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 77
−2
−4
−6
−6 −4 −2 0 2 4 6
√
x2 + 3 − 1
Figura 3.3: función f (x) =
x2 − 1
f(x) = (sqrt(x^2+3)-1)/(x^2-1)
>> f(1)
Warning: Divide by zero.
> In inlineeval at 13
In inline.subsref at 25
>> ans =
Inf
>> f(-1)
Warning: Divide by zero.
> In inlineeval at 13
In inline.subsref at 25
>> ans =
Inf
NaN
Estudio lateralidad,
>> limit((sqrt(x^2+3)-1)/(x^2-1),x,1,’right’)
>> ans =
Inf
>> limit((sqrt(x^2+3)-1)/(x^2-1),x,1,’left’)
>> ans =
-Inf
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 78
>>limit((sqrt(x^2+3)-1)/(x^2-1),x,-1)
>> ans =
NaN
Estudio lateralidad,
>> limit((sqrt(x^2+3)-1)/(x^2-1),x,-1,’right’)
>> ans =
-Inf
>> limit((sqrt(x^2+3)-1)/(x^2-1),x,-1,’left’)
>> ans =
Inf
>>f=inline(’1./(x+1).*(x<2)+(2*x+2).*(x>=2)’)
f =
Inline function:
f(x) = 1./(x+1).*(x<2)+(2*x+2).*(x>=2)
>> f(-1)
Warning: Divide by zero.
> In inlineeval at 13
In inline.subsref at 25
>> ans =
Inf
>> f(2)
>> ans =
6
>> x=-3:0.01:3;
>> y=1./(x+1).*(x<2)+(2*x+2).*(x>=2);
Warning: Divide by zero.
>> plot(x,y,’*’);grid on
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 79
100
80
60
40
20
−20
−40
−60
−80
−100
−3 −2 −1 0 1 2 3
>> syms x
>> limit(1/(x+1),x,2,’left’)
>> ans =
1/3
>> limit(2*x+2,x,2,’right’)
>> ans =
6
>> limit(1/(x+1),x,-1,’left’)
>> ans =
-Inf
>> limit(1/(x+1),x,-1,’right’)
>> ans =
Inf
Discontinuidad asintótica en x = 1.
3.6. DOMINIOS, LÍMITES Y CONTINUIDAD 80
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
−6 −4 −2 0 2 4 6
40
30
20
10
−10
−20
−30
−6 −4 −2 0 2 4 6
>> limit(cos(x),x,pi,’right’)
>> ans =
-1
>> limit(sin(x),x,pi,’left’)
>> ans =
0
>> x=-6:0.01:6;
>> y=(-3.*(x+1)./(2*x.^2-x-6)).*(x<1)+(2*x.^2-8*x+7).*(x>=1);
Warning: Divide by zero.
>> plot(x,y,’*’);grid on
>> solve(’2*x^2-x-6’)
>> ans =
2
-3/2
Efectivamente el punto x = −3/2 cae dentro de los menores que 1 y de x = 2 me
olvido.
Estudio analítico entorno al punto x = −3/2:
>> syms x
>> limit((-3*(x+1)/(2*x^2-x-6)),x,-3/2,’left’)
>> ans =
Inf
>> limit((-3*(x+1)/(2*x^2-x-6)),x,-3/2,’right’)
>> ans =
-Inf
Discontinuidad asintótica en x = −3/2.
Estudio del punto de ruptura, x = 1:
>> limit((-3*(x+1)/(2*x^2-x-6)),x,1,’left’)>>
ans =
6/5
>> limit(2*x^2-8*x+7,x,1,’right’)
>> ans =
1
Discontinuidad de salto finito en x = 1.
3.7. Simplificadores
Supongamos que F es una expresión simbólica con la forma F=P*exp(sqrt(3*x^2/a^4)),
donde P representa un polinomio en la variables ’x’ que puede tener grado elevado. Si
estamos buscando extremales (máximos y mínimos relativos) de F debemos anular su
derivada. Pero en ella va a aparecer la exponencial multiplicando a cada término del
polinomio resultante y sabemos que esta exponencial nunca podrá anularse en el rango
de los reales.
Resulta pues inútil derivar F y endosarle todo el mogollón que salga a cualquier
resolvedor simbólico de ecuaciones, bajo la excusa de que si lo puede hacer él, para
qué tengo que hacer yo el trabajo?. Nos podemos encontrar sorpresas inesperadas y
no serán aceptables quejas del tipo aes
˛ que a mí se me ha colgado! o esta otra aes˛
que mi ordenador va muy lento!. Hay que buscar una forma de definir esa exponencial
como una subexpresión simbólica, luego pedir que simplifique o factorize con esa
subexpresión y, finalmente, buscar los ceros del otro factor.
El Matlab dispone de varias funciones simplificadoras que deben aplicarse en los
procesos de derivación e integración (sobretodo en el primero). Estas son:
3.7. SIMPLIFICADORES 83
pretty(expresion)
3
Ejemplo 3.7.2. Simplificar la expresión (x + 3)(x + 5) + 1 + expresando el
x+2
resultado como una función racional (cociente de dos polinomios).
>> pretty((x+3)*(x+5)+1+3/(x+2))
3
(x + 3) (x + 5) + ----- + 1
x + 2
>> factor(x^6+1)
>> ans =
(x^2+1)*(x^4-x^2+1)
>> factor(((x+3)*(x+4)-(x+2)^2)^2)
>> ans =
(3*x+8)^2
>> expand((3*x+8)^2)
>> ans =
9*x^2+48*x+64
>> expand(cos(x+y))
>> ans =
cos(x)*cos(y)-sin(x)*sin(y)
>> expand(exp(x+y))
>> ans =
exp(x)*exp(y)
simple(expresion)
>> syms x
>> p=simple(sin(x)^2+cos(x)^2);
>> p
p = 1
Tal y como hemos visto con el paquete simbólico podemos calcular límites, ahora
vamos a utilizarlo para derivar.
Para que salga en formato matemático basta con enlazar con el comando pretty
>> pretty(diff(x^2+cos(x+1)*sin(x^2),x))
2 2
2 x - sin(x + 1) sin(x ) + 2 cos(x + 1) cos(x ) x
Para la segunda derivada
>> pretty(diff(x*log(x),x,2))
1/x
f (x0 + h) − f (x0 ) 0
f 0 (x0 ) = lı́m , f− (x0 ) = f+0 (x0 ) = f 0 (x0 )
h→0 h
Vamos a utilizar lo que sabemos de Matlab para estudiar si una función es derivable
en un punto.
Ejemplo 3.8.2. Calcula la derivada de la función f (x) = 4x2 − 5x + 7 haciendo uso
de la definición y del comando diff.
>> syms x h
>> f=4*x^2-5*x+7 % Guardamos en f la función.
f =
4*x^2-5*x+7
>> g=(subs(f,x+h)-f)/h % Guardamos en g el cociente incremental
% que hay que calcular en la definición
% de derivada en un punto.
3.8. CÁLCULO DE DERIVADAS. 87
g =
(4*(x+h)^2-5*h-4*x^2)/h
>> g=expand(g) % Desarrollamos con el comando expand.
g =
8*x+4*h-5
>> der_f=limit(g,h,0) % Calculo el límite de g cuando h
% tiende a cero, es decir, la
% derivada, la guardo en der_f.
der_f =
8*x-5
>> diff(f) % Ahora hago uso del comando diff, el resultado
% debe ser el mismo.
>> ans =
8*x-5
>> diff(abs(x))
>> ans =
sign(x)
Si sustituyo la derivada en x = 0
8000
7000
6000
5000
4000
3000
2000
1000
−1000
−2000
−5 −4 −3 −2 −1 0 1 2 3 4 5
nos dice que no es derivable pero no aporta información de las derivadas a la derecha
y a la izquierda.
en x = 2.
Empiezo dibujando la función a ver la información que obtengo,
>> x=-5:0.001:5;
>> y=(x-3)./(x.^2-2).*(x<=2)+(2*x-6)./x.^2.*(x>2);
Warning: Divide by zero.
>> plot(x,y,’.’)
>> syms x
>> subs((x-3)/(x^2-2),x,2)
>> ans =
-0.5000
>> f=inline(’(x-3)/(x.^2).*(x<=2)+(2*x-6)/x.^2.*(x>2)’)
f =
Inline function:
f(x) = (x-3)/(x.^22).*(x<=2)+(2*x-6)/x.^2.*(x>2)
>> f(2)
>> ans =
-0.5000
>> limit((2*x-6)/x^2,x,2,’left’)
>> ans =
-1/2
>> limit((x-3)/(x^2-2),x,2,’right’)
>> ans =
-1/2
>> syms x h
>> rama_izq=(x-3)/(x^2-2);
>> g=(subs(rama_izq,x,2+h)-f(2))/h
>> g =
((-1+h)/((2+h)^2-2)+1/2)/h
>> limit(g,h,0,’right’)
>> ans =
3/2
>> rama_dcha=(2*x-6)/x^2;
>> g=(subs(rama_dcha,x,2+h)-f(2))/h
>> g =
((-2+2*h)/(2+h)^2+1/2)/h
>> limit(g,h,0,’left’)
>> ans =
1
−1
−10 −8 −6 −4 −2 0 2 4 6 8 10
1
Figura 3.8: función f (x) = e x .
>> syms x
>> f=exp(1/x);
>> der_f=diff(f,x)
>> der_f =
-1/x^2*exp(1/x)
>> solve(der_f,x)
Warning: Explicit solution could not be found.
> In solve at 140
In sym.solve at 49
>> ans =
[ empty sym ]
1
La derivada es − x12 e x que no se anula en el dominio de la función. De ahí que no
posea ni máximos ni mínimos relativos.
Calculo la derivada segunda, para determinar los puntos de Inflexión:
3.9. APLICACIONES DE LA DERIVADA: MÁXIMOS-MÍNIMOS-PUNTOS DE INFLEXIÓN. OPTIMIZAC
>> der2_f=diff(f,x,2)
>> der2_f =
2/x^3*exp(1/x)+1/x^4*exp(1/x)
>> solve(der2_f,x)
>> ans =
-1/2
Al igualar la segunda derivada a cero, obtenemos un posible punto de inflexión, que
admitiremos como tal o descartaremos según su valor en la tercera derivada,
>> der3_f=diff(f,x,3)
>> der3_f =
-6/x^4*exp(1/x)-6/x^5*exp(1/x)-1/x^6*exp(1/x)
>> subs(der3_f,x,-1/2)
>> ans =
4.3307 % Al ser distinto de cero, afirmamos que
% la función tiene un punto de
% inflexión que se alcanza en x=-1/2.
% El punto de inflexión es (-1/2, f(-1/2)).
>> subs(f,-1/2)
>> ans =
0.1353 % el punto de inflexión es (-0.5, 0.1353).
35
P
30
25
20
15
10
0
A C B
−5
−5 0 5 10 15 20
>> syms x
>> tiempo=sqrt(x^2+32^2)/48+(16-x)/80;
% función a minimizar en el intervalo [0,16].
>> der_tiempo=diff(tiempo,x)
% hallo su derivada, la guardo en der_tiempo.
>> der_tiempo =
1/48/(x^2+1024)^(1/2)*x-1/80
>> pretty(der_tiempo) % la muestro en formato matemático.
x
1/48 -------------- - 1/80
2 1/2
(x + 1024)
>> solve(der_tiempo,x) % Igualo la derivada a cero, y resuelvo.
>> ans =
24
El mínimo relativo de la función tiempo se alcanza en x = 24, que queda fuera del in-
tervalo [0, 16], por tanto lo desecho. Por el teorema de Weiertrass dado que la función
tiempo es continua en [0, 16], existe un mínimo absoluto, que se alcanzará en uno de
los extremos del intervalo.
>> subs(tiempo,x,0)
>> ans =
0.8667
>> subs(tiempo,x,16)
>> ans =
0.7454
Ejercicios propuestos.
Ejercicio 3.9.3. Estudiar la derivabilidad de la función f (x) = |x − 3|.
Estudiar su derivabilidad en x = 1.
sol=int(f,0,2)
sol =
5/3+cos(2)
h=sqrt(x^2-sin(x^4))
h =
(x^2-sin(x^4))^(1/2)
int(h,0,2)
Warning: Explicit integral could not be found.
> In C:\MATLABR11\toolbox\symbolic\@sym\int.m at line 58
ans =
int((x^2-sin(x^4))^(1/2),x = 0 .. 2)
double(int(h,0,2))
Warning: Explicit integral could not be
found.
> In
C:\MATLABR11\toolbox\symbolic\@sym\int.m
at line 58
ans =
1.7196
ezplot(h,[0,2]);grid
3.10. CÁLCULO INTEGRAL E INTEGRACIÓN NUMÉRICA 94
(x2 − sin(x4))1/2
1.5
0.5
p
Figura 3.10: Dibujo h(x) = x2 − sin(x4 )
El valor numérico retornado por MATLAB (Figura 3.10) es algo menos que la
mitad del área de un cuadrado de 2 unidades de lado lo cual es consistente con nuestro
gráfico.
La integración numérica invocada por la combinación de double e int no es nativa,
esto es no es propio sino de MAPLE del cual han sido tomadas las rutinas de cálculo
simbólico de MATLAB.
MATLAB también dispone de un integrador numérico denominado quadl. Las ruti-
nas double(int(...)) y quadl(...) proporcionan respuestas ligeramente distintas.
quadl(inline(vectorize(h)),0,2)
ans =
1.7196
Solucion
>> syms a b x;
>> f=a*x+b;g=’y^2+z’;% practicamos los dos modos de definir expresiones
>> I1=int(f) % integra respecto de la variable preferente x
I1 =
1/2*a*x^2+b*x
96
4.1. INTRODUCCIÓN 97
4.1. Introducción
El proceso de cálculo lleva associada, inevitablemente, una serie de complicaciones
debidas a la propagación de los errores en los cálculos. Hay tres clases de errores
principales en cálculo numérico:
la longitud de palabra usada, pero también pueden diferir en otro aspecto muy impor-
tante: el tipo de representación, de punto fijo, o de punto flotante.
Para familiarizarnos con los diversos tipos de representaciones numéricas, hay que
recordar que nosotros trabajamos habitualmente en base 10, es decir, entendemos un
número cualquiera, por exemple 2543, como
Así, cualquier entero en base 10 se puede asociar con un polinomio, en el caso anterior
p(x) = 3 + 4x + 5x2 + 2x3 , de manera que la evaluación de este polinomio para x =
10, la base de nuestro sistema numérico, nos da el entero mencionado. Así podemos
utilizar la notación siguiente:
donde 0 ≤ ai < 10, para representar cualquier número entero. En realidad no hay
ningún motivo especial para utilizar el número 10 como base de las representaciones
numéricas. Como los ordenadores leen impulsos eléctricos, y el estado natural es sí o
no, es más conveniente representar los números en los ordenadores mediante el sistema
binario, es decir, en base 2. Así un entero no negativo N se representa en el sistema
binario como
con 0 ≤ ai < 2. El número N tiene, pues, asociado un polinomio p(x), de manera que
p(2) = N, y los coeficientes de este polinomio constituyen su representación numérica
en base 2. Prácticament todos los computadores modernos utilizan el sistema binario
internamente. No obstante, los usuarios prefieren, por razones obvias, visualizar re-
sultados en el sistema decimal. Las conversiones de un sistema numérico a otro son
muy sencillas. La conversión de un número binario a decimal puede llevarse a cabo
directament evaluando p(2), por ejemplo:
(101)2 = 1 · 22 + 1 · 20 = 5,
(1100101001)2 = 1 · 29 + 1 · 28 + 1 · 25 + 1 · 23 + 1 = 809.
Input: an , . . . , a0 , β
bn−1 = an
for i = n − 1, . . . , 1
bi−1 = ai + bi β
end
r = a0 + b0 β
Output: p(β) = r
Input: N, β
Calcular b1 i a0 tal que N = b1 · β + a0 .
n=1
while bn ≥ β
Calcular bn+1 i an tal que bn = bn+1 · β + an
n=n+1
end
an = bn
Output: (an an−1 . . . a1 a0 )
187 = 93 · 2 + 1 = (46 · 2 + 1) · 2 + 1 = 46 · 22 + 1 · 2 + 1
= (23 · 2 + 0) · 22 + 1 · 2 + 1 = 23 · 23 + 0 · 22 + 1 · 2 + 1
= (11 · 2 + 1) · 23 + 0 · 22 + 1 · 2 + 1
= 11 · 24 + 1 · 23 + 0 · 22 + 1 · 2 + 1 = · · ·
= (10111011)2.
tiene una cantidad finita de dígitos significativos, pero la parte fraccionaria puede tener
infinitos dígitos significativos, por ejemplo x = 1/3 = ,33333 . . ..
En general, la representación decimal de x se puede especificar dando:
n
X ∞
X
xI = ak 10 , k
xF = bk 10−k ,
k=0 k=1
Cuando se utiliza el sistema binario, las expresiones formales son del mismo tipo,
es decir, si
x = (an an−1 . . . a0 .b1 b2 . . .)2 ,
entonces
n
X ∞
X
xI = k
ak 2 , 0 ≤ ak < 2; xF = bk 2−k , 0 ≤ bk < 2.
k=0 k=1
Hemos visto antes cómo llevar a cabo la conversión de enteros positivos decimales
a binarios y viceversa. La conversión de fracciones decimales a binarias y viceversa se
puede hacer utilizando un mecanismo también muy sencillo. Sea un xF , con 0 < xF <
1, podemos calcular su representación binaria (.b1 b2 . . .)2 de la manera seguiente:
P
Si xF = ∞ −k
k=1 bk 2 , tenemos
∞
X ∞
X
−k+1
2xF = bk 2 = b1 + bk+1 2−k ,
k=1 k=1
por tanto, bP
1 es la parte entera de 2xF , es decir, b1 = [2xF ]. Su parte fraccionaria es
(2xF )F = ∞ k=1 bk+1 2
−k
= b2 2−1 + b3 2−2 + . . .
Si repetimos este proceso, tenemos que b2 = [2(2xF )F ], etc. La implementación
de este proceso se puede hacer con el algoritmo de la figura 4.3
Por ejemplo, si xF = 0,625, tendremos
Figura 4.3: Algoritmo para pasar un número decimal 0 < x < 1, a base β, x =
P i −k
k=1 bk β . Si la expresión tiene una cantidad infinita de dígitos (es decir, bi 6= 0
para todo i), el algoritmo no acaba nunca.
la base β,
Es importante darse cuenta de que sólo hay una cantidad finita de números en un
sistema numérico de punto flotante. Todos los números estrictamente positivos de un
sistema numérico de punto flotante como en la definición 4.3.1 cumplen
β emin −1 ≤ y ≤ (1 − β −t ) · β emax .
1,0, 1,25, 1,50, 1,75, 2,0, 2,5, 3,0, 3,5, 4,0, 5,0, 6,0, 7,0,
y gráficamente el sistema numérico de punto flotante es:
0 1 2 3 4 5 6 7
En la Tabla 4.1 podemos ver las mantisas y los exponentes correspondientes a cada
uno de esos valores:
El almacenaje de un número real cualquiera en el ordenador supone, por lo tan-
to, elegir un elemento del sistema numérico del ordenador que será, pues, la repre-
sentación de punto flotante del número en cuestión. La obtención de la representació
de punto flotante puede ser, pues, considerada como una aplicación de R → F . Hay
dos formas de traducir un número real x a su representación de punto flotante de lon-
gitud t y base β: representación de punto flotante por corte y representación de punto
flotante por redondeo.
Si escribimos primero x = ±(.d1 d2 d3 . . . dt dt+1 dt+2 . . .)β · β e donde d1 6= 0 y
0 ≤ di < β, su representación en punto flotante, al cortar, se define como
Cuadro 4.1: Números que se pueden representar cuando emin = −1, emax = 3, β = 2
it=3
El hecho de que los sistemas numéricos que utilizan los ordenadores tengan longi-
tud de palabra finita tiene como consecuencia que en el ordenador siempre se utilizan
aproximaciones a los números reales que en realidad quisiéramos usar. Hay, por lo
tanto, que estimar y controlar, en la medida en que eso sea posible, los errores que
se cometen cuando manipulamos estas aproximaciones y, lo que es mas importante,
cómo se propagan a través de una cadena de cálculos.
Si x ∈ R i x̃ es una aproximación a x, definimos:
El error absoluto de la aproximación: Ea (x̃) = |x − x̃|.
|x−x̃|
El error relativo de la aproximación: Er (x̃) = |x|
.
El error absoluto no da, por si mismo, demasiada información sobre la validez de
la aproximación. Por ejemplo, si tenemos x = 1000002 y x̃ = 1000000, tenemos un
error absoluto de 2 unidades, lo mismo que para y = 2,5 y ỹ = 0,5. No obstante, en
el primer caso tenemos 6 dígitos coincidentes entre x y x̃, mientras que en el segundo
caso no tenemos ninguno.
El error relativo, en cambio, da información sobre el número de dígitos significa-
tivos coincidentes. Comparar, por ejemplo Er (x̃) ≈ 2 · 10−6 , con Er (ỹ) = 2/2,5 ≈
8 · 10−1 . En el primer caso, el error relativo es mucho mas pequeño que en el segundo
caso, lo que indica que hay muchos mas dígitos correctos en el primer caso que en el
segundo. Esta relación entre el error relativo y el número de cifras significativas correc-
tas se puede cuantificar. Ese es el resultado fundamental que establece la proposición
siguiente y el corolario subsiguiente, y que justifica que los sistemas numéricos en
todos los ordenadores actuales trabajen con redondeo.
Proposició 4.3.4. Si x ∈ R y f lT (x) y f lR (x) son las representaciones de punto
flotante (normalizadas) con t dígitos y base β, entonces:
Er (f lT (x)) ≤ β 1−t , (4.5)
1 1−t
Er (f lR (x)) ≤ ·β . (4.6)
2
Prueba. Sea x = (.d1 d2 . . . dt dt+1 dt+2 . . .)β · β e la representación de punto flotante
normalizada de x, entonces f lT (x) = (.d1 d2 . . . dt )β · β e . Por tanto,
por tanto,
|x − f lR (x)| 1/2β e−t 1
Er (f lR (x)) = ≤ −1 e = · β 1−t .
|x| β ·β 2
En cambio, si 1/2 ≤ (.dt+1 dt+2 . . .)β ≤ 1,
y, por tanto,
+∞ t−1
!
X X
R −k −k −t
|x − f l (x)| = dk β − dk β + (dt + 1)β · βe
k=1 k=1
+∞
X
= −β −t + dk β −k · β e
k=t+1
1 e−t
= |1 − (.dt+1 dt+2 . . .)β | · β e−t ≤ ·β ,
2
de donde se deduce de nuevo
1/2β e−t 1
Er (f lR (x)) ≤ −1 e
= · β 1−t .
β ·β 2
Corolario 4.3.5. Si x ∈ R y f l(x) es una representación de punto flotante (normal-
izada) con t dígitos y base β, entonces
Hace treinta años, la situación era mucho mas complicada que ahora. Cada orde-
nador tenia su propio sistema de aritmética de punto flotante. Algunos eran binarios;
otros eran decimales. Incluso había un ordenador Ruso que usaba aritmética ternaria
(β = 3). Entre los ordenadores binarios, algunos usaban 2 como base y otros usa-
ban 8 o 16. Y cada uno tenía diferente precisión. En 1985, el IEEE Standars Board y el
4.3. ARITMÉTICA DE PUNTO FLOTANTE 106
El estándar del IEEE especifica dos formatos básicos para representaciones de pun-
to flotante, formatos en simple precisión y formatos en doble precisión. Las especifi-
caciones se dan en la tabla siguiente:
0≤m<1
4.3. ARITMÉTICA DE PUNTO FLOTANTE 107
1. La suma o la resta de números dispares pude no tener efecto sobre el mayor. Así,
con t = 3 y β = 10:
Los errores generados por los cálculos en aritmética de precisión finita, pueden
adquirir una importancia relativa considerable. Por poner un ejemplo sencillo, supong-
amos ahora que queremos calcular z = x − y con x = 7,6545421, y = 7,6544200
en un ordenador que trabaja con t = 6, por tanto, disponemos de aproximaciones
x̃ = (,765454) · 101 , ỹ = (,765442) · 101 para las cuales
1
Er (x̃) ≤= · 10−5 = 5 · 10−6 , Er (ỹ) ≤ 5 · 10−6 .
2
El valor
z̃ = x̃ − ỹ = (0,000012) · 101 = (0,120000) · 10−3
es una aproximación a z = ,00001221 para la que se cumple
21
Er (z̃) = ≈ 1,7 · 10−2 .
1221
Este incremento de casi cuatro órdenes de magnitud en el error relativo indica una
disminución considerable del número de dígitos significativos correctos en el resul-
tado de la diferencia de las dos aproximaciones. Este fenómeno, que aparece cuando
se restan números muy parecidos, se suele llamar cancelación catastrófica. La can-
celación catastrófica solo puede ser evitada si anticipamos su posible aparición.
y, por tanto,
|f (x) − f (x̃)| |f 0 (x̃)| |x − x̃|
≈ |x| ,
|f (x)| |f (x)| |x|
de donde
|f 0 (x̃)|
Er (f (x̃)) ≈ |x| Er (x̃). (4.12)
|f (x)|
El error relativo en la evaluación de la expresión f (x) en un valor x̃ ≈ x está deter-
minado por el error relativo de la aproximación, Er (x̃) y el llamado factor de amplifi-
cación de la expresión f (x) en el punto x,
|f 0(x̃)|
Af = |x|.
|f (x)|
Finalmente, mostraremos ahora cómo utilizar (4.12) para decidir entre diversas
expresiones alternativas.
4.5. INESTABILIDAD NUMÉRICA 112
√
Ejemplo 4.4.4. Para calcular ( 2−1)6 se puede utilizar cualquiera de las expresiones
siguientes (se deja como ejercicio probar que todas son equivalentes):
1 √ 1 √ 1
√ ; (3 − 2 2)3 ; √ ; 99 − 70 2 i √ .
( 2 + 1)6 (3 + 2 2)3 99 + 70 2
Queremos calcular el resultado de esta operación con aritmética de precisión finita
con β = 10 y t = 5. Se trata de decidir cuál de todas las fórmulas anteriores es
computacionalmente más adecuada. Definimos
1
f0 (x) = (x − 1)6 ; f1 (x) = ; f2 (x) = (3 − 2x)3 ;
(x + 1)6
1 1
f3 (x) = ; f4 (x) = 99 − 70x; f5 (x) = ,
(3 + 2x)3 99 + 70x
y evaluamos el factor de amplificación que corresponde a cada fi ,
|fi0 (x̃)| √
Ai = |x|, x, x̃ ≈ 2.
|fi (x)|
√
Como 2 = 1,41421356237310, si trabajamos con t = 5 (y redondeo), tenemos
x̃ = 1,4142 con |Er (x̃)| ≈ 5 · 10−5 y, por tanto, |Er (f (x̃))| ≈ Ai · 5 · 10−5 . Los
cálculos con todas las expresiones se recojen en la tabla siguiente:
i Ai fi (1,4142) Error absoluto Error relativo
0 2,05 · 101 5,0496 · 10−3 1,03 · 10−6 2,05 · 10−4
1 3,51 · 100 5,0508 · 10−3 1,66 · 10−7 3,29 · 10−5
2 4,95 · 101 5,0530 · 10−3 2,37 · 10−6 4,68 · 10−4
3 1,46 · 100 5,0508 · 10−3 1,66 · 10−7 3,29 · 10−5
4 1,96 · 104 6,0000 · 10−3 9,49 · 10−4 1,88 · 10−1
5 5,0 · 10−1 5,0508 · 10−3 1,66 · 10−7 3,29 · 10−5
Z 1
xn
yn = , n = 0, 1, 2, . . . (4.13)
0 x+5
Para calcular los términos yn sin hacer ninguna integral, se puede utilizar la fór-
mula recurrente siguiente (la prueba se deja como exercicio).
1
yn+1 + 5yn = . (4.14)
n+1
Z 1
1
y0 = dx = log(x + 5)]10 = log(6) − log(5) = log(6/5). (4.15)
0 x+5
4.5. INESTABILIDAD NUMÉRICA 114
Cuadro 4.3: Cálculo de yn en (4.13) con precisión finita. Segunda columna: con (4.14)
y simple precisión. Tercera columna: (4.14) y doble precisión. Cuarta columna: con
(4.16) e y33 = 0 como valor inicial, con simple precisión. La última columna es la
solución exacta.
inconsistencias a partir de y19 (y19 > y18 ) con resultados absurdos a partir de y22 .
Este proceso recursivo es un ejemplo típico de algoritmo numéricament inestable:
la propagación de los errores en los cálculos acaba por arruinar completamente los
resultados numéricos y obtenemos resultados absurdos.
Este efecto puede ser analizado teóricamente estudiando el efecto de un error con-
creto, por ejemplo el error de redondeo cometido al almacenar el dato inicial y0 , en el
resto del proceso recursivo.
Inicialmente comenzamos con y0∗ = f l(y0 ). Así, si suponemos que las operaciones
siguientes no están afectadas por errores (claramente una idealización), tenemos
y0∗ = y0 +
1
y1∗ = − 5y0∗ = 1 − 5(y0 + ) = y1 − 5
1
1
y2∗ = − 5y1∗ = y2 + 52 ,
2
y es una tarea sencilla probar (por inducción) que
yn∗ = yn + (−1)n 5n .
El efecto del proceso recursivo hace que |Rn ()| = 5n , es decir, produce un crec-
imiento exponencial del error que acaba por invalidar los resultados obtenidos. Es
interesante notar que podemos predecir bastante aproximadamente en qué momento
los resultados numéricos comienzan a ser absurdos. En efecto, si trebajamos con pre-
cisión simple, uR ≈ 6 · 10−8 (mirad la tabla de estándards de l’IEEE), por tanto, el
error inicial verifica
Así, el error arrastrado después de k aplicaciones del proceso recursivo, 5k ||, tiene
el valor siguiente:
k 5 6 7 8 9 10
.
k
5 || 3 · 10−5 1,6 · 10−4 8 · 10−4 4 · 10−3 2 · 10−2 10−1
Ejercicio 4.5.2. Utilizad el mismo mecanismo para predecir a partir de qué índtce se
comenzarán a notar los efectos del crecimiento exponencial del error arrastrado por
el algoritmo recursivo cuando se utiliza doble precisión. Comprobadlo con la tabla
4.3.
4.5. INESTABILIDAD NUMÉRICA 116
Supongamos que se quiere calcular yn para un n fijado, por ejemplo y25 . Co-
mo la relación de recurrencia va hacia atrás, necesitamos comenzar por yn+k , con k
suficientemente grande. La determinación de un k apropiado se puede hacer con el
análisis del arrastre del error. Sabemos que yn → 0, por tanto, para k suficientemente
∗
grande yn+k ≈ 0, y es razonable considerar yn+k = 0 como comienzo del nuevo pro-
∗
ceso iterativo. Con esta aproximación tendremos un error yn+k = yn+k + que, con
la estrategia (4.16), se propaga de la manera siguiente:
∗ 1 1 ∗
yn+k−1 = − yn+k = yn+k−1 −
5 n+k 5
∗
yn+k−2 = yn+k−2 + 2
5
..
.
yn∗ = yn + (−1)k .
5k
Por ejemplo, si δ = 10−5, k = 8 es el menor entero tal que 1/5k < 10−5 . Así, si
comenzamos con y25+8 = 0, calcularemos y25 con un error relativo menor que 10−5 .
Está claro que todos los otros valores yi , i = 24, . . . , 0 también tendrán, por lo menos,
esta exactitud. Los resultados del proceso recurrente con esta estrategia de comienzo
se recojen en la columna 4 de la tabla 4.3. Los resultados con precisión simple o con
doble coinciden con los dígitos que aparecen en la tabla.
4.6. PROBLEMAS 117
4.6. Problemas
Problema 1. Discutid la estabilidad numérica de las expresiones siguientes y dad una
alternativa, si es preciso:
1 1−x
1. − , x ≈ 0.
1 + 2x 1 + x
1 − cos x
2. , x ≈ 0.
x
3. ex − e−x , x ≈ 0.
Problema 2. El año 250 AC, Arquimedes estimó el número π de la manera siguiente:
tomando el círculo de diámetro 1, por tanto, de longitud de la circunferencia π, in-
scribió dentro un cuadrado. El perímetro del cuadrado es menor que la longitud de la
circunferencia y, por tanto, una cota inferior para π. Arquimedes consideró después un
octágono, un 16-ágono, etc., y dobló cada vez el número de lados del polígono inscrito
produciendo cada vez mejores aproximaciones a π. Utilizando polígonos inscritos y
circunscritos de 96 lados pudo demostrar que:
223 22
<π< .
71 7
Si pn es el perímetro del polígono inscrito con 2n lados, hay una fórmula de recur-
rencia para estas estimaciones:
q p
n
pn+1 = 2 2(1 − (1 − (pn /2n )2 ). (4.17)
y0 = e − 1, (4.18)
yn+1 + (n + 1)yn = e. (4.19)
b1 = 1, (4.20)
p
1 + b2n − 1
bn+1 = . (4.21)
bn
1. Provad que lı́mn→∞ bn = 0.
3. A partir de los resultados que se obtienen con el código numérico, ¿dirias que
éste es un algoritmo estable?