Sharednotebooks / 6.SeriesDeFourier.ipynbOpen in CoCalc
%html
<h2 style="color: rgb(51, 102, 255);">1. Comandos Básicos
do Sage para Manipulação de Séries de Fourier</h2>
<br>
<span style="font-family: Verdana;"> </span>
%html
O Sage possui um pequeno conjunto de comandos que permitem extrair as principais informações sobre a Série de Fourier de uma função que, em geral, é contínua por partes e fornecida em um intervalo [-L,L].<br>
O Sage oferece um comando que permite a definição da função satisfazendo essas condições: <span style="color: rgb(51, 102, 255);">Piecewise</span>.<br>
Essa função recebe uma lista de pares cujos elementos são o intervalo e a função nesse intervalo.<br>
Como exemplo, vamos definir a função:

$$ f(x) = \left\{ \begin{array}{ccl} 1, &\quad & 0 \lt x \lt 1 \\ 1-x, & \quad & 1 \lt x \lt 2 \\ \end{array} \right. $$
e traçar seu gráfico.
#Exemplo
f1(x)=1
f2(x)=1-x
f=Piecewise([[(0,1),f1],[(1,2),f2]])
f.plot().show()

%html
Vejamos, agora, os comandos diretamente relacionados às Séries de Fourier<br>
<br>
<span style="color: rgb(51, 102, 255);">a) fourier_series_cosine_coefficient(n,L)</span><br>

Retorna o n-ésimo coeficiente de $\cos{(n\pi x/L)}$ ou seja, $a_n=\frac{1}{L}\int_{-L}^{L}f(x)\cos{(n\pi x/L)}$<br>
Os parâmetros de entrada são o índice do coeficiente, n (começando em zero) e L (o período/2)<br><br>

<span style="color: rgb(51, 102, 255);">a) fourier_series_sine_coefficient(n,L)</span><br>

Retorna o n-ésimo coeficiente de $\sin{(n\pi x/L)}$ ou seja, $b_n=\frac{1}{L}\int_{-L}^{L}f(x)\sin{(n\pi x/L)}$<br>
Os parâmetros de entrada são o índice do coeficiente, n (começando em zero) e L (o período/2)<br><br>

<span style="color: rgb(51, 102, 255);">a) fourier_series_value(x,L)</span><br>

Retorna o valor da Série de Fourier em um ponto dado, x. Os parâmetros de entrada são o ponto onde se quer avaliar a Série de Fourier e o valor de L.<br>
Um importante uso desta função é avaliar a Série de Fourier em um ponto de descontinuidade, já que ela leva em conta o Teorema da Convergência Pontual.<br><br>

<span style="color: rgb(51, 102, 255);">a) fourier_series_partial_sum(N,L)</span><br>

Retorna a Soma Parcial da Série de Fourier, considerando os primeiros N termos da série. Os parâmetros de entrada são N e L.<br><br>

No Exemplo dado a seguir, vamos manipular a Série de Fourier da função: $$ f(x) = \left\{ \begin{array}{ccl} 1, &\quad & -L \lt x \lt 0 \\ 1+\frac{x}{L}, & \quad & 0 \le x \lt L \\ \end{array} \right. $$

Vejamos exemplos de uso de cada um dos comandos apresentados.<br>
Preste atenção no fato de que, no Sage, o termo constante é tomado como $\frac{a_0}{2}$ e nós tomamos como sendo $a_0$.
L=var('L')
L=2 # definindo um valor específico para L
# Definindo a função contínua por partes
f1(x)=1
f2(x)=1+x/L
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
# Determinando o coeficiente a0 (n=0 da parte em cossenos; sabemos do Tutorial teórico que a0=5/2)
fc.fourier_series_cosine_coefficient(0,L)
# Determinando o coeficiente b1 (n=1 da parte em senos)
fc.fourier_series_sine_coefficient(1,L)
# Determina o valor da Série de Fourier nos pontos de descontinuidade x=-2 e x=6
fc.fourier_series_value(-2,2)
fc.fourier_series_value(6,2)
# Mostrando a Soma Parcial para N=8
fsp=fc.fourier_series_partial_sum(8,L)
show(fsp)
# Gráfico sobrepondo a função (em vermelho, no intervalo [-L,L]) e a soma parcial da Série de Fourier com N=30 (extensão periódica exibida para [-6,6])
P1=fc.plot(color='red')
P2=fc.plot_fourier_series_partial_sum(30,L,-6,6)
(P1+P2).show()
%html
Acabamos de ver que os recursos básicos do Sage são suficientes para extrair informações relevantes sobre a Série de Fourier de uma função: explorar a convergência pontual, determinar as somas parciais e verificar sua convergência, graficamente.<br>
Entretanto, uma limitação é evidente: e se desejamos determinar a expressão analítica dos coeficientes de Fourier? Observe que os comandos examinados não fornecem uma expressão geral, apenas o valor de cada coeficiente individual.<br>
A saída é executar cálculos simbólicos mais elaborados mas, felizmente, o Sage oferece todos os recursos necessários para isso, como veremos a seguir.


%html
No Tutorial (teórico) <strong>4. Representação de Funções por Séries de Fourier. Problemas Resolvidos</strong> foram discutidos três exemplos nos quais os coeficientes de Fourier foram calculados manualmente.<br>
Vejamos como cada um desses exemplos pode ser resolvido usando o Sage.<br><br>

<span style="color: rgb(51, 102, 255);">Exemplo 1</span>
$$ f(x) = \left\{ \begin{array}{ccl} 0, &\quad & -\pi \le x \lt 0 \\ 1, & \quad & 0 \le x \lt \pi \\ \end{array} \right. $$
<br>
Lembrando que $a_0=\frac{1}{2L}\int_{-L}^{L}f(x)dx$, $a_n=\frac{1}{L}\int_{-L}^{L}f(x)\cos{(n\pi x/L)}dx$ e $b_n=\frac{1}{L}\int_{-L}^{L}f(x)\sin{(n\pi x/L)}dx$, o código fornecido a seguir, define os integrandos (por partes) e calcula os coeficientes de Fourier.<br>
Acompanhe os exemplos: os comentários esclarecem as etapas do procedimento. Depois, compare os resultados com os obtidos manualmente no Tutorial mencionado.<br>
# Exemplo 1
n=var('n')
assume(n,'integer') # assumir que n é inteiro, é importante para que o Sage execute simplificações de funções trigonométricas do tipo cos(n*pi)
L=pi # define o intervalo, neste caso, L=pi

# Cálculo do coeficiente a0
f1(x)=0 # f(x) no primeiro trecho
f2(x)=1 # f(x) no segundo trecho
fc = Piecewise([[(-pi,0),f1],[(0,pi),f2]]) # constroi a função piecewise para todo o intervalo (é o integrando do coeficiente a0)
a0=(1/(2*L))*fc.integral(x,definite=True) # calcula a integral correspondente a a0; observe o parâmetro definite=True, necessário porque a0 é uma integral definida

# Cálculo do coeficiente an
fa1(x)=0 # f(x) primeiro trecho
fa2(x)=cos((n*L*x)/pi) # f(x) no segundo trecho: é o produto 1 * cos(n pi x/L)
fcna = Piecewise([[(-pi,0),fa1],[(0,pi),fa2]]) # constroi a função piecewise para todo o intervalo (é o integrando do coeficiente an)
an=(1/L)*fcna.integral(x,definite=True)

# Cálculo do coeficiente bn
fb1(x)=0 # f(x) primeiro trecho
fb2(x)=sin((n*pi*x)/L) # f(x) no segundo trecho: é o produto 1 * sen(n pi x/L)
fcnb = Piecewise([[(-pi,0),fb1],[(0,pi),fb2]])
bn=(1/L)*fcnb.integral(x,definite=True)

# Mostrando os coeficientes calculados
print('a0='); show(a0)
print('an=');show(an)
print('bn=');show(bn)
bn1=bn.simplify_rational() # simplify_rational simplifica funções racionais; compare a terceira e a quarta expressões abaixo e verifique a simplificação ocorrida
print('bn simplificado=');show(bn1)
%html
<span style="color: rgb(51, 102, 255);">Exemplo 2</span>
$$ f(x) = \left\{ \begin{array}{ccl} L+x, &\quad & -L \le x \le 0 \\ L-x, & \quad & 0 \le x \le L \\ \end{array} \right. $$
<br>
# Exemplo 2
n=var('n')
assume(n,'integer')
L=var('L')
assume(L>0)
f1(x)=L+x
f2(x)=L-x
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
a0=(1/(2*L))*fc.integral(x,definite=True)

fa1(x)=f1(x)*cos((n*pi*x)/L)
fa2(x)=f2(x)*cos((n*pi*x)/L)
fcna = Piecewise([[(-L,0),fa1],[(0,L),fa2]])
an=(1/L)*fcna.integral(x,definite=True)

fb1(x)=f1(x)*sin((n*pi*x)/L)
fb2(x)=f2(x)*sin((n*pi*x)/L)
fcnb = Piecewise([[(-L,0),fb1],[(0,L),fb2]])
bn=(1/L)*fcnb.integral(x,definite=True)

show(a0)
show(an)
an1=an.simplify_rational()
show(an1)
show(bn)
%html
Naturalmente, após calcularmos os coeficientes de Fourier poderíamos fazer os gráficos das somas parciais a partir deles.<br>
Para isso, no entanto, teríamos que escrever um código implementando os somatórios que aparecem na expressão da Série de Fourier mas, como vimos anteriormente, o Sage possui comandos que permitem executar essa tarefa diretamente.<br>
Assim, fica a sugestâo:

<ul>
    <li>Para calcular os coeficientes de Fourier de uma função qualquer, use o código de qualquer dos três exemplos como modelo </li>
</ul>

<ul>
    <li>Para fazer o gráfico das somas parciais, use os comandos básicos do Sage, como no Exemplo a seguir </li>
</ul>
# Gráfico da função do Exemplo 2 e da Soma Parcial com N=30
L=var('L')
L=2 # atribui valor numérico a L
f1(x)=L+x
f2(x)=L-x
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
P1=fc.plot(color='red') # plota função em vermelho
#P2=fc.plot_fourier_series_partial_sum(5,L,-3*L,3*L,color='yellow')
P3=fc.plot_fourier_series_partial_sum(30,L,-3*L,3*L,color='green') #plota soma parcial em verde
(P1+P3).show()
%html
<span style="color: rgb(51, 102, 255);">Exemplo 3</span>
$$ f(x) = \left\{ \begin{array}{ccl} 1, &\quad & -L \lt x \lt 0 \\ 1+\frac{x}{L}, & \quad & 0 \le x \le L \\ \end{array} \right. $$
<br>
# Exemplo 3
n=var('n')
assume(n,'integer')
L=var('L')
assume(L>0)
f1(x)=1
f2(x)=1+x/L
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
a0=(1/(2*L))*fc.integral(x,definite=True)

fa1(x)=f1(x)*cos((n*pi*x)/L)
fa2(x)=f2(x)*cos((n*pi*x)/L)
fcna = Piecewise([[(-L,0),fa1],[(0,L),fa2]])
an=(1/L)*fcna.integral(x,definite=True)

fb1(x)=f1(x)*sin((n*pi*x)/L)
fb2(x)=f2(x)*sin((n*pi*x)/L)
fcnb = Piecewise([[(-L,0),fb1],[(0,L),fb2]])
bn=(1/L)*fcnb.integral(x,definite=True)


show(a0)
show(an)
an1=an.simplify_rational()
show(an1)
show(bn)
%html
A função do Exemplo 3 não é uma função contínua como a do Exemplo 2 e verificamos que, com N=30, a Série de Fourier representa razoavelmente bem a função exceto na vizinhança dos pontos de descontinuidade, <br>onde podemos observar o chamado Fenômeno de Gibbs (será estudado mais tarde).
# Gráfico da função do Exemplo 3 e da Soma Parcial com N=30
L=var('L')
L=1 # atribui valor numérico a L
f1(x)=1
f2(x)=1+x/L
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
P1=fc.plot(color='red') # plota função em vermelho
#P2=fc.plot_fourier_series_partial_sum(5,L,-3*L,3*L,color='yellow')
P3=fc.plot_fourier_series_partial_sum(30,L,-3*L,3*L,color='green') #plota soma parcial em verde
(P1+P3).show()
%html
Para completar, vejamos os gráficos correspondentes ao Exemplo 1.
# Gráfico da função do Exemplo 1 e da Soma Parcial com N=30
L=var('L')
L=pi # atribui valor numérico a L
f1(x)=0
f2(x)=1
fc = Piecewise([[(-L,0),f1],[(0,L),f2]])
P1=fc.plot(color='red') # plota função em vermelho
#P2=fc.plot_fourier_series_partial_sum(5,L,-3*L,3*L,color='yellow')
P3=fc.plot_fourier_series_partial_sum(30,L,-3*L,3*L,color='green') #plota soma parcial em verde
(P1+P3).show()