title: Calculate the Fourier series with the trigonometry approach
body: <p>I try to implement the Fourier series function according to the following formulas:</p>
  
  <p><img src="https://i.stack.imgur.com/Ba0Je.png" alt="enter image description here"></p>
  
  <p>...where... </p>
  
  <p><img src="https://i.stack.imgur.com/6x7vX.png" alt="enter image description here"></p>
  
  <p>...and...</p>
  
  <p><img src="https://i.stack.imgur.com/VuU9R.png" alt="enter image description here"></p>
  
  <p><img src="https://i.stack.imgur.com/pBwaW.png" alt="enter image description here"></p>
  
  <p>Here is my approach to the problem:</p>
  
  <pre><code>import numpy as np
  import pylab as py
  
  # Define "x" range.
  x = np.linspace(0, 10, 1000)
  
  # Define "T", i.e functions' period.
  T = 2
  L = T / 2
  
  # "f(x)" function definition.
  def f(x): 
      return np.sin(np.pi * 1000 * x)
  
  # "a" coefficient calculation.
  def a(n, L, accuracy = 1000):
      a, b = -L, L
      dx = (b - a) / accuracy
      integration = 0
      for i in np.linspace(a, b, accuracy):
          x = a + i * dx
          integration += f(x) * np.cos((n * np.pi * x) / L)
      integration *= dx
      return (1 / L) * integration
  
  # "b" coefficient calculation.
  def b(n, L, accuracy = 1000):
      a, b = -L, L
      dx = (b - a) / accuracy
      integration = 0
      for i in np.linspace(a, b, accuracy):
          x = a + i * dx
          integration += f(x) * np.sin((n * np.pi * x) / L)
      integration *= dx
      return (1 / L) * integration
  
  # Fourier series.   
  def Sf(x, L, n = 10):
      a0 = a(0, L)
      sum = 0
      for i in np.arange(1, n + 1):
          sum += ((a(i, L) * np.cos(n * np.pi * x)) + (b(i, L) * np.sin(n * np.pi * x)))
      return (a0 / 2) + sum    
  
  # x axis.
  py.plot(x, np.zeros(np.size(x)), color = 'black')
  
  # y axis.
  py.plot(np.zeros(np.size(x)), x, color = 'black')
  
  # Original signal.
  py.plot(x, f(x), linewidth = 1.5, label = 'Signal')
  
  # Approximation signal (Fourier series coefficients).
  py.plot(x, Sf(x, L), color = 'red', linewidth = 1.5, label = 'Fourier series')
  
  # Specify x and y axes limits.
  py.xlim([0, 10])
  py.ylim([-2, 2])
  
  py.legend(loc = 'upper right', fontsize = '10')
  
  py.show()
  </code></pre>
  
  <p>...and here is what I get after plotting the result:</p>
  
  <p><img src="https://i.stack.imgur.com/oVNxR.png" alt="enter image description here"></p>
  
  <p>I've read the <a href="https://stackoverflow.com/questions/4258106/how-to-calculate-a-fourier-series-in-numpy">How to calculate a Fourier series in Numpy?</a> and I've implemented this approach already. It works great, but it use the expotential method, where I want to focus on trigonometry functions and the rectangular method in case of calculating the integraions for <code>a_{n}</code> and <code>b_{n}</code> coefficients.</p>
  
  <p>Thank you in advance.</p>
  
  <p><strong>UPDATE (SOLVED)</strong></p>
  
  <p>Finally, here is a working example of the code. However, I'll spend more time on it, so if there is anything that can be improved, it will be done.</p>
  
  <pre><code>from __future__ import division
  import numpy as np
  import pylab as py
  
  # Define "x" range.
  x = np.linspace(0, 10, 1000)
  
  # Define "T", i.e functions' period.
  T = 2
  L = T / 2
  
  # "f(x)" function definition.
  def f(x): 
      return np.sin((np.pi) * x) + np.sin((2 * np.pi) * x) + np.sin((5 * np.pi) * x)
  
  # "a" coefficient calculation.
  def a(n, L, accuracy = 1000):
      a, b = -L, L
      dx = (b - a) / accuracy
      integration = 0
      for x in np.linspace(a, b, accuracy):
          integration += f(x) * np.cos((n * np.pi * x) / L)
      integration *= dx
      return (1 / L) * integration
  
  # "b" coefficient calculation.
  def b(n, L, accuracy = 1000):
      a, b = -L, L
      dx = (b - a) / accuracy
      integration = 0
      for x in np.linspace(a, b, accuracy):
          integration += f(x) * np.sin((n * np.pi * x) / L)
      integration *= dx
      return (1 / L) * integration
  
  # Fourier series.   
  def Sf(x, L, n = 10):
      a0 = a(0, L)
      sum = np.zeros(np.size(x))
      for i in np.arange(1, n + 1):
          sum += ((a(i, L) * np.cos((i * np.pi * x) / L)) + (b(i, L) * np.sin((i * np.pi * x) / L)))
      return (a0 / 2) + sum   
  
  # x axis.
  py.plot(x, np.zeros(np.size(x)), color = 'black')
  
  # y axis.
  py.plot(np.zeros(np.size(x)), x, color = 'black')
  
  # Original signal.
  py.plot(x, f(x), linewidth = 1.5, label = 'Signal')
  
  # Approximation signal (Fourier series coefficients).
  py.plot(x, Sf(x, L), '.', color = 'red', linewidth = 1.5, label = 'Fourier series')
  
  # Specify x and y axes limits.
  py.xlim([0, 5])
  py.ylim([-2.2, 2.2])
  
  py.legend(loc = 'upper right', fontsize = '10')
  
  py.show()
  </code></pre>
  
  <p><img src="https://i.stack.imgur.com/lWCWf.png" alt="enter image description here"></p>