% Y=SINFAF(X) där X är en matris med reella eller komplexa tal returnerar
% en matris Y sådan att Y(i)=2*SIN(2*PI*X(i)-PI/2).
%
% Y=SINFAF(X,OMEGA) med X som ovan, OMEGA är en skalär, returnerar Y som 
% ovan men där Y(i)=2*SIN(OMEGA*X(i)-PI/2).
%
% Y=SINFAF(X,OMEGA,A) där A är en skalär returnerar Y sådan att
% Y(i)=A*SIN(OMEGA*X(i)-PI/2).
%
% Y=SINFAF(X,OMEGA,A,PHI) där PHI är en skalär returnerar Y sådan att
% Y(i)=A*SIN(OMEGA*X(i)-PHI).
%
% [Y,dY]=SINFAF(X,OMEGA,A,PHI) returnerar också derivatan dY dvs 
% dY(i)=OMEGA*A*COS(OMEGA*X(i)-PHI). Precis som för Y sätts OMEGA, A och
% PHI till värdena 2*PI, 2 respektive PI/4 om de inte tillhandahålls av
% användaren
%

function [y,df]=sinfaf(x,freq,amp,phase)
antInArg=nargin;   %NARGIN är en matlabfunktion som returnerar antalet av 
                   %användaren inskickade argument.
antUtArg=nargout;  %NARGOUT är en matlabfunktion som returnerar antalet av 
                   %användaren begärda utargument.

% Vi testar hur många argument som inte har tilldelats något värde vi
% anropet och sätter de som inte har fått något till förinställda värden.
if antInArg==1
    freq=2*pi; amp=2; phase=pi/4;
elseif antInArg==2
    amp=2; phase=pi/4;
elseif antInArg==3
    phase=pi/4;
elseif antInArg==4
    disp('Bra jobbat!')
else
    error('Antalet inargument måste vara mellan 1 och 4')
end

y=amp*sin(freq*x-phase); %Här räknar vi ut sinusvärdet:

% Föra att slippa räkna ut derivatan testar vi om användaren har angett att
% den vill ha den. Om så inte är fallet så låter vi bli och sparar tid. Det
% hade inte blivit fel om vi tagit bort den här satsen men vi hade gjort
% extrajobb.
if antUtArg==2
    df=freq*amp*cos(freq*x-phase);
end