using LinearAlgebra
using Plots
Séries de Fourier são séries compostas de senos e/ou cossenos, ou, ainda, de exponenciais complexas.
São semelhantes as séries de Tayor, que são séries de potências.
As séries de Taylor representam funções bastante suaves (ditas reais analíticas, em que a série converge uniformemente em vizinhanças apropriadas).
Já as séries de Fourier podem representar funções de regularidade bem menor.
As séries de Fourier podem ser interpretadas de um ponto de vista de álgebra linear, com os senos e cossenos formando uma base ortogonal de um espaço de dimensão infinita e a série sendo a representação da função nessa base.
Assim como séries de potências, as séries de Fourier podem ser definidas para funções em uma ou mais variáveis.
Como senos e cossenos são funções periódicas, as séries de Fourier estão naturalmente ligadas a funções periódicas.
Mas elas também podem são usadas para representar funções definidas em intervalos limitados. Basta observarmos que podemos transladar a função inúmeras vezes para contruir uma função periódica definida em toda a reta.
Uma série de Fourier de senos e cossenos de uma função $f:\mathbb{R}\rightarrow\mathbb{R}$ que seja periódica de período $L$ tem a forma
Na representação acima, $a_k,b_k \in \mathbb{R}$.
Na forma complexa, temos coeficientes complexos $c_k\in \mathbb{C}$, $k\in \mathbb{Z}$, com a série dada por
e norma $$ \|f\| = \left(\int_{-L/2}^{L/2} |f(x)|^2\;\mathrm{d} x\right)^{1/2}. $$
Dada uma função definida em um intervalo limitado de comprimento $L$, digamos $f:[x_0, x_0+L]\rightarrow\mathbb{R}$, podemos estender $f$ a uma função $L$-periódica na reta fazendo cópias transladadas de $f$.
Nesse caso, a série de Fourier da função estendida também representa a função original quando a série é restrita ao intervalor $[x_0, x_0 + L]$.
E por conta das translações, os coeficientes podem ser escritos em termos da função original e de integrais no intervalo $[x_0, x_0 + L]$.
Por exemplo, para uma função $f:[0,L] \rightarrow \infty$, temos os coeficientes
Observe que, se $f$ for simétrica, i.e. $f(x) = f(-x)$, $x\in [-L/2, L/2]$, então, sendo $\sin(2k\pi x/L)$ antisimétrico, o integrando $f(x)\sin(2k\pi x/L)$ é antisimétrico e os coeficientes $b_k$ todos se anulam.
Com isso, para uma função simétrica, temos apenas uma série de cossenos:
Para $\bar f$, temos uma série apenas de cossenos, conforme argumentado acima. Mas, no final das contas, restringindo a série a apenas o intervalo $[0,L]$, isso nos dá uma série de cossenos para uma função arbitrária $f$, não apenas para as simétricas.
Nesse caso, observe que os coeficientes são ligeiramente diferentes, sendo o dobro dos coeficientes da série que contém tanto senos como cossenos, pois teremos um intervalo $[-\tilde L/2, \tilde L/2]$, com $\tilde L = 2L$, não havendo contradições.
Nesse caso, os elementos da base são
Analogamente, se $f$ for antisimétrica, i.e. $f(x) = -f(-x)$, $x\in [-L/2, L/2]$, então, sendo $\cos(2k\pi x/L)$ simétrico, o integrando $f(x)\cos(2k\pi x/L)$ é antisimétrico e os coeficientes $a_k$ todos se anulam.
Com isso, para uma função anti-simétrica, temos apenas uma série de senos:
Para $\bar f$, temos uma série apenas de senos, conforme argumentado acima. Mas, no final das contas, restringindo a série a apenas o intervalo $[0,L]$, isso nos dá uma série de senos para uma função arbitrária $f$, não apenas para as anti-simétricas.
Mais uma vez, observe que os coeficientes são ligeiramente diferentes, sendo o dobro dos coeficientes da série que contém tanto senos como cossenos, pois teremos um intervalo $[-\tilde L/2, \tilde L/2]$, com $\tilde L = 2L$, não havendo contradições.
Nesse caso, os elementos da base são
A série de senos é particularmente útil para funções que se anulam nos extremos.
Isso está ligado ao fato de que todas os senos $\sin(k\pi x/L)$ da base ortonormal se anulam nos extremos $[0,L]$.
Por outro ponto de vista, se $f:[0,L]\rightarrow \mathbb{R}$ é uma função suave, contínua e que se anula nos extremos, então a extensão a seguir é antisimétrica e contínua em $[-L,L]$
Observe, aliás, que repetindo a função a cada intervalo $2nL + [-L, L]$, $n\in \mathbb{Z}$, obtemos uma função periódica contínua em toda a reta.
Mais ainda, se $f$ for continuamente diferenciável em $[0,L]$ (considerando derivada à direito em $x=0$ e à esquerda em $x=L$), então essas extensões também são continuamente diferenciáveis.
No caso em que $f:[0,L]\rightarrow \mathbb{R}$ é periódica, com $f(0)=f(L)$, $f'(0)=f'(L)$, etc., então a extensão simétrica para $[-L,L]$ tem a mesma regularidade de $f$ até onde as derivadas nos extremos coincidem.
Nesse caso, a série de cossenos é bastante apropriada.
Logo, $c_{-k} = \alpha_{-k} + i\beta_{-k} = \alpha_k - i\beta_k = \overline{c_k}$.
Ou seja, os coeficientes devem ser complexos conjugados entre si:
Ambos $\sin(2k\pi x/L)$ e $\cos(2k\pi x/L)$ têm o mesmo período $L/k$ e a mesma frequência $\omega = k/L$. Assim como qualquer combinação linear deles.
Eles todos podem ser escritos na forma de seno ou de cosseno através da inclusão de um termo de translação chamado de fase.
Denotando essa fase por $\varphi$, temos, por exemplo,
Mais geralmente, se $A$ e $B$ são reais, então $\alpha = A/\sqrt{A^2+B^2}$ e $\beta=B/\sqrt{A^2+B^2}$ são tais que $\alpha^2 + \beta^2 = 1$.
Assim, existe um ângulo $\varphi$ tal que $\alpha = \cos\varphi$ e $\beta=\sin\varphi$, de modo que
A convergência da série para a função depende da regularidade da função.
Na verdade, há vários tipos de convergência (pontual, uniforme, quase-sempre, etc.) e várias condições para essas convergências.
Por exemplo, caso uma função $f$ seja diferenciável em um ponto, então a série converge pontualmente para $f$, nesse ponto, naturalmente.
Caso a função seja continuamente diferenciável no intervalo, então a convergência é uniforme.
As convergências pontual e uniforme acima se estendem, ainda, aos casos em que $f$ é Hölder contínua no ponto ou no intervalo, respectivamente.
Caso a função seja descontínua em um ponto, mas com limites e derivadas bem definidas em cada lado do ponto, então a série converge naquele ponto, para o valor médio dos limites laterais da função, sofrendo, no entanto, o efeito de Gibbs, em que as somas parcias da série oscilam cada vez mais, conforme mais termos são incluídos.
Caso a função seja de quadrado integrável, então a convergência se dá na norma $L^2$, i.e. do espaço de funções de quadrado integrável.
Caso a função pertença a um espaço $L^p$ com $p>1$, i.e. a sua potência $p$ seja integrável, então a convergência é quase-sempre.
Caso a função seja apenas contínua, a série pode não convergir...
A convergência em $L^2$ é a mais simples de se "enxergar".
Como dito acima, é uma generalização, para dimensão infinita, do conceito de representação de um vetor em uma base ortogonal.
O espaço $L^2$ é um exemplo do que chamamos, mais geralmente, de um espaço de Hilbert:
Outro exemplo bastante conhecido é o espaço Euclidiano, ou seja, o $\mathbb{R}^n$ munido do produto escalar.
Para simplificar, vamos considerar apenas a série de senos, mas as mesmas ideias podem ser reproduzidas para as outras séries.
Vamos considerar uma função no intervalo $I=[0,L]$, buscando a representação obtida com o argumento acima de extensão para uma função anti-simétrica.
Denotamos o conjunto ortogonal de senos por $\{w_{s,k}\}_{k\in\mathbb{N}}$, onde
Como $f$ tem quadrado integrável (bastaria integrável), os coeficientes estão bem definidos.
As somas parciais são denotadas por
Um primeiro resultado importante é que cada soma parcial $S_m(f)$ é a melhor aproximação de $f$ no subsespaço $E_m$ gerado pelos primeiros $m$ elementos $w_{s,1}, \ldots, w_{s,m},$ do conjunto ortogonal.
De fato, $S_m(f)$ é a projeção ortogonal de $f$ em $E_m$.
Para ver isso, precisamos mostrar que $f-S_m(f) \perp v$, para qualquer $v\in E_m$, ou seja
para quaisquer $c_1, \ldots, c_m\in \mathbb{R}$.
Lembrando que $\hat f_k = \langle f, w_{s,k} \rangle/\|w_{s,k}\|^2$, vemos que cada termo do somatório acima se anula, nos dando a ortogonalidade.
A construção acima, na verdade, pode ser usada como ponto de partida para a obtenção dos coeficientes de Fourier apropriados.
Naturalmente, como $E_m \subset E_n$, para quaisquer $m\leq n$, as aproximações ficam cada vez melhores (a menos que $f\in E_m$).
Mais precisamente, observe, primeiro, que
Como $S_n(f), S_m(f)\in E_n$, então $S_n(f)-S_m(f) \in E_n$.
Como $S_n(f)$ é a projeção ortogonal de $f$ em $E_n$, então $f-S_n(f)$ é perpendicular a $E_n$, em particular ortogonal a $S_n(f)-S_m(f)$.
Assim, $\langle f - S_n(f), S_n(f) - S_m(f) \rangle = 0$, de modo que
A convergência é mais delicada.
Vamos simplificar assumindo hipóteses mais fortes de regularidade.
Vamos assumir, aqui, que $f$ é continuamente diferenciável.
Assim, integrando por partes,
Falta mostra que $s=f$, ou seja, que a série converge, de fato, para $f$, ao invés de para alguma outra função.
Em princípio, poderíamos ter que o fecho (i.e. os limites) da união dos subespaços $E_n$ fosse um subespaço próprio de $L^2$, i.e. $\overline{\bigcup E_n} \subsetneqq L^2$. Felizmente, isso não acontece.
Se isso fosse verdade, então teríamos $f - s$ ortogonal a todos os subespaços $E_n$. Ou seja, seria ortogonal a todos os $w_{s, k}$.
Mas é possível mostrar que se uma função $g\in L^2(0, L)$ é ortogonal a todos os $w_{s, k}$, então $g$ é nula. Aplicando isso a $g = f - s$, obtemos que $f = s$.
Vamos considerar funções em um intervalo $[0,L]$ e expansões em séries de senos.
No cálculo numérico, definimos uma resolução espacial para a função e um número máximo de termos da série.
L = 1.0
x = 0.0:0.01:L
ν₁ = 1/(2L) # smallest frequency, inverse of the largest period λ = 2L of sin(kπx/L), for wavenumber k=1
nothing
M = 100
ν = ν₁ * (1:M)
nothing
"""
serie_senos(f::Vector{T}, x::Union{Vector{T}, AbstractRange{T}}, L::T, M::Int64) where {T<:Float64}
Retorna os `M` primeiros coeficientes e somas parciais da série de senos da função `f`.
Assume-se que a função `f` está definida na malha `x` e que a malha `x` é uniforme e
se estende de `0.0` a `L`.
Retorna o par `f̂, S`, onde `f̂::Vector{Float64}` contém os coeficientes da série
e onde as colunas de `S:Matrix{Float64}` contêm as somas parciais da série.
"""
function serie_senos(f::Vector{T}, x::Union{Vector{T}, AbstractRange{T}}, L::T, M::Int64) where {T<:Float64}
dx = L / (length(x) - 1)
f̂ = fill(0.0, M) # prealocando vetor para os coeficientes da série de senos
S = fill(0.0, length(x), M) # prealocando matriz cujas colunas serão as somas parciais da séries
for m = 1:M
f̂[m] = (2/L) * sum(f ⋅ sin.(m * π * x / L)) * dx
if m == 1
S[:,m] = f̂[m] * sin.(m * π * x / L)
else
S[:,m] = S[:,m-1] .+ f̂[m] * sin.(m * π * x / L)
end
end
return f̂, S
end
serie_senos
Primeiramente, vamos considerar uma função suave.
Escolhemos um polinômio de grau quatro que se anula, junto com as suas derivadas, nos extremos do intervalo $[0,L]$:
Nesse caso, como a função é suave, a convergência da série de senos é rápida.
Mais precisamente, como a função é continuamente infinitas vezes diferenciável e tanto a função quanto a sua primeira derivada se anulam nos extremos do intervalo, os coeficientes da série decam com o quadrado do número de onda $k$.
fpol = x.^2 .* (L .- x).^2 # função discretizada
fpol_str = "x²(L-x²)"
f̂pol, Spol = serie_senos(fpol, x, L, M)
([0.0556930353147588, 4.2081105039362e-18, -0.008265038705959678, 5.620910637979537e-19, -0.0019637072586061294, 7.2655098083684865e-19, -0.0007335498612589683, -4.948027664680721e-19, -0.0003486041924548694, 1.2164070748929556e-18 … -1.4517390709121127e-7, -7.928906012658055e-19, -1.1172388030253702e-7, 4.006601365784401e-18, -7.917319701436914e-8, 2.9916187257485184e-18, -4.7254197580442814e-8, -5.4604588808470495e-17, -1.5709988264326937e-8, -1.8523187059874905e-18], [0.0 0.0 … 0.0 0.0; 0.0017493605146015794 0.0017493605146015796 … 9.800999999983855e-5 9.800999999983855e-5; … ; 0.0017493605146015763 0.0017493605146015761 … 9.800999999982155e-5 9.800999999982155e-5; 6.820429743301986e-18 6.8204297433019855e-18 … -2.713478482494707e-19 -2.7134784824947434e-19])
plot(x, fpol, title="Aproximações por séries de senos de f(x) = $fpol_str", titlefont=10,
xlabel="x", ylabel="y", label="y=f(x)", legend=:topright)
plot!(x, Spol[:,1:3:10], label = hcat(["m=$m" for m in 1:3:10]...), linestyle=:dash)
plot(x, fpol, title="Aproximações por séries de Fourier de f(x) = min(2x, 2L-2x)", titlefont=10,
xlabel="x", ylabel="y", label="y=f(x)", legend=:topright)
plot!(x, Spol[:,10:20:50], label = hcat(["m=$m" for m in 10:20:50]...), linestyle=:dash)
scatter(ν, abs.(f̂pol),
title="Decaimento do valor absoluto dos coeficientes de Fourier", titlefont=10,
xlabel="ν=k/L", ylabel="|f̂|", label=false, xscale=:log10, yscale=:log10
)
ftri = L .- 2*abs.(x .- L/2)
ftri_str = "L-2|x-L/2|"
f̂tri, Stri = serie_senos(ftri, x, L, M)
for mrange in (1:3:10, 10:20:50, 40:20:100)
p = plot(x, ftri, title="Aproximações por séries de senos de f(x) = $ftri_str", titlefont=10,
xlabel="x", ylabel="y", label="y=f(x)", legend=:topright)
plot!(p, x, Stri[:,mrange], label = hcat(["m=$m" for m in mrange]...), linestyle=:dash)
display(p)
end
scatter(ν, abs.(f̂tri),
title="Decaimento do valor absoluto dos coeficientes de Fourier", titlefont=10,
xlabel="ν=2k/L", ylabel="|f̂k|", label=false, xscale=:log10, yscale=:log10
)
A onda quadrada é contínua por partes e continuamente diferenciável por partes.
Nos pontos de descontinuidade, a série de Fourier converge para o ponto médio dos valores extremos e apresenta o fenômeno de Gibbs.
fquad = ifelse.(L/4 .≤ x .≤ 3L/4, 1.0, 0.0)
fquad_str = "χ_{[L/4, 3L/4]}" # A função caraterística do intervalo [L/4, 3L/4]
f̂quad, Squad = serie_senos(fquad, x, L, M)
for mrange in (1:3:10, 10:20:50, 40:20:100)
p = plot(x, fquad, title="Aproximações por séries de senos de f(x) = $fquad_str", titlefont=10,
xlabel="x", ylabel="y", label="y=f(x)", legend=:topright)
plot!(p, x, Squad[:,mrange], label = hcat(["m=$m" for m in mrange]...), linestyle=:dash)
display(p)
end
scatter(ν, abs.(f̂quad),
title="Decaimento do valor absoluto dos coeficientes de Fourier", titlefont=10,
xlabel="ν=2k/L", ylabel="|f̂k|", label=false, xscale=:log10, yscale=:log10)
scatter(ν, abs.(f̂pol), xscale=:log10, yscale=:log10,
title="Decaimento do valor absoluto dos coeficientes de Fourier", titlefont=10,
xlabel="ν=2k/L", ylabel="|f̂k|", label="suave",
legend = :bottomleft
)
scatter!(ν, abs.(f̂tri), xscale=:log10, yscale=:log10,
xlabel="ν=2k/L", ylabel="|f̂k|", label="triangular"
)
scatter!(ν, abs.(f̂quad), xscale=:log10, yscale=:log10,
xlabel="ν=2k/L", ylabel="|f̂k|", label="quadrado"
)
plot!([first(ν), last(ν)], abs(first(f̂tri)) ./ [first(ν), last(ν)],
label = "decaimento linear"
)
plot!([first(ν), last(ν)], abs(first(f̂tri)) ./ [first(ν)^2, last(ν)^2],
label = "decaimento quadrático"
)
plot!([first(ν), last(ν)], abs(first(f̂tri)) ./ [first(ν)^3, last(ν)^3],
label = "decaimento cúbico"
)
decai_pol = abs.(f̂pol)
decai_tri = abs.(f̂tri)
decai_quad = abs.(f̂quad)
for j in M-1:-1:1
decai_pol[j] = max(decai_pol[j], decai_pol[j+1])
decai_tri[j] = max(decai_tri[j], decai_tri[j+1])
decai_quad[j] = max(decai_quad[j], decai_quad[j+1])
end
plot(ν, decai_pol, yaxis=:log10, xaxis=:log10,
title="Decaimento do valor absoluto dos coeficientes de Fourier", titlefont=10,
xlabel="ν=2k/L", ylabel="max{|f̂j|, j≥ k}", label="polinomial", legend=:bottomleft)
plot!(ν, decai_tri, label="triangular", yaxis=:log10, xaxis=:log10)
plot!(ν, decai_quad, label="quadrado", yaxis=:log10, xaxis=:log10)
Para concluir, vamos considerar uma combinação de senos com frequências múltiplas da frequência básica $\nu_1 = 1/(2L)$.
Nesse caso, esperamos que a função seja igual as somas parciais com um número suficiente de termos.
E que o espectro seja não negativo apenas nos termos correspondentes às frequências existentes na definição da função.
fcs = 5sin.(π * 2ν₁ * x) .- 2sin.(3π * 2ν₁ * x) .+ 5sin.(7π * 2ν₁ * x) .+ 2sin.(18π * 2ν₁ * x)
fcs_str = "senos com frequências ν₁, 3ν₁, 7ν₁ e 18ν₁" # A função caraterística do intervalo [L/4, 3L/4]
f̂cs, Scs = serie_senos(fcs, x, L, M)
for mrange in (1:3:10, 14:17, 18:2:30)
p = plot(x, fcs, title="Aproximações por séries de senos de f(x) = $fcs_str", titlefont=9,
xlabel="x", ylabel="y", label="y=f(x)", legend=:topright)
plot!(p, x, Scs[:,mrange], label = hcat(["m=$m" for m in mrange]...), linestyle=:dash)
display(p)
end
scatter(ν, f̂cs,
title="Coeficientes de Fourier", titlefont=10,
xlabel="ξ=πk/L", ylabel="f̂k", label=false)
Escreva a expansão em série de senos e cossenos de uma função $f$ definida em um intervalo $[L_0, L_1]$, incluindo a fórmula dos coeficientes.
Escreva a expansão em série apenas de senos de uma função $f$ definida em um intervalo $[L_0, L_1]$, incluindo a fórmula dos coeficientes.
Escreva a expansão em série apenas de cossenos de uma função $f$ definida em um intervalo $[L_0, L_1]$, incluindo a fórmula dos coeficientes.
Calcule explicitamente os coeficientes da série de senos da função triangular $f(x) = L-2|x-L/2|$, $0\leq x \leq L$, $L>0$, e observe que todos os coeficientes $\hat f_k$ com $k$ par se anulam.
Mostre que se $f:[0,L]\rightarrow \mathbb{R}$ é duas vezes continuamente diferenciável em $[0,L]$ e $f(0)=f(L)=0$, então os coeficientes da série de senos de $f$ decaem da ordem $k^{-2}$.
Implemente uma função para o cálculo numérico da expansão em série de cossenos, analoga à feita acima para a série de senos, e calcule os coeficientes e as somas parciais das séries de cossenos das funções trabalhadas acima (polinômio, onda triangular e onda quadrada).