//
//
09/10/2019 saurischio@gmail.com
//---------------------------------------------------------------------
clear;clc;clf;warning('off')
//
INPUT
function f=yy(x) // funzione di cui fare la trasformata di Fourier
f=abs(sin(0.71*x-0.3))/(abs(x)+0.5)
endfunction
minx=-4; // minimo per la variabile x
maxx=+5; // massimo per la variabile x
punti=101; // numero di punti campionati
//
ESECUZIONE
//creo
la funzione che genera la serie di Fourier fino all'N-esimo termine
function [fserie, a0, a, b]=Fourier(f, x, minx, maxx, N, n) // f=funzione; x=variabile; N=indice massimo; n+1=#punti
c=minx; // valore minimo
della x considerato nel campionamento
L=(maxx-minx)/2; // metà
dell'intervallo campionato
dx=(maxx-minx)/(n-1) // passo di campionamento
xlist=minx:dx:maxx // valori di x per cui campiono la funzione
a0=0
a=zeros(1,N)
b=zeros(1,N)
for
i=1:n-1
a0=a0+dx*f(xlist(i))/L
for
j=1:N
a(j)=a(j)+dx*f(xlist(i))*cos(j*%pi*xlist(i)/L)/L
b(j)=b(j)+dx*f(xlist(i))*sin(j*%pi*xlist(i)/L)/L
end
end
fserie=a0/2
for
j=1:N
fserie=fserie+a(j)*cos(j*%pi*x/L)+b(j)*sin(j*%pi*x/L)
end
endfunction
//
rappresento graficamente ordini successivi
x=minx:(maxx-minx)/(punti-1):maxx // creo la lista di tutti i valori di x
for i=1:size(x)(2) // calcolo le serie di Fourier troncate agli ordini
1,3,5,7,9 nell'intervallo considerato
funzione(i)=yy(x(i))
fourier1(i)=Fourier(yy,x(i),minx,maxx,1,punti)
fourier3(i)=Fourier(yy,x(i),minx,maxx,3,punti)
fourier5(i)=Fourier(yy,x(i),minx,maxx,5,punti)
fourier7(i)=Fourier(yy,x(i),minx,maxx,7,punti)
fourier9(i)=Fourier(yy,x(i),minx,maxx,9,punti)
end
//
grafico in alto
subplot(2,1,1)
plot(x,funzione,"-k",x,fourier1,"-y",x,fourier3,"-g",x,fourier5,"-r",x,fourier7,"-b",x,fourier9,"-m")
legend("funzione","N=1","N=3","N=5","N=7","N=9")
title("Serie
di Fourier troncate a ordini successivi")
//
function y=relativo(a, b)
y=100*(abs(a-b)/abs(a+b))
endfunction
//
grafico in basso
subplot(2,1,2)
plot(x',relativo(funzione,fourier1),"-y",x',relativo(funzione,fourier3),"-g",x',relativo(funzione,fourier5),"-r",x',relativo(funzione,fourier7),"-b",x',relativo(funzione,fourier9),"-m")
title("Errore relativo")
ylabel("%")
warning('on')
//
creo una tabella su console
[fserie,a0,a,b]=Fourier(yy,x(i),minx,maxx,9,punti);
moduli=sqrt(a^2+b^2); // gli Xn della 18.7
fasi=atan(b./a); // le fasi della 18.7
titolo="Coefficienti
della Serie di Fourier"
nomi=["ordine"," a"," b"," modulo"," fase
"]
dati=cat(2,(1:9)',a',b',moduli',fasi')
disp(nomi)
disp(dati)
disp("Valor
medio a0 = "+string(a0/2))

Nessun commento:
Posta un commento