Lezioni

2.1.3.1

// Grafico di serie di Fourier troncate a differenti ordini
//
// 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