You are on page 1of 12

Mètodes Numèrics i Aplicacions Informàtiques

Biotecnologia, curs 2021-2022


Pràctica dissenyada per la professora Regina Martı́nez

Pràctica 1
Introducció a OCTAVE (Primera part)

1 Introducció
Octave és un software lliure que permet la programació d’alt nivell per al còmput numèric. Té
una sintaxi similar al paquet comercial MATLAB, amb el qual és pràcticament compatible.
Es va dissenyar cap al 1988 per a ser utilitzat en un curs de disseny de reactors quı́mics
per alumnes d’Enginyeria Quı́mica de la Universitat de Texas i de la Universitat de Wisconsin-
Madison.
Actualment disposa d’una gran quantitat d’eines que permeten resoldre numèricament pro-
blemes d’àlgebra lineal i de càlcul en una i diverses variables. Permet realitzar gran quantitat
de gràfics en dues i tres dimensions basat en l’aplicació Gnuplot.

1.1 Entorn de treball


Per iniciar l’aplicació només cal teclejar octave a la terminal o clicar a la icona corresponent.
Aixı́ s’obre una finestra dividida en varies parts.
A la dreta trobem les més importants: la finestra de comandes i finestra d’edició. A la finestra
de comandes podem introduir i executar interactivament les instruccions d’Octave. Aquı́ apareix
una lı́nia d’entrada amb el prompt >> indicant que està preparat per rebre instruccions. A la
finestra d’edició podem editar fitxers. És convenient escriure i guardar els programes en fitxers
que després es puguin executar fàcilment des de la finestra de comandes. Aquests fitxers portaran
l’extensió .m i s’escriuran i modificaran a la finestra d’edició.
A l’esquerra trobarem: l’explorador d’arxius on es mostren els fitxers que hi ha al directori
de treball, l’espai de treball que mostra les variables que tenen assignat algun valor en aquest
moment, i l’historial de comandes on apareixen les darreres instruccions executades.
Per començar treballarem de manera interactiva introduint instruccions a la finestra de
comandes. Cal tenir en compte que
ˆ Si la instrucció no és correcta, apareixerà un missatge d’error.
ˆ Si la instrucció és correcta, s’executarà i es mostrarà el resultat.
Si el resultat ocupa més lı́nies de les disponibles al terminal, s’usarà un paginador que ens
permetrà avançar i retrocedir per la informació (normalment amb les fletxes del cursor).
Amb la tecla q es surt del paginador.
Algunes comandes de caràcter general:
home o clc % borren la pantalla i situen el cursor a l’inici del terminal. Amb la ⇑ es poden

recuperar igualment les instruccions anteriors.


quit % surt de l’Octave.

help tema % mostra l’ajuda disponible sobre el tema especificat.

ˆ Exemple
>> help save % recordar que se surt del paginador amb q
Es poden posar lı́nies de comentaris començant amb el caràcter ’#’ o ’%’.

1
1.2 Nombres i operacions aritmètiques
Per defecte, Octave treballa amb els nombres en format de punt flotant en doble precissió. Els
nombres reals els podem representar en format decimal o en format exponencial. Per exemple,
el nombre 1131/8 el podem representar
- en format decimal com 141.375
- en format exponencial com 1.41375e + 2 (representa 1.41375 · 102 ).
(Nota: La lletra e en les constants numèriques en format exponencial indica l’exponent de 10).
Per representar un nombre complex amb part real 2.5 i part imaginària 3 escriurem -2+3i
o -2+3j.

Les operacions algebraiques bàsiques s’introdueixen amb +, −, ∗, / , i usarem el sı́mbol ˆ per


als exponents.
Escrivint una expressió aritmètica, s’obté el resultat en la variable del sistema ans. Si la ins-
trucció s’acaba amb ; s’executa però no es mostra el resultat. Es poden escriure diferents ordres
en una lı́nea separades per , o per ;
Es poden posar comentaris a les lı́nies de codi posant el caracter # o bé %
ˆ Exemple
>> 1/2+1/4
ans = 0.75000 %El resultat es guarda a la variable de sistema ans i es mostra per pantalla
5 + 2 · 32
A continuació calculem i 3 · 10−2 + 0.25 · 10−1
−5 + 32
>> (5+2*3ˆ2)/(-5+3ˆ2), 3e-2+0.25e-1
ans = 5.7500
ans = 0.055000
>> (-2+3i)*4i
ans = -12-8 i

Octave té algunes constants predefinides per exemple, pi, e per als nombres π i exp(1).

Els càlculs es fan amb 16 dı́gits (aproximadament) però en principi només es mostren 5 dı́gits
significatius. Per veure mes dı́gits cal usar format. Les opcions són les següents:

format short % mostra 5 dı́gits significatius.


format long % mostra 15 digits significatius, format decimal.
format long e (o short e) % com abans en format e.

ˆ Exemple
Per al nombre 1/17 s’obtenen els següents resultats segons el format
format short retorna 0.058824
format long e retorna 5.88235294117647e-02

1.3 Variables
Una variable és un nom simbòlic que identifica una part de la memòria on podem guardar dades.
El contingut el podem recuperar i modificar les vegades que convingui. El nom d’una variable
ha d’estar format per lletres i/o nombres, començant sempre amb una lletra. Distingeix entre
majúscules i minúscules. Convé no posar noms que corresponguin a variables predefinides, com
ara, pi, e, ans, ni comandes o funcions propies d’Octave (per exemple, quit, exp,...).

2
Algunes comandes adicionals

who % dona la llista de les variables utilitzades


(les que en aquest moment tenen algun valor)
clear % esborra les variables seleccionades (totes si no s’especifica cap)

ˆ Exemple
>> a= 23e-5, b= aˆ2 % s’assignen valors a les variables a i b

a = 2.3000e-04 b = 5.2900e-08
>> clear a b % es netejen les variables a i b

Exercici 1.1
Netejeu totes les variables i repetiu l’exemple anterior però substituint la última lı́nea per
>> clear a,b
Quina resposta dona l’Octave ? Podeu donar una explicació ?

Exercici 1.2
Definiu quatre variables amb els valors següents: a = 2.1, b = −0.067, c = 10−4 , d = 1/7 i
calculeu el valor de
b
c+d − a + b
1 b
a + c

1.4 Funcions matemàtiques elementals


Octave disposa d’una biblioteca de funcions matemàtiques predefinides. A continuació es mostren
algunes

abs(x) % |x|

sqrt(x) % x
exp(x) % e
x

log(x) % log(x) = ln(x)

log10(x) % log10 (x)

log2(x) % log2 (x)

sin(x) % sin(x)

cos(x) % cos(x)

tan(x) % tan(x)

atan(x) % arctan(x)

Exercici 1.3
Comproveu que

4 arctan(1) π p
3
=− , 3 ln e2 + 2e − ln(e + 2) = 1.
2 + log2 (1/32) 3

3
També podem definir les nostres pròpies funcions. La manera més simple de fer-ho és mitjançant
l’operador @ de la forma següent
nom =@(arguments de la funció) expressió
Per avaluar-la en un punt x = a només cal fer
nom(a)

ˆ Exemple
A continuació definim la funció f (x) = x2 sin(x) que anomenem fprova i l’avaluem en els punts x = 1 i
x = π/4
>> fprova=@(x) xˆ2*sin(x)
>> fprova(1), fprova(pi/4)

Exercici 1.4

1. Definiu la funció
f (x) = cos(3x) − 4 cos3 x + 3 tan x,

avalueu-la
√ en els punts 0, π/6, π/3, 1.32 i comproveu que f (π/6) = − 3/2 i f (π/3) =
3( 3 − 1/2).
2. Calculeu g(0), g(π/6), g(1.32) on
g(x) = cos(3x) − 4 cos3 x + 3 sin x.

3. Definiu la funció
f (x, y) = 3 sin(xy) + 4 cos(x)
i avalueu-la en els punts (0, 0), (π/2, 5), (−2, 8)

Més endavant veurem una altra manera de definir funcions.

1.5 Polinomis
Els polinomis es representen amb un vector fila que té com elements els coeficients del polinomi
en ordre descendent. Aixı́ el polinomi p(x) = c1 xn−1 +c2 xn−2 +. . .+cn−1 x+cn es representa
amb el vector

p = [c1, c2, ..., cn]


(A la secció 2 es veuran més detalls de l’ús de vectors amb Octave).

Algunes funcions d’Octave per polinomis:

polyout(p) % escriu una representació del polinomi p, usant ”s”


com a variable independent
polyval(p,X) % evalua el polinomi p en tots els elements del vector X

roots(p) % retorna les arrels del polinomi p

polyder(p) % retorna el polinomi derivada

conv(p,q) % retorna el producte dels polinomis p i q

[c,r]=deconv(p,q) % retorna el qüocient i el reste de la divisió de p entre q

4
ˆ Exemple
>> p = [1,3,-5]; % definició del polinomi p = x2 + 3x − 5
>> polyout(p), roots(p)
1 ∗ s2 + 3 ∗ s1 − 5 % representació del polinomi en la variable s
ans = -4.1926 1.1926 % arrels del polinomi
>> q=[1,1,1]; polyval(q,[5,0])
ans = 31 1 % càlcul de q(5) i q(0) per q(x) = x2 + x + 1

Exercici 1.5
Considereu el polinomi

p(x) = (x4 + 3x3 − 2x2 + 5)(−3x5 + 5x4 + 7x + 2)

1. Calculeu les seves arrels usant la funció d’Octave roots.


2. Calculeu la seva derivada. Trobeu les arrels de la derivada.

1.6 Guardar sessions i variables


Guardar la sessió
Podem guardar totes les ordres i respostes de la sessió en un arxiu utilitzant ’diary on’,
’diary off’.
ˆ Exemple
Escrivim les següents instruccions:
>> diary(’maria’)
>> diary on
>> titol = ’sessio de prova’;
>> a=1/4-3/5
a = -0.35000
>> diary off
>> c=27;

A la finestra d’edició podem obrir el fitxer ’maria’. Aquı́ hi trobarem totes les instruccions i respostes entre
’diary on’ i ’diary off’ (no la instrucció c=27), és a dir

diary on
titol = ’sessio de prova’;
a=1/4-3/5
a = -0.35000
diary off

El fitxer ’maria’ no és executable (a la pràctica 2 veurem un altre tipus de fitxers que sı́ són executables).

Guardar variables
També podem salvar variables en un fitxer de manera que puguin ser recuperades posterior-
ment. Per salvar variables podem usar la comanda save i per recuperar-les la comanda load.
La forma general és
save nom.m v1 v2 ... vn % guarda les variables v1 v2 ... vn en el fitxer
nom.m. Si no s’especifiquen variables guarda
totes les de la sessió.
load nom.m % recupera les variables anteriors

Observació: noteu que el fitxer porta l’extensió .m

5
2 Matrius
2.1 Format bàsic
El tipus bàsic de dades amb que treballa Octave és la matriu rectangular de n files i m columnes.
Un vector és una matriu amb una única fila (vector fila) o una única columna (vector columna).
Per construir un vector fila escrivim les seves components entre claudàtors ([ ]), separades per
comes o espais en blanc.
ˆ Exemple
>> v = [-2,0,1,3] % crea el vector fila v = (−2, 0, 1, 3)

Per introduir un vector columna escrivim les seves components entre claudàtors, separats per
”punt i coma”.
ˆ Exemple −2


 0 
>> v = [-2;0;1;3] % crea el vector columna v = 
 1 

Per definir una matriu podem introduir les seves files com a vectors fila i separem una fila d’altre
amb ”punt i coma”.
ˆ Exemple −2

13 1

 0 −5 2 
>> A = [-2,13,1;0,-5,2;10,0,-1;3,7,21] % crea la matriu A =  
 10 0 −1 
Per obtenir l’element que està a la fila 2, columna 3 posem 3 7 21
>> A(2,3)

Per obtenir una fila (o una columna) completa d’una matriu podem usar els dos punts :
ˆ Exemple
>> v=A(2,:) % retorna la segona fila de la matriu A en el vector v

Podem generar un vector fila de nombres equiespaiats (d’una successió aritmètica) amb el for-
mat

[inicial : increment : final]


Aixı́ es genera un vector fila que conté

[inicial, inicial + increment, inicial + 2 ∗ increment, ....]


Si l’increment no s’especifica, per defecte es pren igual a 1.
ˆ Exemple
>> v=[3:2:11] % crea el vector fila v = (3, 5, 7, 9, 11)
>> v=[1:0.5:3.2] % crea el vector fila v = (1, 1.5, 2, 2.5, 3)
>> A=[3:2:11 ; 0,1,4,10,8 ; -2:-1:-5,30] % crea la matriu

 
3 5 7 9 11
A= 0 1 4 10 8 
−2 −3 −4 −5 30

Exercici 2.1
Genereu un vector fila que tingui com a elements tots els múltiples de 3 entre 50 i 100.

6
2.2 Operacions amb matrius
Les podem classificar com:

ˆ matricials, operen amb les matrius d’acord amb la seva definició matemàtica
A+B % suma de matrius, les dimensions han de coincidir,
A−B % resta de matrius, les dimensions han de coincidir,
A∗B % producte de matrius, el nombre de columnes de A ha de ser igual al

nombre de files de B,
A/B % multiplicació a la dreta per la inversa de B, és a dir, AB
−1 ,

A\B % multiplicació a l’esquerra per la inversa de A, és a dir, A


−1 B,
ˆ element a element, operen sobre cadascún dels elements de la matriu de manera in-
dependent. En aquest cas es pot pensar en les matrius com a simples contenidors de
dades.
A. + B % suma element a element, equivalent a +

A. − B % resta element a element, equivalent a -

A. ∗ B % producte element a element, A i B han de tenir les mateixes dimensions,

A./B % divisió de cada element de A pel corresponent element de B,

A.\B % divisió de cada element de B pel corresponent element de A,

Observeu que per a les operacions element a element es fan servir els mateixos operadors
que per a les operacions matricials però ara precedits per un punt (.+ .- .* ./ . \)

ˆ Exemple
>> v=[2,0,4,-1]; w=[1,3,-5,-2]; v+w, v-w
ans = 3 3 -1 -3
ans = 1 -3 9 1
>> v = [1,2,3]; u=[2,5,4]; v.*u, v./u
ans = 2 10 12
ans = 0.50000 0.40000 0.75000

Exercici 2.2
Per a les matrius    
1 2 −1 5 1 −1
A =  0 3 −1  B =  0 2 −3 
0 0 4 0 0 −1
compareu els resultats de les operacions ’∗’ i ’.∗’

2.3 Algunes funcions d’Octave per matrius


Per generar matrius i vectors

zeros(n,m) % retorna una matriu de n files i m columnes amb tots els elements zero.
eye(n) % retorna la matriu identitat de n files i n columnes.

diag(v) % retorna una matriu que té a la diagonal el vector v i la resta zeros.

rand(n,m) % retorna una matriu de n files i m columnes amb elements aleatòris amb

distribució uniforme entre 0 i 1.


randn(n,m) % com l’anterior amb elements aleatòris amb

distribució gaussiana de mitjana 0 i variància 1.

7
linspace(inicial,final,n) % genera un vector fila de n nombres equiespaiats entre
el valor inicial i el valor final incloent els extrems.
A diferència del cas del rang [inicial:increment:final]
en què es coneix la separació dels elements (increment),
ara es coneix el nombre d’elements però no la seva separació.

logspace(inicial,final,n) % similar a linspace però amb una separació logarı́tmica

entre els elements, de manera que es retornen n nombres


d’una successió geomètrica entre 10inicial i 10f inal .

ˆ Exemple
>> x=linspace(-2,7,10) % Genera un vector de 10 nombres equiespaiats entre -2 i 7
>> y=x.ˆ2 % Crea un vector y de 10 elements que conté els quadrats
dels elements del vector x. Observeu que cal usar l’operador amb
punt ’.ˆ’
>> z=sin(x) % Genera un vector que conté el sinus dels valors de x.
>> y=sin(x.ˆ2) % Genera un vector que conté el sinus dels quadrats dels valors de x.
2 5
>> x=logspace(2,5,4) % Genera un vector de 4 elements entre 10 i 10 equiespaiats
logarı́tmicament
x = 100 1000 10000 100000

Exercici 2.3
1. Genereu un vector v de 21 valors equiespaiats entre 0 i 10.
2. Genereu una matriu A que tingui com a primera fila el vector v de l’apartat anterior, com
a segona fila els valors de la funció f (x) = cos(x) en els punts de v i com a tercera fila
3
els valors de la funció g(x) = en els punts de v.
1 + x2

Algunes funcions adicionals per matrius

A.’ % matriu transposada, At


A’ % matriu transposada conjugada

rows(A) % retorna el número de files de la matriu A

columns(A) % retorna el número de columnes de la matriu A

sum(v) % retorna la suma dels elements del vector v

sum(A,dim) % retorna la suma dels elements de la matriu A sobre la dimensió

especificada a dim
prod(v) % retorna el producte dels elements del vector v

prod(A,dim) % com sum(A,dim) fent el producte dels elements

det (A) % calcula el determinant de la matriu A

rank(A) % calcula el rang de la matriu A

trace(A) % calcula la traça de la matriu A

inv(A) % calcula la inversa de la matriu A (si A té inversa)

lambda = eig(A) % retorna els valors propis de A en el vector lambda

[V,La] = eig(A) % retorna els valors propis de A en la matriu La i

els vectors propis en la matriu V


poly(A) % retorna el polinomi caracterı́stic

8
ˆ Exemple
En aquest exemple veiem com usar la funció sum per matrius i vectors. Introduim el vector v = [−1, 0, −2, 3, 4]
i la matriu  
1 2 3 4
A=
5 6 7 8
>> v=[-1,0,-2,3,4]
>> A = [1,2,3,4; 5,6,7,8]
>> sum(v) % retorna la suma dels elements del vector v
>> sum(A,1) % retorna la suma de les columnes de la matriu A
>> sum(A,2) % retorna la suma de les files de la matriu A
>> sum(A(:)) % retorna la suma de tots els elements de la matriu A

Exercici 2.4
Calculeu 200
P
k=1 k amb una sola lı́nia de codi. Comproveu el resultat obtingut usant la fòrmula

N
X
k = N (N + 1)/2
k=1

Exercici 2.5
Donades les matrius
   
1 −2 3 2 3 6
A =  2 −2 3  , B =  3 3 6 ,
3 −3 3 6 6 6

1. Calculeu la matriu C = AB −1 . Comproveu que CB = A.


2. Comproveu les següents identitats:

(ABC)t = C t B t At , (CBA)−1 = A−1 B −1 C −1

3 Gràfics
3.1 Gràfiques bidimensionals

La comanda plot
Permet representar un conjunt de punts al pla (xi , yi ), i = 1, ...n. La forma bàsica és
plot(x,y,’nm’)
on x i y són vectors d’igual longitud que contenen les coordenades xi , yi dels punts.
’nm’ són dos caracters que, de manera opcional, especifiquen el color i l’estil de punt. Si no
s’especifica, els punts s’uneixen amb segments (estil lı́nia).

ˆ Exemple
>> x=[1,0.25,0,-0.25,-1,-0.25,0,0.25,1]; y=[0,0.25,1,0.25,0,-0.25,-1,-0.25,0];
>> plot(x,y,’r*’) % representa les parelles de punts (xi , yi ) donats pels vectors x,y
>> plot(x,y) % compareu amb la representació anterior

9
ˆ Exemple
Per fer la gràfica de la funció y = x cos(x) a l’interval [−5, 5] primer generem un vector x amb punts
equiespaiats a l’interval [−5, 5], i un vector y amb els valors de la funció x cos(x) en aquests punts.

>> x=[-5:0.1:5];
>> y=x.*cos(x); % Observeu que cal usar l’operador (amb punt) ’.*’ per obtenir y ja que cal
fer les operacions per a cada element del vector x,
>> plot(x,y)
>> x(2),y(2)
ans = -4.9000
ans = -0.91391 % Observem que x(2) = −4.9 i y(2) = −4.9 cos(−4.9)

També s’accepta
>> x=[-5:0.1:5]; plot(x,x.*cos(x))

Es poden fer varies gràfiques en una mateixa finestra.

ˆ Exemple.
>> x=linspace(2,10,50); plot(x,exp(1./x).*sin(x),x,exp(1./x).*cos(x));
>> plot(x,exp(1./x).*sin(x),’r’,x,exp(1./x).*cos(x),’m’,x,x.*sin(x),’b+’);
En el segon cas, la gràfica de la funció e1/x sin(x) es fa en vermell i amb estil lı́nia, la gràfica de e1/x cos(x)
en magenta i la de x sin(x) en blau i amb estil de punts amb sı́mbol +.

També es pot especificar el tamany del sı́mbol i canviar la finestra de la gràfica.

ˆ Exemple
>> x=linspace(2,10,50); plot(x,cos(x),"m*","markersize",8)

Noteu que el gràfic de l’exemple anterior s’ha fet a la finestra [2, 10] × [−1, 1]. Si es vol que el
gràfic surti en una finestra diferent podem usar

axis([minx,maxx,miny,maxy])
ˆ Exemple
>> x=linspace(0,5,30); plot(x,sin(x))
>> axis([1,7,-2,2]); % refà el gràfic anterior a la finestra [1, 7] × [−2, 2].

Observeu que els punts que es representen són (x, sin(x)) per x ∈ [0, 5].

Podeu utilitzar la comanda help plot per veure les diferents opcions de color i estil per fer
representacions gràfiques.

Algunes funcions adicionals per gràfiques:

title() % posa el tı́tol especificat a la gràfica


xlabel() % posa l’etiqueta especificada a l’eix x
ylabel() % posa l’etiqueta especificada a l’eix y

grid on % representa una xarxa a la gràfica

grid off % elimina la xarxa

hold on % manté el gràfic actual a la finestra, els següents s’afegiran a l’actual

hold off % desactiva l’anterior

replot % actualitza la gràfica amb les modificacions que introduides posteriorment.

10
Exercici 3.1

1. Representeu conjuntament per x ∈ [0, 10], les gràfiques de les funcions


 
1
f (x) = exp − 1, g(x) = sin(2x).
x2 + 1
 
1
2. Quantes solucions té l’equació exp x2 +1
= sin(2x) + 1 a l’interval [0, 10] ?

La comanda ezplot

Per fer la gràfica d’una funció y = f (x) també podem usar ezplot. La forma general és
ezplot(’f’,[a,b],n)
on f és una expressió que defineix la funció f (x), [a,b] és l’interval, i n és el nombre de punts
usat per fer la gràfica. Tant [a,b] com n son opcionals. Si no s’especifica l’interval, per defecte
fa la gràfica a l’interval [−2π, 2π]. Per defecte usa 500 punts.
ˆ Exemple
>> ezplot(’x*cos(x)’) % gràfica de y = x cos(x) a l’interval [−2π, 2π]
>> ezplot(’x*cos(x)’,[-10,10]) % gràfica de f (x) = x cos(x) per x ∈ [−10, 10]
>> xlabel(’variable x’) % fa la gràfica amb l’etiqueta ’variable x’ a l’eix x
>> ylabel(’variable y’) % fa la gràfica amb l’etiqueta ’variable y’ a l’eix y

Exercici 3.2
Feu la gràfica de la funció f (x) = sin(x2 −3x) a l’interval [−2, 6] amb ezplot sense especificar
el nombre de punts, i també usant 200, 1000 i 1500 punts.

3.2 Gràfiques tridimensionals

Les comandes ezmesh, ezcontour

Per representar gràficament una funció de dues variables f (x, y) i les seves corbes de nivell
podem utilizar ezmesh i ezcontour. Les formes bàsiques són

ezmesh(’f’) % on f és l’expressió de la funció


ezmesh(’f’,[xmin,xmax,ymin,ymax]) % com abans per x ∈ [xmin, xmax], y ∈ [ymin, ymax]
ezcontour(’f’) % representa les corbes de nivell de la funció f (x, y)

ezmeshc(’f’) % representa simultàniament la gràfica de f

i les corbes de nivell


ˆ Exemple
>> ezmesh(’1/exp(xˆ2+0.2*yˆ2)’)
>> ezmesh(’1/exp(xˆ2+0.2*yˆ2)’,[-5,5]) % pren x, y ∈ [−5, 5]
>> f =@(x,y) x.*y; % per graficar una funció definida a fora cal entrar les funcions com
>> ezmesh(f,[-2,2]) % si x i y fossin vectors i emprar la notació per operar element a element.
>> ezcontour(’1/exp(xˆ2+0.2*yˆ2)’) % corbes de nivell

>> ezmeshc(’1/exp(xˆ2+0.2*yˆ2)’,[-2,2])

11
Exercici 3.3

1. Representeu la gràfica de la funció

3x4 − 4x3 − 12x2 + 18


f (x, y) =
12(1 + 4y 2 )

2. Quants mı́nims i màxims relatius observeu per x ∈ [−2, 3], y ∈ [−2, 2] ?


3. Representeu gràficament les corbes de nivell de f .

12

You might also like