%% Fourier Series %% % The *Fourier series* of a $2L$ periodic function $f(x)$ is given by % % $$\frac {a_0} 2 +\sum _{k=1}^\infty \left( a_k \cos \frac{k\pi x}L % + b_k \sin \frac{k \pi x}L\right)$$ % % where the *Fourier coefficients* $a_k,\ k=0,1,2,\dots,$ and $b_k,\ k=1,2,3, % \dots,$ are given by % % $$a_k = \frac 1 L \int _{\mbox{--} L}^L f(x) \cos \frac {k\pi x}L\,dx$$ % % and % % $$b_k = \frac 1 L \int _{\mbox{--} L}^L f(x) \sin \frac {k\pi x}L\,dx\,.$$ % % The nth partial sum of the Fourier series is % % $$s_n(x) = \frac {a_0} 2 +\sum _{k=1}^n \left( a_k \cos \frac{k\pi x}L % + b_k \sin \frac{k\pi x}L\right).$$ %% % You can use the following commands to calculate the nth partial sum of % the Fourier series of the expression f on the interval [-L,L] syms x k L n %% % The next command tells MATLAB that k is an integer. That will allow % *simple* and *simplify* to evaluate $\sin(k\pi)$ and $\cos(k\pi)$ for a % symbolic integer k. evalin(symengine,'assume(k,Type::Integer)'); %% % The kth Fourier cosine coefficient $a_k$ of f is given by the command: a = @(f,x,k,L) int(f*cos(k*pi*x/L)/L,x,-L,L); %% % The kth Fourier sine coefficient $b_k$ is given by the command: b = @(f,x,k,L) int(f*sin(k*pi*x/L)/L,x,-L,L); %% % The nth partial sum is given by fs = @(f,x,n,L) a(f,x,0,L)/2 + ... symsum(a(f,x,k,L)*cos(k*pi*x/L) + b(f,x,k,L)*sin(k*pi*x/L),k,1,n); %% % For example, I can calculate the Fourier series of f(x) = ||x|| on the % interval [-1,1]. f = abs(x) %% % The 10th partial sum is pretty(fs(f,x,10,1)) %% % We can also have MATLAB calculuate the general Fourier coefficients. To do % this and get MATLAB to simplify the results, we can use *simple*. The % following command gives the % kth Fourier cosine coefficient, suppressing the results of all of the % steps of *simple* except for the simplest. [A,how]=simple(a(f,x,k,1)) %% % If I don't want to see how *simple* found the answer, I can suppress the % output, then just display the simplified answer. The following command % does that for the % kth Fourier sine coefficient. [B,how]=simple(b(f,x,k,1)); B %% % Here are the plots of the partial sums for n=2,5,10. The plot also shows % the function f. ezplot(fs(f,x,2,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=2') %% ezplot(fs(f,x,5,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=5') %% ezplot(fs(f,x,10,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=10') %% % Now I do it with the function f(x) = x on [-1,1]. f = x %% % The Fourier cosine coefficients are [A,how]=simple(a(f,x,k,1)); A %% % The Fourier sine coefficients are [B,how]=simple(b(f,x,k,1)); B %% % The 10th partial sum is pretty(fs(f,x,10,1)) %% % Here are plots of the partial sums for n=2,5,10,20,50. ezplot(fs(f,x,2,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=2') %% ezplot(fs(f,x,5,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=5') %% ezplot(fs(f,x,10,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=10') %% ezplot(fs(f,x,20,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=20') %% ezplot(fs(f,x,50,1),-1,1) hold on ezplot(f,-1,1) hold off title('Partial sum with n=50') %% % If you zoom in here, you notice that the graph of the partial sum of the % Fourier series looks very jagged. That is because *ezplot* does not plot % enough points compared to the number of oscillations in the functions in % the partial sum. We can fix this problem using plot. This also allows % us to use a different colors for the plot of the original function and % the plot of the partial sum. To use plot, we need to turn the partial % sum into an inline vectorized function and specify the points where it % will be evaluated. g = inline(vectorize(fs(f,x,50,1))); X = -1:.001:1; plot(X,g(X),'r') hold on ezplot(f,-1,1) hold off title('Partial sum with n=50') %% % The following code works fine in MATLAB R2010a, but not in % MATLAB R2009b. g = inline(vectorize(fs(f,x,100,1))); X = -1:.0001:1; plot(X,g(X),'r') hold on ezplot(f,-1,1) hold off title('Partial sum with n=100') %% % Notice that no matter how many terms we take, the partial sum always % overshoots the function x at the end points of the interval. If we do % our two plots on the interval [-2,2], we see that outside [-1,1], the % partial sum doesn't have much to do with the function. ezplot(fs(f,x,20,1),-2,2) hold on ezplot(f,-2,2) hold off %% % A Fourier series on [-L,L] is 2L periodic, and so are all its partial % sums. So, what we are really doing when we compute the Fourier series of % a function f on the interval [-L,L] is computing the Fourier series of % the 2L periodic extension of f. To do that in MATLAB, we have to make % use of the unit step function u(x), which is 0 if $x < 0$ and 1 if $x \ge 0$. % It is known as the Heaviside function, and the MATLAB command for it is % *heaviside*. The function h(x) = u(x-a)*u(b-x) is 1 on the interval % [a,b] and 0 outside the interval. f = heaviside(x+3)*heaviside(-1-x)*(x+2) + heaviside(x+1)*heaviside(1-x)*x ... + heaviside(x-1)*heaviside(3-x)*(x-2); %% % extends f(x) = x to be periodic on [-3,3], with period 2. To check that % we've extended it correctly, we plot it. ezplot(f,-3,3) title('Periodic extension of x') %% % Here is a plot of the function and its Fourier series. ezplot(fs(x,x,20,1),-3,3) hold on ezplot(f,-3,3) hold off title('Periodic extension of x and partial sum with n=20') %% % It is somewhat clearer if the plots aren't in the same color, so I'll use % *plot* for the partial sum. X = -3:0.001:3; g = inline(vectorize(fs(f,x,20,1))); ezplot(f,-3,3) hold on plot(X,g(X),'r') hold off title('Periodic extension of x and partial sum with n=20') %% % The overshoots are at the discontinuities of the 2 periodic extension of % f. This is called the *Gibbs Phenomenon.*