Dibuixar una funció
En aquesta pràctica veurem com es pot representar una funció dins el Matlab
Contents
Dibuix d'una funció (plot)
Per dibuixar una funció només cal tenir:
- un vector que volem representar x
- un vector d'imatges f(x)
- fer servir la funció plot de Matlab
(per defecte això son punts en el pla que Matlab els uneix amb rectes)
x=-10:0.2:10; % 101 punts y=sin(x); % 101 imatges plot(x,y); %crea una finestra on es pinta la gràfica de la funció grid; %(opcional)

Exercici 1:
Experimenteu fent servir la funció plot amb tots el modificadors següents:
plot(x,y,'ro'); % per exemple hold on; % per que no es tanqui la finestra i poder dibuixar sobre l'anterior plot(x,y,'b-.'); hold off; % al proper plot es tancarà la finestra i es fa un nou dibuix

Funcions Inline:
Volem representar ara la funció . Aquesta funció l'haurem d'introduir al Matlab com una funció inline
fun=@(t)10*(1-exp(-t/3).*sin(10*t)); %funció inline, la t és la variable de la funció % % La sintaxi: fun=inline('10*(1-exp(-t/3).*sin(10*t)',t); % % També seria correcta però es deixarà de fer servir. x=0:0.01:12; y=fun(x); plot(x,y); %

La funció find
Matlab ofereix una funció molt versàtil que es pot fer servir per conèixer quines components d'un vector (o matriu) compleixen una certa condició.
La sintaxi és: indexos_del_vector = find( condició )
(per més informació feu: doc find)
seguint amb la funció de l'exemple anterior:
index = find(y > 3); numTot = size(index,2) %ens diu quants valors de la funció estan per sobre de 3 %és un vector fila, per això demanem la segona component % Si ara volem fer un tall per una recta i saber els punts que ho satisfan % haurem de vigilar de no fer servir condicions NO apropiades per números % reals (float o double) ja que si fem una igualtat només funcionarà pels enters: index = find(y == 18); numIgual18 = size(index,2) % % Obtenim 0 tot i que sabem que n'hi ha 2 (per la gràfica) % % Si ara fem que la condició sigui: % index = find(abs(y-18) < 0.15); %el valor d'aproximació dependrà del número de punts %tingueu present que NO tenim tota la funció %sino només un conjunt discret de punts. numIgual18 = size(index,2) % Per les condicions més gran > ( >= ), o més petit < ( <= ) NO hi ha aquest problema index = find(y >= 18); %donarà els punts del vector que satisfan la condició. numMesGran18 = size(index,2)
numTot = 1178 numIgual18 = 0 numIgual18 = 2 numMesGran18 = 7
Animació: Exemple de simulació d'un oscil·loscopi
Simularem el comportament d'un oscil·loscopi a partir d'un funció sin(x) que anirem desplaçant a base d'incrementar un angle (fase). També escriurem per pantalla aquest valor i pintem els eixos de coordenades
endFase=7; %valor maxim de variacio de l'angle de Fase incFase=0.05; %increment de la Fase x=-2*pi:0.2:2*pi; %valors de x que pintarem for F=-endFase:incFase:endFase y=sin(x+F); plot(x,y,'r') % ----------------------(opcional) axis([-2*pi 2*pi -1.2 1.2]); grid; line([-2*pi 2*pi],[0 0],'Color','k','LineWidth',2); line([0 0],[-1.2 1.2],'Color','k','LineWidth',2); text(1.15,1.1,['Fase = ' num2str(F,'%.4f')]); % escriu la variable Fase amb 4 decimals % ----------------------(opcional) drawnow; %pause(0.01) %per retardar l'execució (segons) end

Salvar un video de l'animació
Podem guardar un video dels càlculs anteriors simplement afegint 5 linies al nostre exemple anterior (aquí el reproduim sencer
endFase=7; %valor maxim de variacio de l'angle de Fase incFase=0.05; %increment de la Fase x=-2*pi:0.2:2*pi; %valors de x que pintarem % ------------------------ % obrim el fitxer de video % v = VideoWriter('sinusoide.avi'); open(v); % ------------------------ % % for F=-endFase:incFase:endFase y=sin(x+F); plot(x,y,'r') axis([-2*pi 2*pi -1.2 1.2]); grid; line([-2*pi 2*pi],[0 0],'Color','k','LineWidth',2); line([0 0],[-1.2 1.2],'Color','k','LineWidth',2); text(1.15,1.1,['Fase = ' num2str(F,'%.4f')]); % text(x,y,missatge) drawnow; %pause(0.01) %per retardar l'execució (segons) writeVideo(v,getframe); %guardem cada frame de video end % -------------------------- % tanquem el fitxer de video % close(v) % -------------------------- %

(c)Numerical Factory, 2017