Beruflich Dokumente
Kultur Dokumente
Encargados de la serie:
Resumen
Se desarrollan los comandos básicos para el uso del software MATLAB, enseguida
Magíster en Finanzas, Universidad del Pacífico. B. Sc. Economía, UNMSM. Profesor Auxiliar del
Departamento de Economía de UNMSM. Investigador asociado al Instituto de Investigaciones FCE –
UNMSM. Investigador asociado al Instituto de Estudios Sociales del Rímac. Contacto:
aayalal1@unmsm.edu.pe
Serie Apuntes de Clase ΩΒΓ N° 3. Marzo de 2015. FCE / UNMSM
I. INTRODUCCIÓN.
Interface de Matlab
Array
Cadena de texto
Función anónima
Función personalizada
y matrices.
diary NombredelArchivo.txt
diary off
ejemplo los formatos en que se muestra pi bajo el formato short, long, rat y bank
son:
format short 3.1416
format long 3.141592653589793
format rat 355/113
format bank 3.14
Construcción de matrices
La forma más sencilla de declarar una matriz compuesta por un array o arreglo es
declarar sus elementos uno por uno entre brackets [] (Alt+91, Alt+93). Para
1
El archivo generado se grabará en el directorio de trabajo actual y se mostrará en la ventana Current
Folder.
separar los elementos de la misma fila se usan espacios o comas, para separar filas
A = [1 2 3; 4 5 6; 7 8 9]
Es la siguiente matriz:
1 2 3
⌈4 5 6⌉
7 8 9
A 3x3 72 double
A 3x3 72 double
ans 1x6 48 double
s 1x5 10 char
x 1x1 8 double
Accediendo a sub-matrices
B =
0.5797 0.5132 0.2400 0.4893
0.5499 0.4018 0.4173 0.3377
0.1450 0.0760 0.0497 0.9001
0.8530 0.2399 0.9027 0.3692
Obtenemos las primeras cuatro filas de A, en este caso se muestra una matriz de
4x6:
A(1:4,:)
ans =
0.7943 0.6541 0.9133 0.4427 0.8687 0.9106
0.3112 0.6892 0.1524 0.1067 0.0844 0.1818
0.5285 0.7482 0.8258 0.9619 0.3998 0.2638
0.1656 0.4505 0.5383 0.0046 0.2599 0.1455
0.7482 0.8258
0.4505 0.5383
0.0838 0.9961
0.2290 0.0782
B:
A(:,[2 4 6]) = B(:,1:3)
A =
0.7943 0.5797 0.9133 0.5132 0.8687 0.2400
0.3112 0.5499 0.1524 0.4018 0.0844 0.4173
0.5285 0.1450 0.8258 0.0760 0.3998 0.0497
0.1656 0.8530 0.5383 0.2399 0.2599 0.9027
0.6020 0.6221 0.9961 0.1233 0.8001 0.9448
0.2630 0.3510 0.0782 0.1839 0.4314 0.4909
matriz B:
A(:,[2 4 6]) = B(:,[1 3 4])
A =
0.7943 0.5797 0.9133 0.2400 0.8687 0.4893
0.3112 0.5499 0.1524 0.4173 0.0844 0.3377
0.5285 0.1450 0.8258 0.0497 0.3998 0.9001
0.1656 0.8530 0.5383 0.9027 0.2599 0.3692
0.6020 0.6221 0.9961 0.9448 0.8001 0.1112
0.2630 0.3510 0.0782 0.4909 0.4314 0.7803
Agregar una última fila a la matriz A, formada por los elementos 0.34 0.28 0.14 0.53
0.62 y 0.12.
A = [A; 0.34 0.28 0.14 0.53 0.62 0.12]
A =
0.7943 0.5797 0.9133 0.2400 0.8687 0.4893
0.3112 0.5499 0.1524 0.4173 0.0844 0.3377
0.5285 0.1450 0.8258 0.0497 0.3998 0.9001
0.1656 0.8530 0.5383 0.9027 0.2599 0.3692
0.6020 0.6221 0.9961 0.9448 0.8001 0.1112
0.2630 0.3510 0.0782 0.4909 0.4314 0.7803
0.3400 0.2800 0.1400 0.5300 0.6200 0.1200
randn(3,3)
L =
2.7694 0.7254 -0.2050
M = randn(3,6)
M =
1.4090 -1.2075 0.4889 -0.3034 0.8884 -0.8095
1.4172 0.7172 1.0347 0.2939 -1.1471 -2.9443
0.6715 1.6302 0.7269 -0.7873 -1.0689 1.4384
rand(4)
ans =
0.6797 0.4984 0.2238 0.6991
0.6551 0.9597 0.7513 0.8909
0.1626 0.3404 0.2551 0.9593
0.1190 0.5853 0.5060 0.5472
eye(5)
C =
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
eye(5,4)
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
0 0 0 0
0 0 0 0
diag(A)
ans =
1
5
9
diag(diag(A))
ans =
1 0 0
0 5 0
0 0 9
Otra forma de crear una matriz con el comando diag, es incluir en el comando un
vector (no una mattriz), se crea una matriz cuadrada con la diagonal declarada.
diag(5 6 11 8)
ans =
5 0 0 0
0 6 0 0
0 0 11 0
0 0 0 8
triu(A)
ans =
1 2 3
0 5 6
0 0 9
triu(A,1)
ans =
0 2 3
0 0 6
0 0 0
tril(A)
ans =
1 0 0
4 5 0
7 8 9
<!> Este comando es muy útil para construir matrices especiales en base a la
rand(size(A))
ans =
0.1966 0.4733 0.5853
0.2511 0.3517 0.5497
0.6160 0.8308 0.9172
randn(size(A))
ans =
-1.4916 2.3505 -0.1924
-0.7423 -0.6156 0.8886
-1.0616 0.7481 -0.7648
eye(size(A))
ans =
1 0 0
0 1 0
0 0 1
B = [zeros(3,4) ones(3,3)]
ans =
0 0 0 0 1 1 1
0 0 0 0 1 1 1
0 0 0 0 1 1 1
En la primera fila, obtener los elementos desde la tercera hasta la última columna
B(1,3:end)
ans =
0 0 1 1 1
En la tercera fila, obtener los elementos desde la segunda columna hasta la última
B(3,2:end)
ans =
0 0 0 1 1 1
<!> (Los dos puntos (:) en el comando funcionan como: “todos los elementos de
expande.
B(:,8) = -1
B =
1 1 1 -1 1 1 1 -1
0 0 0 -1 1 1 1 -1
0 0 0 -1 1 1 1 -1
Dada una matriz P = [1, 4, 6; 0, 0, 2], find encontrará los índices de los
elementos de P no cero:
I = find(P)
I =
1
3
5
6
<!> Observe que find “cuenta” a través de las columnas, en forma vertical de
izquierda a derecha2:
segundo está en la segunda columna, como hay dos filas en la matriz, 4 es el tercer
elemento diferente de 0.
obtenemos un vector):
2
MATLAB almacena en memoria las matrices introducidas como un vector columna.
find(F>2)
ans =
2
3
Ejercicios 1.
Cree una matriz fila A, a partir de un array de 1x6 en el que cada elemento es igual
Cree una matriz fila B, a partir de un array de 1x6 en el que cada elemento es igual
Una las matrices A y B anteriores, tal que las filas de A estén “encima” de las de B.
C = [A; B]
Cree una matriz con los elementos de las columnas 1, 3 y 5 de la segunda fila de A
y la primera fila de B.
Cree una matriz de 9x9 que tenga como diagonal principal unos, luego mediante
2 2 2 0 5 5 5
2 2 2 0 5 5 5
3 3 3 0 5 5 5
𝐵= 0 0 0 1 0 0 0
4 4 7 0 9 9 9
4 4 7 0 9 9 9
[4 4 4 0 9 9 9]
primera, segunda y quinta columnas sean ceros y la segunda y cuarta sean unos.
Crear una matriz A de 3x3 en la cual todos los elementos son 1, y otra matriz B de
2x2 en la que todos los elementos sean 5. Luego sume elementos a la matriz A
1 1 1 0 0
1 1 1 0 0
𝐴= 1 1 1 0 0
0 0 0 5 5
[0 0 0 5 5]
Dado el siguiente array: array1 = [5 6.5 2.1 4 9 pi], (a) obtener otro array que
contenga el primer y cuarto elemento del array 1, (b) obtener otro array que
1 2 1 0 3
10 3 1 4 0
𝐴 = −5 14 0 0 −1
−2 21 0 2 5
[ 3 −8 0 5 𝑝𝑖 ]
(a) Obtener una matriz que contenga la primera, tercera y quinta columna de A, (b)
Obtenga una matriz que incluya los elementos de la primera fila de A, (c) Obtenga
una matriz que incluya los elementos de la segunda fila de A, desde la segunda
columna hasta la quinta, (d) Obtenga una matriz que incluya los elementos de la
cuarta columna, de las filas 1, 3 y 5. (e) Obtenga una matriz que incluya los
Obtener:
A - 3*D
Sea:
b = [0; 1; -1]
B=[1 -1 1;1 1 1]
Obtener:
Ab = A*b
BA = B*A
La traza de A:
trace(A)
En el siguiente sistema:
4x – 2y + 6z = 8
2x + 8y + 2z = 4
6x + 10y + 3z = 0
A =
B =
x = A\B
o alternativamente:
H = [G diag([1 1])]
H =
2 5 1 0
1 3 0 1
Ejercicios 2.
A = [4 -2 1; 7 3 0; 2 0 1]
B = [1 -1 2; 1 0 3; 4 0 2]
inversa de:
0 −2 −3 1 2 3 1 2 −1
𝐴= [1 3 3] 𝐵 = [−1 0 4] 𝐶 = [−3 4 5]
−1 −2 −2 0 2 2 −4 2 6
4 −2 1 1 0 0 1 −1 2
𝐷 = [7 3 0] 𝐸 = [0 0 1 ] 𝐹 = [1 0 3]
2 0 1 0 1 0 4 0 2
Operador :
ejemplo:
x = 1:8
x =
1 2 3 4 5 6 7 8
x = 1:2:8
x =
1 3 5 7
<!> Observe que el quinto elemento del nuevo array sería 9, sin embargo dado que
el número máximo determinado fue 8, y este mismo número no está en la nueva
serie, no se incluye ambos números en el nuevo array.
Otra forma de obtener un array es a través del comando linspace, que crea un
array de una fila, “igualmente espaciado entre dos números. Por ejemplo:
x = linspace(2,9,5)
x =
2 3.75 5.5 7.25 9
primera una variable entera y %f una variable real. \n agrega un salto de línea al
mensaje.
input('Mensaje').
Por ejemplo:
Estructuras de control
sentencias de control de flujo, tales como while, if, for, break o continue.
if
Sea un número a = rand, hagamos que el programa muestre un mensaje ‘Es mayor
a = rand
if a > 0.5
fprintf('%.4f es mayor a 0.5 \n',a)
end
a = rand
a =
0.9561
0.9561 es mayor a 0.5
agregamos la opción else podemos controlar que pasaría en el caso que a sea
menor o igual a 0.50. Nótese que en el mensaje %.4f es reemplazado por el valor
a = rand
if a > 0.5
fprintf('%.4f es mayor a 0.5 \n',a)
else
fprintf('%.4f es menor o igual a 0.5 \n',a)
end
a =
0.0598
0.0598 es menor o igual a 0.5
a = rand
a > 0.5
a es mayor a a es menor a
0.5 0.5
while
La estructura while se utiliza para ejecutar un proceso hasta que una determinada
a, siempre que se cumpla la condición de que sean los 6 primeros elementos del
mismo:
a = 1:7
m = 1
while m < 6
a(m) = a(m)^2
m = m + 1
end
a
Figura 03: Diagrama de flujo de while: se eleva al cuadrado los cinco primeros
elementos del vector a.
a=1:7
m=0
m<6
a(m) = a(m)^2
a
m=m+1
for x = 1:n_exponente
fprintf('%4.2f elevado a %4.2f es: %4.2f \n',n_base, x, n_base^x)
end
Figura 04: Diagrama de flujo de while y for: se eleva al cuadrado el número base
mientras el exponente sea mayor a 0.
n_base
n_exponente
n_exponente < 0
Por favor,
n_exponente tiene
que ser positivo
x = 1 -> n_exponente
N_base^x
for
Se puede utilizar la sentencia for para añadir interactividad con el usuario del
contador = 5
for contador = 0:contador
fprintf('Iteración nº %f, variable contador = %f \n',
contador, contador)
end
Figura 05: Diagrama de flujo de for: se muestra el valor de contador en el bucle for.
Uso de scripts
edit
Ejercicios 3.
Uso de Funciones
Para que la función se pueda invocar debe estar grabada en el Current Folder de
Por ejemplo, se plantea una función para encontrar las soluciones de la ecuación de
polinomio de grado 2. Sabemos que existen dos soluciones, dadas por xi = -b +/-
function[x1,x2] = FormaCuadrada(a,b,c)
d = sqrt(b^2 - 4*a*c);
x1 = (-b + d) / (2*a)
x2 = (-b - d) / (2*a)
Sistemas de ecuaciones
En el siguiente sistema:
4x – 2y + 6z = 8
2x + 8y + 2z = 4
6x + 10y + 3z = 0
x = linsolve(A, v)
también:
x = inv(A)*v
Los vectores propios de una matriz cuadrada A son los vectores no nulos que al
Ax = x
Dado A = [2 4 0; 1 2 1; 0 4 2]
Para B = [0 2 2; 2 0 2; 2 2 0]
eig(B)
Cálculo simbólico
Para que Matlab ‘entienda’ que una variable x se debe tratar como simbólica, se
syms x
2*x^2
f = 2*x^2
diff(f)
También se puede indicar a Matlab que considere una variable particular como
Por ejemplo:
sym(1/2)
P = [2 6 sym(1/2)]
Derivada parcial
En este caso la segunda variable (para calcular la derivada parcial) se usa como
syms x y
g = 2*x^3*y
g1 = diff(g, x)
g2 = diff(g, y)
Integrales
1
Para evaluar la integral ∫0 2𝑥𝑑𝑥 tenemos:
syms x
f = 2*x
int(f, 0, 1)
∞
𝑒 −𝑥 𝑠𝑒𝑛(𝑥)
∫ 𝑑𝑥
𝑥
0
syms x
f = (exp(-x)*sin(x))/x;
int(f, 0, inf)
quad(función, a, b)
quad('sin(x)', 0, pi)
Ejercicios 4.
Dada la siguiente matriz A obtener la submatriz formada por los elementos de las
1 0 2 3
−1 1 0 4
𝐴=[ ]
2 1 −1 3
−1 0 5 7
multiplicándola por b.
5w – 2x – 3y + 3x = 49
w + 3x + 3y – z = -47
Gráficas
puntos_x = linspace(0.5,5,10)
puntos_x =
0.5000 1.0000 1.5000 2.0000 2.5000 3.0000 3.5000
4.0000 4.5000 5.0000
y = exp(puntos_x)
Para obtener un gráfico más preciso, se debe aumentar el número de puntos del eje
puntos_x = linspace(0.5,5,100);
y = exp(puntos_x);
plot(puntos_x,y)
Para importar la data se debe incluir el archivo Excel en el Current Folder y escribir
miDataExcel = xlsread('ApuntesdeClase9');
por ejemplo, en el caso anterior la data está entre B2 y D25, el comando sería como:
miDataExcel = xlsread('ApuntesdeClase9','Hoja1','B2:D25')
A = rand(5,5)
xlswrite('MatrizA.xlsx',A)
Igualmente se puede especificar la hoja en la que se debe grabar los datos y la celda
xlswrite('MatrizA.xlsx',A,'Hoja1','B2')
3.1. Funciones
Las funciones más importantes en teoría microeconómica son sin duda las
function[U] = UtilidadCD(x,y,alpha)
% Calcula la utilidad de una canasta de bienes x e y, dado un
alpha
U = (x^alpha*y^(1-alpha))
sobre un array de valores x, se debe incluir la opción de cálculo “valor por valor”,
agregando un punto luego de la variable sobre la que debe realizarse ese tipo de
condicional if para detectar estos casos e informar al usuario que hay un error en
function[U] = UtilidadCD(x,y,alpha)
3
Asimismo, cuando y varíe se debe agregar un punto después de la referencia del rango de
valores de y. Cuando ambos rangos cambian, se debe agregar un punto después del cálculo de
(x.^alpha), quedando el código completo como: U = (x.^alpha).*(y.^(1-alpha))
puntos_x = 1:1000
y = UtilidadCD(puntos_x,20,0.20)
plot(puntos_x,y)
xlabel('X')
ylabel('U(x)')
Graficas de superficie
comando meshgrid:
[x,y] = meshgrid(1:1:100,1:1:100);
Luego utilizamos la función implementada para definir los valores del eje z, como:
z = UtilidadCD(x,y,0.5)
s = surfl(x,y,z)
En el gráfico anterior alpha era igual a 0.5, en los siguientes gráficos se muestra
Gráficas de contorno
definido sobre los valores anteriores con alpha igual a 0.5, tenemos:
[C,s] = contour(x,y,z,10:10:100)
El primer conjunto de parámetros producen los arrays para el eje x, el eje y, y el eje
parámetro define en un array, que “curvas de nivel” desde U igual a 10 hasta 100,
Cambiando alpha para los casos alpha = 0.2, 0.6 y 0.8, desde z y utilizando el
mercados como:
IS = 6 – 60*i
LM = 0.1 + 90*i
con linspace:
i = linspace(0,0.10,101)
plot(IS,i,LM,i)
xlabel('Ingreso')
ylabel('Tasa de interés')
IS1 = 8 – 60*i
gráficos anteriores:
subplot(1,2,1)
plot(IS,i,LM,i)
subplot(1,2,2)
plot(IS,i,LM,i,IS1,i)
De Pablo (1991), se presenta una versión del modelo clásico a través de una serie
4
Este modelo es inspirado en la versión simplificada del modelo neoclásico, que para fines de simulación se
desarrolla en el texto de Schuldt (2008).
5
El autor recomienda revisar el texto para tener una versión alternativa del conjunto de modelos básicos de
la macroeconomía.
clásica, las variables endógenas determinan las variables reales, y los precios
Schuldt().
Mercado de trabajo
Q = f(N, K, t, ..)
Q = A*(N^B)*(K^D)
espaciados:
N = linspace(0,6,100)
demandalabour = A*B*(N.^(B-1))*(K^D)
ofertalabour = N.*E
producción es:
plot(N,demandalabour,N,ofertalabour)
función del salario real demandado, y de oferta de trabajo en función del salario
real ofertado. Estas se definen como funciones anónimas, donde @(x) indica el
rango de x.
Notemos que en este caso N es la variable sobre cuyo rango de posibles valores
trabajo.
escribir estas, ya que no siempre es posible encontrar una solución explícita para
q_optimo = A*(N_equil^B)*(K^D)
plot(N,Q_prod(N),[N_equil N_equil],[0 q_optimo],'.:k',[0
N_equil],[q_optimo q_optimo],'.:k')
xlabel('Número de unidades de trabajo')
ylabel('Producción')
title('Función de producción')
axis([0 6 0 60])
Mercado de bienes
inversion = tasa.*b+I_barra
ahorro = tasa.*c+A_barra
plot(inversion,tasa,ahorro,tasa)
Mercado Monetario
El mercado de dinero se rige por la ecuación cuantitativa del dinero, las variables
L= 14; V = 7;
Q = linspace(0,60,100);
P = @(Q) Q.\(L*V)
p_equil = (L*V)/q_opt
q_equil = q_opt
plot(P(Q),Q,[p_equil p_equil],[0 q_equil],'.:k',[0 p_equil],[q_equil
q_equil],'.:k')
xlabel('Nivel de precios')
ylabel('Producción')
title('Mercado monetario')
axis([0 5 0 60])
Inversión-Consumo
resta = linspace(0,100);
plot(resta,q_optimo-resta,[Inv_equil Inv_equil],[0
C_equil],'.:k',[0 Inv_equil],[C_equil C_equil],'.:k')
xlabel('Inversión')
ylabel('Consumo')
title('Consumo-Inversión')
axis([0 60 0 60])
33 !
35 #
38 &
39 '
91 [
92 \
93 ]
94 ^
123 {
124 |
125 }
126 ~
REFERENCIAS BIBLIOGRÁFICAS.
Davis, T. (2011). MATLAB Primer. 8th Edition. Boca Raton: CRC Press.
Económica.
Pratap, R. (2010). Getting Started with MATLAB. A quick introduction for scientists and