Anda di halaman 1dari 12

Métodos Matemáticos (4o Ingenierı́a Industrial)

Prof. J.M. Dı́az Báñez. Departamento de Matemática Aplicada II. Universidad de Sevilla

CURSO ACADÉMICO 2011-2012

Práctica I: Breve Introducción a Matlab

Aspectos Generales de Matlab


Acceso a Matlab. En las clases de laboratorio se utilizará la versión 7.1 de Matlab.
Las presentes notas deben entenderse sólo como una sencilla introducción a aquellos as-
pectos de este programa que van a ser utilizados repetidamente durante el curso. Es muy
recomendable profundizar en algunos de los temas aquı́ tratados, especialmente, en todo
lo relacionado con el manejo de archivos “*.m” y con la programación. Para ello pueden
consultarse cualquiera de los textos mencionados en el proyecto docente de la asignatura.
Para empezar a trabajar con Matlab, debe arrancarse el ordenador en el modo
Matlab siguiendo las correspondientes instrucciones del Centro de Cálculo de la Escuela.
Posteriormente, para abrir una ventana y comenzar una sesión, basta buscar el icono
correspondiente a Matlab 6.1 en el escritorio de Windows, situarnos sobre él con el
ratón y pulsar dos veces su botón izquierdo. El sı́mbolo “>>” (prompt) nos indica que el
programa está a la espera de nuestras instrucciones. Para salir de Matlab basta teclear
exit o quit y para ejecutar cualquier instrucción la tecla Return . Hemos de tener en
cuenta que una instrucción termina al cambiar de lı́nea. Si necesitamos escribir más de
una lı́nea, debemos poner el sı́mbolo “...” (tres puntos) al final de la misma y continuar
en la siguiente. Si lo que queremos es escribir varias instrucciones dentro de la misma
lı́nea basta separarlas por comas.
El cursor se posiciona con las flechas izquierda/derecha ← , → y para borrar carac-
teres pueden usarse las teclas Backspace o Supr . Si lo que se desea es borrar toda la
lı́nea de edición puede usarse la tecla Esc . También son accesibles otras posibilidades
de edición en lı́nea (de significado completamente intuitivo) con las teclas Inicio , Fin
o Insert . Otra opción muy útil es usar las flechas arriba/abajo ↑ , ↓ para recuperar las
órdenes previas. Por tanto, se puede recuperar una lı́nea anterior de órdenes, editarla y
ejecutarla revisada. Para limpiar completamente la pantalla se utiliza la orden clc.

Funciones implementadas en Matlab. El programa Matlab lleva implementadas la


inmensa mayorı́a de las funciones matemáticas más utilizadas, las cuales suelen admitir

1
argumentos escalares y vectoriales. Además, Matlab maneja con facilidad números
complejos y, utiliza indistintamente la i y la j para representar el número imaginario
unidad.
Conviene precisar que los paréntesis “( )” y los corchetes “[ ]” tienen significados bien
distintos en Matlab. Los primeros se utilizan para evaluar funciones y los segundos para
definir vectores o matrices.

Ejercicio resuelto. (a) Determine el valor de la raı́z cuadrada del logaritmo neperiano
del seno de cinco.
(b) Compruebe que 3-4-5 son las dimensiones de un triángulo rectángulo.
>> sqrt(log(sin(5)))
>> sqrt(3^2+4^2)-5

Ejercicio. Evalúe la expresión


³ ³π ´ ´
2
tan x − 2 sen +1 ,
5
para s = 0.5, 0.95 y 1.

Ejercicio. Ejecute las órdenes clock, date y calendar. Interprete las respuestas pro-
porcionadas por Matlab y limpie posteriormente la pantalla.

Formatos numéricos. Para visualizar los resultados, Matlab ofrece varias posibili-
dades aunque, por defecto, representa los números en pantalla con redondeo a cuatro cifras
decimales. También decide si representa un número en notación convencional (coma fija)
o en notación cientı́fica (coma flotante). Los números enteros que tengan menos de nueve
cifras siempre se representan en coma fija. La orden para la representación en pantalla es
format y admite, entre otras, las siguientes opciones:

• format long: 16 dı́gitos.

• format short: 4 dı́gitos. Equivale a escribir sólo format.

• format long e: 16 dı́gitos más exponente.

• format short e: 4 dı́gitos más exponente.

Es fundamental entender que Matlab no cambia la representación interna de un


número cuando se escogen diferentes formatos, sólo se modifica su visualización.

Ejercicio resuelto. Escriba en los cuatro formatos anteriores el número π.


>> pi
>> format long, pi
>> format long e, pi
>> format short e, pi

2
Ejercicio. Ejecute las órdenes realmax y realmin para conocer exactamente el rango
real en el que se mueven los números que manaja Matlab.

Variables. Una variable es simplemente una etiqueta que se asigna temporalmente a un


dato. El modo de definir una variable cualquiera en Matlab es “variable=expresión”.
Para saber el valor actual de una variable sólo hay que escribirla y pulsar la tecla
Return . El resultado de ejecutar en Matlab cualquier expresión matemática se guarda,
por defecto, en una variable denominada ans, que sale inmediatamente en pantalla y que
toma como valor el correspondiente resultado. Si deseamos que esta variable no aparezca
en pantalla, basta teclear al final de la expresión el sı́mbolo “;” (punto y coma).

Ejercicio. Cree dos variables que almacenen los valores



π 2 − 3 23 − e
, log(37 + cos(73 ))
6ch(5)
y calcule su suma y su producto.

Ejercicio. Consulte la ayuda sobre la variable predeterminada i y calcule i2 . Posteri-


ormente, defina la variable i como dos y vuelva a calcular i2 . ¿Qué regla práctica debe
concluirse?

El Entorno de Trabajo de Matlab


El entorno de trabajo. A partir de la versión 5.0, el entorno de Matlab ha mejorado
mucho, haciéndose mucho más gráfico e intuitivo. Los principales componentes de dicho
entorno son el explorador de caminos de búsqueda (Path Browser ), el editor y depu-
rador de errores (Editor/Debugger ) y el visualizador del espacio de trabajo (Workspace
Browser ).

Path Browser. Matlab puede llamar a una gran variedad de funciones, tanto propias
como programadas por los usuarios. A veces, puede incluso haber funciones distintas que
tienen el mismo nombre. Por tanto, es interesante saber como Matlab busca cualquier
función que se le pida que ejecute. La clave es el camino de búsqueda (search path) que
el programa utiliza cuando encuentra el nombre de una función. El search path es una
lista de directorios que se puede ver y modificar mediante la orden path, o utilizando el
Path Browser (Submenú Set Path en el menú File).

El directorio actual. El concepto de directorio actual o de trabajo es crucial en Mat-


lab. Es el directorio donde el usuario debe guardar los diferentes archivos que genere
en las sesiones, para que Matlab pueda detectarlos. En nuestro caso, corresponde a
“C:\Archivos Matlab\work”.
El contenido de dicho directorio puede obtenerse con la orden dir. Para cambiar el
directorio actual se utiliza la orden cd (Change Directory) seguido del nombre del nuevo

3
directorio. Ejecutando cd .., se sube un nivel en la jerarquı́a de directorios.

Editor/Debbuger. En Matlab tienen particular importancia los M-archivos, esto es,


archivos con la extensión “*.m”, los cuales son archivos de texto ASCII que contienen
un cierto conjunto de órdenes de Matlab. La importancia de estos archivos es que al
teclear su nombre en la lı́nea de órdenes de Matlab y pulsar Return , se ejecutan todas
las órdenes contenidas en dicho archivo.
Matlab dispone de un editor propio que permite tanto crear y modificar estos archivos
(proceso de edición-Editor ), como ejecutarlos paso a paso para detectar errores (proceso
de depuración-Debugger ).

Workspace Browser. El espacio de trabajo (Workspace) de Matlab es el conjunto de


variables que en un determinado momento están definidas en la memoria del programa.
Para obtener información sobre el workspace se pueden utilizar las órdenes who y whos.
La segunda proporciona una información más detallada que la primera.

Copias completas de una sesión de trabajo. Matlab incorpora la orden diary


para guardar sesiones completas de trabajo con Matlab. Esta orden puede ser de gran
utilidad en el desarrollo de las clases prácticas, pues permite guardar en un archivo de
texto todos los resultados obtenidos en la sesión, los comentarios realizados en la clase y,
en general, todo lo que el programa va presentando en pantalla.
La forma natural de proceder es la siguiente: se teclea diary nombre1.txt. De
este modo, se crea el archivo nombre1.txt en el directorio actual y todo aquello que
aparezca en pantalla, a partir de ese momento, se graba en dicho archivo. Para que dejen
de grabarse las instrucciones que aparecen en pantalla hay que teclear diary off y para
volver a abrir el archivo diary on.

Matrices y Vectores
Matrices y vectores. En Matlab se trabaja fundamentalmente con matrices. De
hecho, para Matlab, los números son simplementes matrices cuadradas de orden uno.
Las matrices pueden definirse de las siguientes formas:

• Escribir la matriz entre corchetes, colocando las filas una a continuación de otra,
separadas por el simbolo ”;”. Entre los elementos de una misma fila podemos colocar
una coma o dejar un espacio en blanco.

• Escribir la matriz entre corchetes, colocando cada fila en un renglón.

• La matriz vacı́a se representa por [ ].

Como es natural, si sólo introducimos una fila tenemos un vector fila. Matlab in-
cluye una orden muy útil para generar vectores cuyas coordenadas están en progresión

4
aritmética. En concreto, la estructura a:b:c crea un vector entre los números a y c, in-
crementando cada coordenada con el número b. Si sólo se escribe a:c se considera que b
es igual a uno.

Ejercicio resuelto.Genere tres vectores cuyos elementos representen una partición del
intervalo [-1,1] en cinco, ocho y diez subintervalos iguales. Con las tres primeras co-
ordenadas de cada uno de ellos, genere las tres filas de una matriz 3 × 3 y calcule el
determinante de dicha matriz y de su traspuesta.
>> u=-1:2/5:1, v=-1:2/8:1, w=-1:2/10:1
>> A=[-1, -0.6, -0.2
-1, -0.75, -0.5
-1, -0.8, -0.6]
>> B=A’
>> det(A), det(B)

Ejercicio. Considere la matriz mágica de orden cuatro


 
16 5 9 4
 3 10 6 15 
 .
 2 11 7 14 
13 8 12 1

Utilizando la orden sum, explique la razón de denominarla mágica.

Direccionamiento y manipulación de matrices. Para seleccionar un elemento de-


terminado de una matriz se escribe el nombre de la matriz seguido del número de fila y
columna separados por una coma y entre paréntesis.
Si se desea extraer una submatriz, basta colocar en vez de números, vectores cuyas
componentes son los números de las correspondientes filas y columnas. El sı́mbolo dos
puntos es muy útil para crear submatrices. Cuando no se le dan valores a derecha e
izquierda recorre, por defecto, todos las filas o columnas. Si colocamos datos fuera del
rango actual de una matriz se rellenan con ceros las zonas no especificadas.

Ejercicio resuelto. Obtenga de cuatro maneras distintas la submatriz formada por la


segunda y la tercera fila de la siguiente matriz
 
1 1 1 1
 1 2 2 2 
A= 
 1 2 3 3 .
1 2 3 4

>> A = [1 1 1 1; 1 2 2 2 ; 1 2 3 3 ; 1 2 3 4 ]
>> A(2:3,1:4)
>> A(2:3,:)

5
>> A([2 3],[1 2 3 4])
>> A([1 4],:)=[]

Ejercicio. Defina la matriz A cuadrada de orden 15 tal que todos sus elementos son nulos,
salvo la primera fila y la primera columna, las cuales toman los valores, respectivamente
de la columna o fila en que se encuentran.

Ejercicio. Escriba las matrices A y B definidas por

A(i, j) = 10(i − j) + 1; i, j = 1, ..., 10.


½
1, i−j =1
B(i, j) = , i, j = 1, ..., 20
0, en otro caso

Gráficas en Matlab
La ventana gráfica de Matlab. Para mostrar las correspondientes gráficas, Matlab
abre una nueva ventana, la denominada ventana de figura. Si ya hubiera una ventana
de figura, se borra la ventana de figura actual y se dibuja en ella la nueva gráfica. Para
utilizar dos o más gráficas en diferentes ventanas de figura, se usa la orden figure. La
orden figure(n) muestra o crea, si no la hay, la ventana de figura n-ésima y esta pasa a
ser la ventana de figura activa. La orden close cierra la ventana gráfica activa.

Gráficas bidimensionales. Para obtener gráficas 2-D, Matlab admiten cuatro op-
ciones: gráficas en coordenadas cartesianas, gráficas en coordenadas polares, gráficas de
barras y gráficas de escaleras. La orden para representar datos bidimensionales en co-
ordenadas cartesianas es plot, para crear gráficas en coordenadas polares es polar y,
finalmente, los gráficos de barras y escaleras se generan usando las ordenes bar y stairs,
respectivamente.
La orden plot escala los ejes para ajustar los datos, representa los puntos y, a con-
tinuación, conecta los puntos con una lı́nea recta. También añade una escala numérica y
coloca de forma automática marcas en ambos ejes. Conviene aclarar que lo primero que
se hace al ejecutar la orden plot es eliminar toda la información (lı́neas, ejes,...) sobre la
gráfica anterior, si la hubiere.

Ejercicio resuelto. Dibuje la gráfica de la función exponencial en el intervalo [-2,2].


Obtenga una segunda gráfica donde a la curva anterior se le añada la recta tangente en
x = 0.
>> x=-2:0.01:2; y=exp(x); plot(x,y)
>> z= x+1; plot(x,y,x,z)

Ejercicio. Dibuje la gráfica de la elipse centrada en el origen y de semiejes 3 y 5.

6
Ejercicio. Dibuje un polı́gono regular de 20 lados que pueda inscribirse en una circun-
ferencia de radio uno. (Indicación: Evalue plot sobre un vector cuyas componentes sean
números complejos).

Gráficas tridimensionales. Para obtener gráficas 3-D, Matlab admiten tres opciones:
gráficas de lı́neas, gráficas de superficies y gráficas de contorno. La orden básica para
realizar gráficas de lı́neas es plot3, las órdenes para gráficas de superficies son mesh y
surf y, finalmente, para gráficas de contorno es contour.

Gráficas de lı́neas. La función plot3 es análoga a su homóloga bidimensional plot.


Su forma más sencilla es plot3(x,y,z) la cual dibuja una lı́nea que une los puntos
(x(1),y(1),z(1)), (x(2),y(2),z(2)), (x(3),y(3),z(3)), etc, y la proyecta sobre un plano
para poderla representar en pantalla.

Ejercicio resuelto. Dibuje en verde un trozo de una espiral cilı́ndrica.


>> fi=[0:pi/20:6*pi];
>> plot3(cos(fi),sin(fi),fi,’g’)

Ejercicio. Dibuje la curva alabeada de ecuaciones paramétricas


x(t) = cos(t2 ), y = cos(t) sen(t), z = sen(t), t ∈ [−4π, 4π].

Gráficas de superficies. La idea es dibujar una función de dos variables sobre un do-
minio rectangular. Supongamos que x e y son dos vectores que contienen las coordenadas
en una y otra dirección de la retı́cula sobre la que se va a dibujar la función. Se comienza
generando dos matrices X (cuyas filas son copias de x) e Y (cuyas columnas son copias de
y) con la orden meshgrid, las cuales representan las coordenadas de todos los puntos del
reticulado. Posteriormente, se calcula la matriz gráfica de datos Z partir de las matrices
de coordenadas X e Y, teniendo en cuenta la función que se trate. Finalmente, la matriz
Z se dibuja con la orden mesh o la orden surf. Ambas órdenes dibujan la función en
perspectiva y la diferencia entre ellas está en el “llenado” de color de las células generadas
por el mallado.
p p
Ejercicio resuelto. Dibuje en un cuadrado la función “sombrero” z=sen( x2 + y 2 )/ x2 + y 2 .
>> u=-8:0.5:8;v=u;
>> [U,V]=meshgrid(u,v);
>> r=sqrt(U.^2+V.^2)+eps;w=sin(r)./r;
>> mesh(w)

Ejercicio. Represente la superficie en paramétricas


x(t) = 4 cos(r) sec(t), y = 2 sen(r) sen(t), z = tan(t),
donde t ∈ [−π, π] y r ∈ [−2π, 2π].

7
Archivos en Matlab
Comentarios generales. Para trabajar con datos de gran tamaño, o bien para diseñar
nuevas funciones en Matlab, es completamente imprescindible trabajar con archivos y,
por tanto, con el editor de texto de Matlab. Los archivos adicionales que Matlab
utiliza básicamente son aquellos con extensión “*.m” y una parte importante de cada
sesión con Matlab es crear y refinar este tipo de archivos. Atendiendo a su uso, los
M-archivos suelen dividirse en dos grandes grupos: archivos de instrucciones o tipo script
y archivos de funciones.
Como se comentó, Matlab dispone de un editor excelente que facilita enormemente
el trabajo con los M-archivos. En concreto, el editor muestra con diferentes colores los
diferentes tipos o elementos constituyentes de las órdenes (en verde los comentarios, en
rojo las cadenas de caracteres, ...). Además, el editor se preocupa también de que las
comillas o paréntesis que se abran tengan el correspondiente elemento de cierre.
Para acceder al editor desde la ventana principal de Matlab, basta pulsar el menú
File y después New/ M-file (si se desea crear un archivo nuevo), o bien pulsar el menú
File y después Open M-file... (si se desea abrir un archivo ya existente). El manejo de
esta nueva ventana es totalmente intuitiva.

Ejercicio resuelto. Abra un archivo usando el editor de Matlab, escriba en él una
matriz cuadrada de orden 2 y guarde dicho archivo en el directorio actual con el nombre
“prueba.m”.
Pulsar: File → New → M-file
Escribir: A=[1 2; 2 1]
Pulsar ‘‘Guardar como’’
En ‘‘Nombre de Archivo’’ escribir ‘‘prueba.m’’
Con la pesta~ na ‘‘Guardar en’’, situarse en C:\Matlab5.2
Pulsar \Guardar"

Archivos de instrucciones. Un M-archivo de este tipo consiste en una sucesión de


instrucciones de Matlab. Para ejecutarlas y ver el correspondiente resultado en pantalla,
basta escribir el nombre del archivo (sin la extensión) y pulsar Return . Las variables en
un archivo de instrucciones son globales y, por tanto, pueden afectar a los valores de las
variables que se hayan creado durante la sesión de trabajo con Matlab.
Los archivos de instrucciones son básicamente utilizados para introducir datos en ma-
trices de grandes dimensiones, pues en un archivo de este tipo es fácil corregir errores sin
repetir todo el trabajo.

Ejercicio resuelto. Escriba y guarde en un archivo de nombre “datos.m” la matriz


cuadrada de orden veinte tal que los elementos de su diagonal son todos iguales a 3
y las dos subdiagonales principales están formadas por unos. Calcule su determinante.
Posteriormente cambie la diagonal por el vector cuyas coordenadas son los primeros veinte
números naturales y vuelva a calcular el determinante de la nueva matriz.

8
Escribir en un archivo:
A=diag(3*ones(20,1));
A=A+diag(ones(19,1),1);
A=A+diag(ones(19,1),-1);
Guardar en ‘‘datos.m’’
Ejecutar el archivo y escribir en Matlab
>> det(A)
Abrir ‘‘datos.m’’
A=A-diag(3*ones(20,1));
A=A+diag(1:20);
Guardar ‘‘datos.m’’
Ejecutar el archivo y escribir en Matlab
>> det(A)

Archivos de funciones. Los M-archivos de funciones son los que permiten incremen-
tar la colección de funciones que ejecuta Matlab. Es decir, se pueden crear funciones
especı́ficas para algún problema concreto y, a partir de su introducción, dichas funciones
tienen el mismo rango que las funciones del sistema y se ejecutan de igual forma. Las
variables en los archivos de funciones son locales, es decir, no afectan a los valores de las
variables que se hayan creado durante la sesión de trabajo con Matlab.
Se aconseja que el nombre de un archivo de función sea el nombre de la función
seguido, obviamente, de la extensión “*.m”. La estructura de un archivo de este tipo es
la siguiente: la primera lı́nea comienza con la orden de Matlab function seguida del
nombre de la función que queramos definir junto con los argumentos de entrada y salida
separados por comas. Es decir,

function [argumentos de salida]=nombre de la función(argumentos de entrada).

A continuación, puede haber diversas lı́neas de comentario que han de estar precedidas
necesariamente por el sı́mbolo “%”. Conviene decir que son precisamente estas lı́neas las
que aparecerán en pantalla al usar la orden help. Finalmente aparece el programa, esto
es, las instrucciones necesarias para poder evaluar la función.
Tanto los argumentos de entrada como los de salida no son obligatorios y, si no apare-
cen, no hace falta escribir los correspondientes corchetes o paréntesis.

Ejercicio resuelto. Diseñe una función que muestre la gráfica de la función y = xn en


[−2, 2] × [−4, 12] y cuyo argumento de entrada sea el número n. La gráfica debe tener un
mallado y deben situarse los ejes de coordenadas.
function graf(n)
x=-2:0.01:2;
y=x.^n; plot(x,y);axis([-2 2 -4 12]);
hold on
plot([-2.2 2.2],[0 0],’w’, [0 0], [12 -4],’w’);
grid;

9
hold off;

Ejercicio. Diseñe una función que devuelva el producto escalar de dos vectores x e y de
Rn . Los argumentos de entrada deben ser los vectores x e y. Además, el correspondiente
archivo debe incluir algunas lı́neas de comentario.

Ejercicio. Diseñe una función que calcule el factorial de un número natural n. El argu-
mento de entrada debe ser dicho número n.

Programación en Matlab
La orden for. La sintaxis para la utilización de esta orden de control es

 for “variable”=“vector”
“instrucciones sobre la variable” .

end
El significado es el siguiente: mientras la “variable” recorre los valores del “vector”, se
realizan las “instrucciones” descritas, con la “variable” tomando dichos valores. Matlab
permite anidar varias órdenes for.

Ejercicio resuelto. Diseñe una función que devuelva el término n-ésimo de la iteración
xn+1 = x2n − 2xn , x0 = 4.
Obtenga x1 , x15 y x50 .
Crear un archivo ‘‘iter.m’’
function z=iter(n)
x=4;
for k=1:n
x=x^2-2*x;
end
z=x;
En Matlab
>> iter(1)
>> iter(15)
>> iter(50)

Ejercicio. Dada una matriz cuadrada de orden n, diseñe una función usando la in-
strucción for, que sume los elementos de mayor módulo de cada una de las columnas de
dicha matriz.

Ejercicio. Usando dos instrucciones for anidadas, genere la matriz cuadrada A, definida
por
A(i, j) = i2 j, i, j = 1, ..., 10.

10
¿Sabrı́a generar A sin usar ninguna instrucción for?

La orden if. La sintaxis habitual para la utilización de esta orden de control es



 if “relación lógica P1 ”



 “instrucciones Q1 ”
else .



 “instrucciones Q 2 ”

end
El significado es el siguiente: si P1 es cierto se ejecutan las instrucciones Q1 y si P1 es
falso se ejecutan las instrucciones Q2 . Las lı́neas tres y cuatro anteriores pueden suprimirse
y, en este caso, cuándo P1 sea falso, no se ejecuta ninguna instrucción.

Ejercicio resuelto. Diseñe una función sobre los números enteros que asigna el valor 1
a los números pares y positivos, el valor -1 a los números impares y positivos y el valor
cero a los números restantes.

function paridad=paridad(n)
if n<=0
paridad=0;
elseif rem(n,2)==0
paridad=1;
else
paridad=-1;
end

Ejercicio. Diseñe una función que calcule todos los divisores de un número natural dado.

Ejercicio. Diseñe una función que calcule todos los números naturales perfectos menores
que uno dado. Un número natural se dice perfecto si dicho número es la suma de todos
sus divisores menos él.

La orden while. La sintaxis para la utilización de esta orden de control es



 while “relación lógica(contador)”
“instrucciones(contador)” .

end

El significado de este esquema es que las instrucciones se irán ejecutando mientras la


“relación lógica” sea cierta.

Ejercicio resuelto. Determine el valor de la precisión de la máquina usando un bucle


while. Compare el valor obtenido con la variable predefinida eps de Matlab.
function precmaq

11
precmaq=1;
while (1+precmaq)>1
precmaq=precmaq/2;
end
precmaq = 2*precmaq

Ejercicio. Calcule el primer término de la sucesión de Fibonacci

xn+1 = xn + xn−1 , x1 = x2 = 1;

que supere 106 .


P
Ejercicio. Un conocido resultado de L. Euler (1707-1783) afirma que ∞ 1 π2
n=1 n2 = 6 .
Obtenga el menor número de sumandos de la serie anterior, de modo que la correspondi-
2
ente suma finita aproxime π6 con un error menor o igual que 10−4 y que 10−6 .

12

Anda mungkin juga menyukai