Neka je $f$ po djelovima glatka periodična funkcija s periodom $T=x_1-x_0$ koja na intervalu $[x_0,x_1]$ zadovoljava Dirichletove uvjete:
Tada Fourierov red $$ S(x)=\frac{a_0}{2}+\sum_{n=1}^\infty a_n \cos \frac{2 n \pi}{T}x + b_n \sin \frac{2 n \pi}{T}x, $$ gdje je $$ a_0=\frac{2}{T} \int_{x_0}^{x_1} f(x) \, dx, \\ a_n=\frac{2}{T} \int_{x_0}^{x_1} f(x) \cos \frac{2 n \pi}{T}x \,dx,\\ b_n=\frac{2}{T} \int_{x_0}^{x_1} f(x) \sin \frac{2 n \pi}{T}x \,dx, $$ konvergira u svakoj točki $x\in [x_0,x_1]$ i vrijedi $$ S(x)=\begin{cases} f(x), \textrm{ ako je } f \textrm{ neprekinuta u točki } x,\\ \frac{1}{2} [f(x-0)+f(x+0)], \textrm{ inače.} \end{cases} $$
In [1]:
using SymPy
using Interact
using Winston
Definirajmo simboličku varijablu $x$, simboličku cjelobrojnu (integer) varijablu $n$, i granice intervala $x_0$ i $x_1$.
In [2]:
x=Sym("x")
n=symbols("n",integer=true)
x_0=Sym("x_0")
x_1=Sym("x_1")
Out[2]:
In [3]:
a(f,n,x_0,x_1)=2*integrate(f(x)*cos(2*PI*n*x/(x_1-x_0)),(x,x_0,x_1))/(x_1-x_0)
b(f,n,x_0,x_1)=2*integrate(f(x)*sin(2*PI*n*x/(x_1-x_0)),(x,x_0,x_1))/(x_1-x_0)
Out[3]:
In [4]:
f(x)=x
x_0=-PI
x_1=PI
Out[4]:
Pogledajmo koeficijente
In [5]:
a(f,n,x_0,x_1)
Out[5]:
In [6]:
b(f,n,x_0,x_1)
Out[6]:
In [7]:
x0=N(x_0)
x1=N(x_1)
@manipulate for K=1:10
S=a(f,0,x_0,x_1)/2+sum([a(f,n,x_0,x_1)*cos(2*PI*n*x/(x_1-x_0))+b(f,n,x_0,x_1)*sin(2*PI*n*x/(x_1-x_0)) for n=1:K])
g(x)=S(x)
plot(f,x0,x1)
oplot(g,x0,x1,"r")
title("Funkcija i "*string(K)*" članova reda")
end
Out[7]:
Fourierove koeficijente čemo izračunati numeričkom integracijom (vidi Numeričko integriranje) koristeći Julia naredbu quadgk.
Ovaj dio je izrađen prema bilježnici lecture-2.ipynb Stevena Johnsona izrađenoj za predmet 18.303.
Definirajmo funkcije sinecoef i coscoef koje numerički računaju koeficijente. Parametar abstol je toleranca numeričke integracije: želimo da je greška mala u odnosu na $\sqrt{\int_{x_0}^{x_1} |f(x)|^2 dx}$.
In [8]:
Tf=x1-x0
sinecoef(f, m, x0, x1, Tf) = 2 * quadgk(x -> f(x) * sin(2*m*π*x/Tf)/Tf, x0,x1, abstol=1e-8 * sqrt(quadgk(x->abs2(f(x)),x0,x1)[1]))[1]
coscoef(f, m, x0, x1, Tf) = 2 * quadgk(x -> f(x) * cos(2*m*π*x/Tf)/Tf, x0,x1, abstol=1e-8 * sqrt(quadgk(x->abs2(f(x)),x0,x1)[1]))[1]
# i druga funkcija koja računa na vektoru prirodnih brojeva
sinecoef(f, M::AbstractVector,x0,x1,Tf) = Float64[sinecoef(f,m,x0,x1,Tf) for m in M]
coscoef(f, M::AbstractVector,x0,x1,Tf) = Float64[coscoef(f,m,x0,x1,Tf) for m in M]
Out[8]:
In [9]:
# First, define a function to evaluate N terms of the sine series, given the coefficients b
function fouriersum(a, b, x, T)
f = a[1]/2
for n = 1:length(b)
f += a[n+1]* cos(2*n*π*x/T) + b[n] * sin(2*n*π*x/T)
end
return f
end
fouriersum(a, b, X::AbstractVector, T) = Float64[fouriersum(a, b,x,T) for x in X]
Out[9]:
In [11]:
# Uzmimo više točaka (inače "nestane" Gibbsov efekt!!)
X=linspace(x0,x1,1000)
@manipulate for n=1:1:99
a = coscoef(f, 0:n, x0, x1, Tf)
b = sinecoef(f, 1:n, x0, x1, Tf)
plot(f,x0,x1,"b",X, fouriersum(a, b, X, Tf), "r-")
title("Funkcija i "*string(n)*" članova reda")
end
Out[11]:
In [13]:
f1(x)=x^2
x_0=-1
x_1=1
Out[13]:
In [15]:
a(f1,n,x_0,x_1)
Out[15]:
In [16]:
x0=N(x_0)
x1=N(x_1)
@manipulate for K=1:10
S=a(f1,0,x_0,x_1)/2+sum([a(f,n,x_0,x_1)*cos(2*PI*n*x/(x_1-x_0))+b(f1,n,x_0,x_1)*sin(2*PI*n*x/(x_1-x_0)) for n=1:K])
g(x)=S(x)
plot(f1,x0,x1)
oplot(g,x0,x1,"r")
title("Funkcija i "*string(K)*" članova reda")
end
Out[16]:
In [19]:
Tf=x1-x0
X=linspace(x0,x1,1000)
@manipulate for n=1:1:99
a = coscoef(f1, 0:n, x0, x1, Tf)
b = sinecoef(f1, 1:n, x0, x1, Tf)
plot(f1,x0,x1,"b",X, fouriersum(a, b, X, Tf), "r-")
title("Funkcija i "*string(n)*" članova reda")
end
Out[19]:
In [20]:
# Funkcija zadana po djelovima
f2(x)=x+abs(x)
x_0=-1
x_1=1
Out[20]:
Na ovu funkciju, zadanu po djelovima, ne mogu se direktno primijeniti simboličke formule, već bi ih trebalo "ručno" prilagoditi na odgovarajuči interval. Numeričko računanje radi. Funkcija se još može zadati i kao
f(x)=sympy.Piecewise((0,x<=0), (x,x>0))
ili
f(x)=x*sympy.Heaviside(x)
In [22]:
# a(f2,n,x_0,x_1)
In [25]:
x0=N(x_0)
x1=N(x_1)
Tf=x1-x0
X=linspace(x0,x1,1000)
@manipulate for n=1:2:99
a = coscoef(f2, 0:n, x0, x1, Tf)
b = sinecoef(f2, 1:n, x0, x1, Tf)
plot(f2,x0,x1,"b",X, fouriersum(a, b, X, Tf), "r-")
title("Funkcija i "*string(n)*" članova reda")
end
Out[25]:
In [ ]: