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:

(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ó $$f(x)=10(1-e^{\frac{-x}{3}}\sin(10x))$. 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