Matlab
Matlab
Prólogo 1
3. Representaciones gráficas 23
3.1. Gráficas de funciones discretas . . . . . . . . . . . . . . . . . . . . . . . 23
3.2. Gráficas de funciones analı́ticas . . . . . . . . . . . . . . . . . . . . . . 23
3.3. Algunas opciones gráficas . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4. Gráficos 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.4.1. Curvas en tres dimensiones . . . . . . . . . . . . . . . . . . . . . 27
3.4.2. Superficies 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
IV ÍNDICE GENERAL
4. Cálculo simbólico 31
4.1. Variables simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2. Funciones simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.3. Evaluación de funciones simbólicas . . . . . . . . . . . . . . . . . . . . 34
4.4. Resolución de ecuaciones simbólicas . . . . . . . . . . . . . . . . . . . . 34
4.5. Representación gráfica de funciones simbólicas . . . . . . . . . . . . . . 36
4.6. Funciones simbólicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
6. Programación en Matlab 47
6.1. Prealocación de memoria en matrices y vectores . . . . . . . . . . . . . 47
Bibliografı́a 48
Prólogo.
Este manual tiene como único objetivo el de servir de ayuda a toda aquella persona
que desee llevar a cabo su primera aproximación a Matlab, pretendiendo, ante todo,
ser una guı́a sencilla y concisa a este programa de cálculo. Se definen las funciones
y comandos básicos Matlab, y se le proporciona al lector las herramientas básicas
para la realización de programas sencillos y la representación gráfica de las soluciones
obtenidas.
Este texto surge de la necesidad de proporcionarles a los alumnos universitarios de
primer curso de carreras técnicas o cientı́ficas que se enfrentan a una primera asignatura
de métodos numéricos en las que las prácticas en ordenador se realizan con Matlab, de
un manual de referencia sencillo, breve y de carácter muy básico. Una vez que se tiene
ya un conocimiento de mı́nimos sobre este sofware pueden consultarse otros manuales
más completos u otros textos de introducción a Matlab como los que se dan en la
bibliografı́a que se acompaña.
En este capı́tulo haremos un breve repaso a los comandos y operadores básicos Mat-
lab que nos permitan realizar una primera utilización de este paquete informático a un
nivel de iniciación. Veremos cual es la sintaxis esencial para estos primeros comandos
e instrucciones, sin pretender exponer todas sus amplias potencialidades.
help
Si conocemos el comando que debemos utilizar y queremos tener más información
acerca de él o su sintaxis haremos uso del comando help, por ejemplo,
>> help det
Este comando también nos puede dar información sobre un tema más general, por
ejemplo,
>> help elfun
para obtener un listado de las funciones matemáticas elementales.
Por último, basta hacer simplemente help para obtener un listado de todos los
temas generales sobre los que Matlab nos proporciona ayuda en lı́nea.
lookfor
Cuando no sabemos cual es el nombre del comando que queremos utilizar podemos
hacer una búsqueda mediante el comando lookfor dando una palabra clave que rela-
cionada con la operación que queremos que el comando Matlab que estamos buscando
4 Primeras nociones básicas
ejecute. La búsqueda se lleva a cabo entre todas las primeras lı́neas de los temas de
ayuda, no siendo por tanto necesario que la palabra clave sea un comando Matlab,
por ejemplo,
>> lookfor eigenvalue
diary
Si queremos poder revisar los resultados de una ejecución o guardar los comandos
de una sesión de trabajo podemos hacer uso del comando diary. Para guadar los datos
en el fichero sesion1 haremos,
>> diary sesion1
cuando queramos concluir la salvaguarda de datos escribiremos diary off, pudiendo
continuar nuestra sesión Matlab o guardar las posteriores salidas en pantalla en un
nuevo fichero.
who y otros
Para saber, en cualquier momento de nuestra sesión de trabajo, cuales son las
variables que hemos definidos hasta ese instante teclearemos who. Si se quiere obtener
una información más detallada sobre estas variables (nombre, dimensiones, espacio
ocupado en memoria y tipo -real, compleja, simbólica, cadena de caracteres, . . . -)
haremos whos.
Para borrar todas o alguna de las variables definidas se utilizará el comando clear.
>> aux = 24
aux =
24
>> new = Aux - 3
??? Undefined function or variable ’Aux’.
>> new = aux - 3
new =
21
También podemos utilizar comandos unix más usuales desde la ventana Matlab,
como por ejemplo, ls, cd, pwd entre otros.
Por último es útil saber que podemos movernos hacia atrás y hacia adelante sobre
todos los comandos e intrucciones ya introduciadas mediante la teclas de flecha hacia
arriba “↑” y flecha hacia abajo “↓” del teclado y mover el cursor a izquierda y derecha
sobre los caracteres de la instrucción en la lı́nea de comandos con las correspondientes
teclas de flecha a izquierda “←” y flecha a derecha “→”.
1.2 Operaciones elementales 5
save y load
Si queremos guardar los resultados obtenidos tras una ejecución de una o más
variables utilizaremos el comando save, el cual creará un fichero binario (no de texto),
salvo que añadamos la opción -ascii.
>> save fichdatos x y z
guarda en el fichero fichdatos.mat el valor de las variables x, y, z.
La opcion -append nos permite añadir nuevas variables a un fichero ya existente.
Para recuperar los valores de las variables guardadas en un fichero .mat utilizaremos
el comando load,
este último lı́nea de comando recupera solamente la variable z del fichero de datos
fichdatos.
+ suma,
− resta,
∗ multiplicación,
/ división,
ˆ eleva a la potencia dada.
== igualdad,
<= menor o igual que,
>= mayor o igual que,
∼= distinto que,
< menor que,
> mayor que.
La caracterı́stica diferencial de Matlab respecto a otros lenguajes de programación
reside en el hecho de que estos operadores de relación pueden aplicarse también a
matrices y vectores, realizándose la comparación elemento a elemento y obteniéndose
como resultado una matriz de ceros y unos.
6 Primeras nociones básicas
Cuando las operaciones dentro del bucle deben realizarse mientras se verifique una
determinada condición que depende de valores que se obtienen dentro del propio bucle,
entonces debemos hacer uso del comando while:
while nstep <= nmax while (err > eps1) | (rel > eps2)
... ...
end end
if disc == 0
disp(’Una raiz real doble’)
elseif disc > 0
disp(’Dos raices reales distintas’)
else
disp(’Dos raices complejas conjugadas’)
end
1.7 Impresión en pantalla 7
>> disp(a0)
1
>> disp([a0,b0,alpha])
1.0000 2.0000 1.6543
En este caso el formato de impresión viene dado por %d. Los diferentes formatos vienen
determinados por una de las letras d, i, o, u, x, X, f, e, E, g, G, c, s, ası́,
por ejemplo, %6.2f produce un formato con 5 cifras más la coma decimal, con dos cifras
decimales. En todo caso los formatos en Matlab no tienen la rigidez que, por ejemplo,
en Fortran, ya que en el supuesto de que el valor a imprimir no se ajuste al formato
dado se imprimirá igualmente, aunque quizás no en la forma deseada.
Los caracteres \n, \r, \t, \b, \f producen un cambio de renglón, un retorno de
carro, una tabulación, un retroceso (backspace) y un salto de página, respectivamente.
Para ver más claramente las diferencias entre cada una de estas opciones sustituirlas
en el ejemplo anterior y observar el resultado.
De forma más general el comando fprintf escribe datos formateados en un fichero.
Ası́, por ejemplo, si queremos crear un fichero de texto que contenga una tabla de la
función exponencial entre 0 y 1 haremos:
0.00 1.00000000
0.10 1.10517092
.....
1.00 2.71828183
Recuérdese que para obtener mayor información sobre cualquiera de estos comandos
basta hacer help comando.
8 Primeras nociones básicas
Espaciado
format compact suprime las lı́neas extra,
format loose vuelve a insertar lı́neas extra.
Ejemplos
>> pi >> i
ans = 3.1416 ans = 0 + 1.0000i
>> format long >> j
>> pi ans = 0 + 1.0000i
ans = 3.14159265358979
sin(x) seno de x,
cos(x) coseno de x,
tan(x) tangente de x,
asin(x) arcoseno de x,
log(x) logaritmo en base e de x,
log10(x) logaritmo en base 10 de x,
exp(x) exponencial de x,
sqrt(x) raı́z cuadrada de x,
abs(x) valor absoluto de x,
sinh(x) coseno hiperbólico de x,
cosh(x) seno hiperbólico de x,
round(x) redondea x a un entero,
fix(x) corta x a un entero,
floor(x) toma el entero más cercano a x por defecto,
ceil(x) toma el entero más cercano a x por exceso.
function y=f1(x)
y=x^3-x+5;
Esta función puede ser llamarda por otro programa o función Matlab, o ser uti-
lizada directamente desde la lı́nea de comando. Para evaluar esta función en un punto
podemos hacer
>> y0=f1(5.4);
o bien
>> y0=feval(’f1’,5.4);
Para obtener el cero de f1 más cercano a 5,4 haremos
10 Primeras nociones básicas
>> alpha=fzero(’f1’,5.4);
y para encontrar un cero en un cierto intervalo
>> raiz=fzero(’f1’,[-3,0]);
También podı́amos haber introducido esta función como una función “en lı́nea”
mediante el comando
>> f1 = inline(’x^3-x+5’);
En el caso de introducir la función como una función en lı́nea no tendremos que
poner comillas en la llamada de la función feval ni fzero, es decir, en tal caso es-
cribiremos, por ejemplo, >> raiz=fzero(f1,[-3,0]).
Observemos que la función f1 se ha definido de forma que sólo es aplicable a es-
calares, pero no a vectores o matrices (lo cual constituye una de las grandes potencia-
lidades de Matlab). Para comprobar la afirmación anterior hagamos,
>> x = 0:0.1:1;
>> f1(x) (o bien >> y0=feval(f1,x))
??? Error using ==> inline/subsref
Error in inline expression ==> x^3-x+5
??? Error using ==> ^
Matrix must be square.
Para poder evaluar f1 en vectores o matrices habrá que utilizar en su definición las
operaciones con arrays (dot-operations) que trataremos en el capı́tulo siguiente, pero
de las cuales adelantaremos aquı́ su uso. Ası́, si hacemos,
>> f1 = inline(’x.^3-x+5’);
>> y0=feval(f1,x)
obtendremos los 11 valores que toma la función f1 en los puntos dados por las coorde-
nadas del vector x.
Si queremos definir mediante Matlab una función dada a trozos, como por ejemplo
la función definida por
x+1
x≤0
f (x) = 1 − (1/8) x2(3 − x) 0 ≤ x ≤ 2
1/2 x≥2
function y = f(x)
ym = 1.0 - 0.125*x.^2.*(3.0-x);
y1 = (x+1).*(x <= 0);
y2 = ( (x <= 2) - (x < 0) ).*ym;
y3 = 0.5*(x > 2);
y = y1 + y2 + y3;
1.11 Operaciones con polinomios 11
>> p=[1 0 -2 3 4]
p = 1 0 -2 3 4
>> r = roots(p)
r = 1.2428 + 1.0715i
1.2428 - 1.0715i
-1.4856
-1.0000
>> q = poly(r)
q = 1.0000 0.0000 -2.0000 3.0000 4.0000
>> p = [1 -2 3 4]; q = [1 2 1 4]
>> s = conv(p,q)
s = 1 0 0 12 3 16 16
>> ps = p + s
??? Error using ==> +
Matrix dimensions must agree.
Ası́ pues, para poder sumar estos dos polinomios, habrá que escribir:
>> ps = [0 0 0 p] + s
ps = 1 0 0 13 1 19 20
Por tanto, para realizar esta la suma de polinomios cualesquiera de forma completa-
mente automática habrá que escribir un programa Matlab que lleve a cabo esta tarea.
Sin embargo, todavı́a no estamos preparados para escribir este programa.
>> polyval(ps,3)
ans = 1166
Capı́tulo 2
2. >> A=[1 2 3
4 5 6
7 8 9]
Podemos generar algunas matrices particulares de forma sencilla, por ejemplo, si
una determinada matriz debe inicializarse a ceros o a unos haremos
>> B = zeros(3,5);
>> C = zeros(4);
>> D = ones(size(B));
En caso de aparecer un solo parámetro la matriz será cuadrada. En el tercer ejemplo
se genera una matriz de unos del tamaño de la matriz B ya definida.
Para crear vectores se puede actuar de forma análoga o también podemos generar
vectores dando valores para sus coordenadas equiespaciados (útil, por ejemplo, a la
hora de representar las abscisas para una función discreta) de cualquiera de las dos
formas siguientes:
>> x=0:0.1:10;
>> x=linspace(0,10,101);
14 Operaciones con vectores y matrices
Si, por ejemplo, queremos invertir el orden de las filas de la matriz haremos
>> B=A(3:-1:1,:)
B =
7 8 9
4 5 6
1 2 3
donde los dos puntos indican que se toman todas las columnas, es decir, serı́a equiva-
lente, en este caso, a escribir 1:3.
Si quisieramos construir una matriz que fuese el resultado de tomar todas las filas
de A y sólo las dos primeras columnas y añadirle la primera y tercera columnas de B
harı́amos
Para extraer de esta última matriz una matriz 2 × 2 con los coeficientes de la segunda
y tercera filas y las columnas primera y tercera harı́amos
También podemos utilizar un array ya existente para extraer submatrices de una matriz
dada, por ejemplo,
Para construir un vector a partir de la matriz A que sea el resultado de ir tomando sus
columnas de forma consecutiva harı́amos (donde tomamos la traspuesta para tener un
vector fila en lugar de un vector columna).
2.3 Operaciones con vectores 17
>> v=A(:)’
v =
1 4 7 2 5 8 3 6 9
>> A(:,2)=[]
A =
1 3
4 6
7 9
>> A(2,:)=[]
A =
1 3
7 9
y, por último, para sustituir la segunda fila de la matriz anterior con los coeficientes
del vector C escribirı́amos
>> A(2,:)=C
A =
1 3
3 1
>> a = 2;
>> u = [ 1 2 3 ];
>> v = [ 2 4 1 ];
>> u*v
??? Error using ==> *
Inner matrix dimensions must agree.
>> u*v’
ans =
13
y haciendo
>> u’*v
ans =
2 4 1
4 8 2
6 12 3
>> A = [ 1 2 0; 4 5 6 ; 7 8 9]
A =
1 2 0
4 5 6
7 8 9
>> B = A’
B =
1 4 7
2 5 8
0 6 9
>> C = A*B
C =
5 14 23
14 77 122
23 122 194
>> D=A.*B
D =
1 8 0
8 25 48
0 48 81
A2=A^2
A2 =
9 12 12
66 81 84
102 126 129
AA=A.^2
AA =
1 4 0
16 25 36
49 64 81
Recordemos hacer help comando para tener más detalles sobre cada uno de estos
comandos ası́ como sobre sus sintaxis.
>> D = inv(A)
D =
-0.3333 -2.0000 1.3333
0.6667 1.0000 -0.6667
-0.3333 0.6667 -0.3333
2.6 Resolución de sistemas lineales 21
>> d = det(A)
d =
9
>> rank(A)
ans =
3
A x = b.
Para ello, en primer, lugar habrá que introducir la matriz A de coeficientes y el vector
b conteniendo el segundo miembro de alguna de las formas que se han visto en este
capı́tulo. Por ejemplo, si tomamos la matriz A ya definida y cuyo determinante hemos
visto que es distinto de cero, y como segundo miembro tomamos
>> b = [3; 4; 6]
b =
3
4
6
A continuación podemos resolver el sistema lineal de varias maneras. Una serı́a uti-
lizando la matriz inversa, aunque este método no es en general recomendable, ya que
el cálculo de la inversa de una matriz sólo debe realizarse si se necesita explı́citamente.
>> x = inv(A)*b
x =
-1.0000
2.0000
-0.3333
La forma más adecuada y eficiente de resolver un sistema lineal es mediante la uti-
lización del operador ”división”(\) o del operador ”división inversa”(/). Ambos ope-
radores producen idénticos resultados salvo que el primero nos proporciona un vector
columna y el segundo un vector fila.
>> x = A\b >> x = b’/A’
x = x =
-1.0000 -1.0000 2.0000 -0.3333
2.0000
-0.3333
22 Operaciones con vectores y matrices
Capı́tulo 3
Representaciones gráficas
En este tema daremos los comandos básicos para realizar unas primeras representa-
ciones gráficas con Matlab. Evidentemente no trataremos todas las potencialidades
de Matlab en el campo gráfico que son muy amplias.
>> x = [0 1 2 3 4 5];
>> y = [3 5 -2 1 0 4];
>> plot(x,y)
Si no se indica nada plot une los puntos de la gráfica mediante una lı́nea continua
negra. Para cambiar el tipo de lı́nea o el color escribiremos, por ejemplo,
>> plot(x,y,’xg’)
para obtener los datos de la gráfica marcados con una equis y en color verde. Para ver
las posibilidades disponibles ver la tabla 3.1.
Cuadro 3.1: Estilos y colores para las representaciones gráficas. Comando plot.
>> x = 0:0.1:2*pi;
>> y = cos(x);
>> plot(x,y)
O también
>> x = linspace(0,2*pi,101);
>> plot(x,cos(x))
de representación para la gráfica a la que hace referencia. Otras opciones para este
comando son:
>> x = 0:0.1:2*pi;
>> plot(x,cos(x),’--’,x,sin(x),’-o’)
>> axis([0 2*pi -1 1])
>> legend(’coseno’,’seno’)
>> text(0.8,0.2,’cos(x)’)
>> text(3,0.2,’sen(x)’)
>> title(’Graficas de las funciones seno y coseno’)
>> xlabel(’eje de abscisas’)
26 Representaciones gráficas
0.6
−0.2
−0.4
−0.6
−0.8
−1
0 1 2 3 4 5 6
eje de abscisas
Si queremos representar una nueva gráfica en una nueva ventana sin perder la que
ya tenemos utilizaremos el comando figure. Para borrar la última figura haremos clf.
También en una misma figura pueden aparecer varias gráficas con sus correspon-
dientes ejes. Esto se consigue con el comando subplot. Veamos la utilización de este
comando junto a otros ya estudiados mediante el siguiente ejemplo, cuyo resultado
aparece en la figura 3.2.
2
0.5 0.5 10
0 0
1
10
−0.5 −0.5
0
−1 10
0 2 4 6 0 2 4 6 0 2 4 6
Otra funcion
5
(d) x² exp(x)
0
−5
−10
−15
−20
−25
0 1 2 3 4 5 6 7
3.4. Gráficos 3D
3.4.1. Curvas en tres dimensiones
El equivalente del comando plot para gráficas en tres dimensiones es el comando plot3
cuya sintaxis es también análoga a la de áquel pero donde habrá que dar ahora tripletas de
datos. Veámoslo mediante el siguiente ejemplo, cuyo resultado gráfico aparece en la figura
3.3.
>> x = linspace(0,10*pi);
>> plot3(x,sin(x),cos(x),’x-’)
>> title(’Helice’,’FontSize’,24)
>> xlabel(’x’,’FontSize’,18), ylabel(’sen(x)’,’FontSize’,18)
>> zlabel(’cos(x)’,’FontSize’,18)
En esta gráfica hemos aumentado el tamaño de letra utilizada para el tı́tulo y las etiquetas de
los ejes para que fueran legibles al insertar el fichero postscript que nos proporciona Matlab
en el documento LATEXque genera este texto.
Por último observar que todos los comandos vistos para gráficas 2D se aplican de forma
análoga para las gráficas en tres dimensiones (axis, text, legend, etc.).
28 Representaciones gráficas
Hélice
0.5
cos(x)
0
−0.5
−1
1
0.5 35
30
0 25
20
15
−0.5 10
5
−1 0
sen(x) x
3.4.2. Superficies 3D
Para poder representar gráficamente una superficie tridimensional mediante Matlab es
necesario definir en primer lugar una malla rectangular1 en el plano x − y y debemos conocer
el valor de la coordenada z en los nodos (intersecciones) de esa malla. Esto hará necesario
utilizar técnicas de interpolación cuando los datos de la superficie que queremos representar
vengan dados de cualquier otra forma que no sea la descrita.
Veamos como representarı́amos la superficie definida por una función de dos variables
z = f (x, y). En primer lugar habrá que definir la malla donde se evaluará la función. Esto se
hace mediante el comando meshgrid de la siguiente forma:
>> x = -10:0.5:10;
>> y = x;
>> [xm,ym] = meshgrid(x,y);
√
sen x2 +y 2
Consideremos, por ejemplo, la función f (x, y) = √ 2 2 , que debemos evaluar en los nodos
x +y
de la malla.
>> mesh(xm,ym,zm)
0.8
0.6
0.4
0.2
−0.2
−0.4
10
5 10
5
0
0
−5
−5
−10 −10
Figura 3.4: Gráfica de una superficie definida por z = f (x, y) (comando mesh).
Para realizar la representación gráfica de una superficie que pasa una nube de puntos
3D arbitraria es necesario, en primer lugar interpolar los datos sobre una malla, para luego
representar la superficie de forma estándard. Veámos los pasos a seguir mediante un ejemplo.
Como indicábamos al principio las posibilidades gráficas de Matlab son amplias y, por
tanto, existen también un gran número de comandos. A continuación nos limitamos a enu-
merar algunos de los que consideramos pueden sernos de alguna utilidad (aunque podremos
“vivir sin ellos”). No hay que olvidar que, si en cualquier momento, estamos interesados en
conocer la sintaxis exacta de cualquiera de estos comandos u otros, ası́ que acción realizan,
bastará hacer help comando en una ventana Matlab.
30 Representaciones gráficas
15
10
5
20
15 20
15
10
10
5
5
0 0
Figura 3.5: Representación de la superficie que pasa por una nube de puntos 3D.
Cálculo simbólico
>> d= det(A)
d =
-a*c*x+c*b*x
Diferenciación
Para diferenciar (en este caso respecto de x1 ) esta expresión simbólica basta hacer
>> diff(f)
ans = 2*a*x+b+cos(x)-x*sin(x)
1
El comando diff de Matlab calcula la derivada respecto de la variable simbólica que hallamos
definido más próxima a la x en el alfabeto.
32 Cálculo simbólico
>> diff(f,a)
ans = x^2
>> diff(f,2)
ans = 2*a-2*sin(x)-x*cos(x)
También podemos diferenciar cada una de las componentes de una matriz simbólica me-
diante el comando diff,
Por último comentar que Matlab permite, mediante el comando jacobian(f,v), calcu-
lar la matrix Jacobiana del escalar o vector f con respecto al vector v (hacer help jacobian
para ver algún ejemplo).
Integración
Para integrar una función simbólica haremos
>> int(f)
ans = 1/3*a*x^3+1/2*b*x^2+c*x+cos(x)+x*sin(x)
este comando nos proporciona una primitiva a la cual habrá que añadirle una constante
arbitraria. Para el cálculo de integrales definidas la sintaxis del comando serı́a,
>> int(f,0,2)
ans = 8/3*a+2*b+2*c+cos(2)+2*sin(2)-1
>> int(f,a)
ans = 1/2*a^2*x^2+b*x*a+c*a+x*cos(x)*a
Lı́mites
La herramienta de cálculo simbólico de Matlab nos permite calcular el lı́mite de funciones
de forma sencilla, por ejemplo,
>> syms h
>> limit((sin(x+h) - sin(x))/h,h,0)
ans = cos(x)
>> syms n
>> limit((1 + x/n)^n,n,inf)
ans = exp(x)
En el caso de estar interesados en calcular lı́mites laterales se usarán las opciones ‘left’
y ‘right’, ası́ se tiene,
>> limit(1/x,x,0)
ans = NaN
>> limit(1/x,x,0,’left’)
ans = -inf
>> limit(1/x,x,0,’right’)
ans = inf
Suma simbólica
Podemos realizar sumas simbólicas, cuando éstas existan, usando el comando symsum, por
ejemplo,
>> s1 = symsum(1/n^2,1,inf)
ans = 1/6*pi^2
>> s2 = symsum(x^n,n,0,inf)
ans = -1/(x-1)
Series de Taylor
El comando taylor(f,n,a) nos permite obtener el desarrollo de Taylor de grado n de la
función f en el punto x0 = a. Ası́, por ejemplo,
>> h = exp(x);
>> T = taylor(h,6)
T = 1+x+1/2*x^2+1/6*x^3+1/24*x^4+1/120*x^5
>> pretty(T)
Nota: los comandos subs, double y ezplot se estudiarán en los apartados 4.3 y 4.5.
34 Cálculo simbólico
>> subs(f,x,6)
ans = 36*a+6*b+c+6*cos(6)
Se tiene ahora una expresión simbólica que depende sólo de la variable x. Si ahora queremos
evaluar esta función en un punto dado, por ejemplo x = 3,5, tendremos hacer una nueva
sustitución mediante el comando subs,
El resultado es un vector simbólico cuyos elementos son las dos soluciones de la ecuación de
segundo orden.
Si queremos resolver la misma expresión pero para otra variable, por ejemplo para la
variable b haremos
2
Hacer findsym(f) para saber cuales son estas variables
4.4 Resolución de ecuaciones simbólicas 35
>> solve(f,b)
>> dsolve(’Dy=y+y^2’)
ans = 1/(-1+exp(-t)*C1)
>> y = dsolve(’Dy=y+y^2’,’y(0)=1’)
y = 1/(-1+2*exp(-t))
>> y = dsolve(’D2y=-y’,’x’)
y = C1*sin(x)+C2*cos(x)
o también,
>> x = [0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1.];
>> y = [0.34 2.39 4.33 6.87 7.56 8.88 9.01 10.77 9.33 9.05 12.1];
>> plot(x,y,’o-’)
>> p = polyfit(x,y,2)
p =
-11.9103 21.8821 0.5576
Si queremos ahora representar el polinomio de segundo grado que hemos obtenido como mejor
aproximación mı́nimo cuadrado de estos datos haremos uso del comando polyval:
La figura 5.1 nos presenta los datos y la gráfica del polinomio de segundo grado que los ajusta
en el sentido de los mı́nimos cuadrados.
Si ahora queremos comparar esta aproximación con el ajuste polinómico de grado 10 (es
decir con la interpolación de Lagrange de los datos) harı́amos:
14
20
12
18
16
10
14
8
12
10
6
4
6
4
2
0
0 0.2 0.4 0.6 0.8 1 0 0.2 0.4 0.6 0.8 1
5.2. Interpolación 1D
La diferencia entre interpolación y ajuste polinómico reside en que en la interpolación
nuestros datos son esencialmente correctos y lo que se pretende es construir una función cuya
gráfica pase por esos puntos y que nos permita describir el comportamiento de la variable
representada en los puntos intermedios.
El ejemplo más sencillo de interpolación (lineal a trozos) es la forma en que Matlab
realiza sus gráficas. Ası́ para valores intermedios entre dos datos la interpolación lineal a
trozos supone un valor dado por la recta que une los dos puntos contiguos dados por los
datos. Obviamente cuanto mayor sea el número de puntos considerados y menor la distancia
entre ellos, mejor será la aproximación a la función subyacente. Veamos esto con un ejemplo.
0.8
0.6
0.4
0.2
−0.2
−0.4
−0.6
−0.8
−1
0 1 2 3 4 5 6
x 60 65 70 75 80
sen(x) 0.866025 0.906308 0.939693 0.965926 0.984808
Para aproximar el valor del sen(72) a partir de estos datos podemos seguir varias estrate-
gias de interpolación. Veamos algunas de ellas.
Por último, si quisiéramos llevar a cabo una interpolación de Lagrange de grado 4 cons-
truyendo el polinomio de grado n = 4 que pasa por los n + 1 datos suministrados, harı́amos
uso del comando polyfit. Ası́ pues, bastarı́a hacer,
>> format long % Formato largo para que no parezca que varios
% coeficientes del polinomio son cero
>> ps = polyfit(x,sx,4)
>> ps =
Columns 1 through 4
0.00000000366667 -0.00000132866667 0.00002808833333 0.01653771666672
Column 5
0.01211599999911
42 Ajuste de curvas e interpolación
También se pueden realizar interpolaciones de Lagrange de menor grado (no merece la pena
hacer interpolaciones lineal o cúbica pues esto, como ya lo hemos visto, lo hace Matlab
de forma automática y es de esperar que también de forma óptima, mediante el comando
interp1). Probemos por ello a construir el polinomio de interpolación de grado 2 que interpola
la función seno en x0 = 65, x1 = 70, x2 = 75.
>> xx = x(2:4);
>> sxx = sx(2:4);
>> pss = polyfit(xx,sxx,2)
pss =
-0.00014304000000 0.02598740000000 -0.17852900000002
>> s72 = polyval(pss,72)
s72 =
0.95104444000000
Si queremos conocer el valor que Matlab calcula para el sen(72) con 15 cifras significa-
tivas basta teclear,
5.3. Interpolación 2D
Veremos a continuación los comandos básicos que nos van a permitir resolver problemas
de interpolación en el plano. Los valores a interpolar podrán venir dados bien por una nube
de puntos distribuidos de forma regular o arbitraria, o bien dados por una función z = f (x, y)
discretizada.
En el caso de que los datos estén dados en todos los nodos de un mallado rectangular,
entoces el problema de la interpolación bidimensional se resuelve fácilmente con Matlab.
Veámoslo con un ejemplo. Supongamos que tenemos los valores de una cierta variable dados
en los nodos equidistribuidos de una malla del rectángulo [0, 5] × [0, 4], por ejemplo,
>> z = [ 9 10 9.5 8 10 11
8 11 10.5 11.5 9 9
7 9 11 10 10 8
9 10 10.5 11 10.5 9
10 9 8.5 9 8 8];
5.3 Interpolación 2D 43
>> mesh(x,y,z)
cuyo resultado puede verse en la figura 5.3. Ahora para obtener el valor interpolado en un
11.5
11
10.5
10
9.5
8.5
7.5
7
4
3 5
4
2 3
1 2
1
0 0
Figura 5.3: Comando mesh para representar datos dados sobre una malla rectangular.
>> zi = interp2(x,y,z,3.5,2.8)
zi =
10.6000
La interpolación utilizada por defecto es la lineal pero también podemos utilizar interpolación
cubica, cubic, o la interpolación que toma como valor en el punto dado el del nodo más
próximo, nearest, por ejemplo,
>> zi = interp2(x,y,z,3.5,2.8,’cubic’)
zi =
10.8975
En el caso de que queramos interpolar los valores dados en una malla más fina haremos lo
siguiente:
12
11
10
6
4
3 5
4
2 3
1 2
1
0 0
La figura 5.4 nos presenta el resultado obtenido tras introducir esta serie de comandos.
Por último veamos que harı́amos en el caso en que los datos vinieran dados en un con-
junto de puntos distribuidos de manera no regular. Para ello consideraremos un ejemplo que
consistirá en la representación gráfica de los datos de profundidades en la zona del Golfo de
Cádiz, Estrecho de Gibraltar y Mar de Alborán. Supondremos que estos datos batimétricos
están contenidos en el fichero batimetria.dat en tres columnas conteniendo la coordenada
x, la coordenada y y la profundidad z, respectivamente. Para ello en primer lugar habrá que
abrir el fichero con el comando fopen, habrá que proceder a la lectura del fichero con el
comando fscanf y para concluir con la lectura de los datos habrá que cerrar el fichero con
el comando fclose. Más concretamente haremos,
Mediante el comando fscanf procedemos a la lectura del fichero formateado que tiene por
identificador el valor de la variable fid y procedemos a la lectura de sus 3 columnas y de
todas sus filas ([3, inf]).
A continuación llamamos xd, yd y zd a las coordenadas x e y de los puntos y a sus
profundidades, respectivamente.
>> xd=B(1,:);
>> yd=B(2,:);
>> zd=B(3,:);
Una vez extraidos los datos generamos una malla rectangular que contega a todos es-
tos puntos mediante el comando meshgrid e interpolamos las profundidades en esta malla
mediante el comando griddata. Ahora ya es posible representar gráficamente la batimetrı́a
haciendo uso del comando mesh o alguna de sus variantes. Es decir, tendrı́amos que hacer,
5.3 Interpolación 2D 45
120
100
80
60
40
20
0
−50 0 50 100 150 200
500
0
−500
−1000
−1500
−2000
120
100
80 140 160
60 80 100 120
40 40 60
20 0 20
0 −40 −20
Figura 5.5: Comando mesh para representar datos dados sobre una malla rectangular.
46 Ajuste de curvas e interpolación
Capı́tulo 6
Programación en Matlab
x = random(’norm’,10,2,1,100);
sx = zeros(size(x))
for i = 1:lenght(x)
if x(i) > 0
sx(i) = sqrt(x(i));
end
end
48 Bibliografı́a
Bibliografı́a
[2] Inc. The MathWorks. Matlab. Edición de Estudiante. Versión 4. Prentice Hall, 1996.
[3] Inc. The MathWorks. The Student Edition of Matlab. Version 5 User’s Guide. Prentice
Hall, 1997.
Índice alfabético