{"id":3649,"date":"2020-07-10T06:33:59","date_gmt":"2020-07-10T06:33:59","guid":{"rendered":"https:\/\/www.aiproblog.com\/index.php\/2020\/07\/10\/fourier-series-and-differential-equations-with-some-applications-in-r-and-python-part-2\/"},"modified":"2020-07-10T06:33:59","modified_gmt":"2020-07-10T06:33:59","slug":"fourier-series-and-differential-equations-with-some-applications-in-r-and-python-part-2","status":"publish","type":"post","link":"https:\/\/www.aiproblog.com\/index.php\/2020\/07\/10\/fourier-series-and-differential-equations-with-some-applications-in-r-and-python-part-2\/","title":{"rendered":"Fourier Series and Differential Equations with some applications in R and Python (Part 2)"},"content":{"rendered":"<p>Author: Sandipan Dey<\/p>\n<div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>This is the 2nd part of the article on a <strong>few applications of Fourier Series in solving differential equations<\/strong>. All the problems are taken from the&nbsp;<strong>edx Course: MITx &#8211; 18.03Fx: Differential Equations Fourier Series and Partial Differential Equations<\/strong>. The article will be posted in two parts (two separate blongs)<\/p>\n<p>We shall see how to solve the following ODEs \/ PDEs using Fourier series:<\/p>\n<ol>\n<li>Solve the&nbsp;<em>PDE<\/em>&nbsp;for&nbsp;<strong>Heat<\/strong> \/ Diffusion using <strong>Neumann<\/strong> \/ <strong>Dirichlet<\/strong> boundary conditions<\/li>\n<li>Solve&nbsp;<strong>Wave<\/strong>&nbsp;equation (PDE).<\/li>\n<li>Remove noise from an audio file with <strong>Fourier transform<\/strong>.<\/li>\n<\/ol>\n<h2 id=\"Heat-Equation\">Heat \/ Diffusion Equation<\/h2>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9447\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f15-1.png?w=692&amp;h=677\" alt=\"f15\" width=\"692\" height=\"677\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9448\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f17.png?w=772&amp;h=782\" alt=\"f17\" width=\"772\" height=\"782\"><\/p>\n<p>The following animation shows how the temperature changes on the bar with time (considering only the first 100 terms for the Fourier series for the square wave).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9441\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/heat3-1.gif?w=733&amp;h=733\" alt=\"heat3\" width=\"733\" height=\"733\"><\/p>\n<div>\n<p>Let&rsquo;s solve the below diffusion<span>&nbsp;<\/span><em>PDE<\/em><span>&nbsp;<\/span>with the given<span>&nbsp;<\/span><strong><em>Neumann<span>&nbsp;<\/span><\/em><\/strong><strong><em>BCs<\/em><\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9350\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f12-2.png?w=799&amp;h=360\" alt=\"f12\" width=\"799\" height=\"360\"><\/p>\n<p>As can be seen from above, the initial condition can be represented as a 2-periodic triangle wave function (using even periodic extension), i.e.,<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-9358\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f13-1.png?w=676\" alt=\"f13\"><\/p>\n<p>The next animation shows how the different points on the tube arrive at the steady-state solution over time.<\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9335\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/heat.gif?w=751&amp;h=751\" alt=\"heat\" width=\"751\" height=\"751\"><\/p>\n<p>The next figure shows the time taken for each point inside the tube, to approach within 1% the steady-state solution.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-9336\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/steady.png?w=676\" alt=\"steady\"><\/p>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-9420\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f14.png?w=676\" alt=\"f14\"><a href=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f14.png?w=92\"><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>with the following<\/p>\n<ul>\n<li>L=5, the length of the bar is 5 units.<\/li>\n<li><strong><em>Dirichlet BC<\/em>s<\/strong>:<span>&nbsp;<\/span><em>u(0, t) =0<\/em>,<span>&nbsp;<\/span><em>u(L,t) = sin(2&pi;t\/L)<\/em>, i.e., the left end of the bar is held at a constant temperature 0 degree (at ice bath) and the right end changes temperature in a sinusoidal manner.<\/li>\n<li><strong>IC<\/strong>:<span>&nbsp;<\/span><em>u(x,0) = 0<\/em>, i.e., the entire bar has temperature 0 degree.<\/li>\n<\/ul>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<p>The following R code implements the numerical method:<\/p>\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<div>\n<div id=\"highlighter_73335\" class=\"syntaxhighlighter r\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<div class=\"line number21 index20 alt2\">21<\/div>\n<div class=\"line number22 index21 alt1\">22<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r comments\">#Solve heat equation using forward time, centered space scheme<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r comments\">#Define simulation parameters<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">x =<\/code> <code class=\"r functions\">seq<\/code><code class=\"r plain\">(0,5,5\/19)<\/code> <code class=\"r comments\">#Spatial grid<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">dt = 0.06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code> <code class=\"r comments\">#Time step<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">tMax = 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code> <code class=\"r comments\">#Simulation time<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">nu = 0.5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code> <code class=\"r comments\">#Constant of proportionality<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">t =<\/code> <code class=\"r functions\">seq<\/code><code class=\"r plain\">(0, tMax, dt)<\/code> <code class=\"r comments\">#Time vector<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">n =<\/code> <code class=\"r functions\">length<\/code><code class=\"r plain\">(x)<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r plain\">m =<\/code> <code class=\"r functions\">length<\/code><code class=\"r plain\">(t)<\/code><\/div>\n<div class=\"line number13 index12 alt2\">&nbsp;<\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r plain\">fLeft =<\/code> <code class=\"r keyword\">function<\/code><code class=\"r plain\">(t) 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code> <code class=\"r comments\">#Left boundary condition<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r plain\">fRight =<\/code> <code class=\"r keyword\">function<\/code><code class=\"r plain\">(t)<\/code> <code class=\"r functions\">sin<\/code><code class=\"r plain\">(2*<\/code><code class=\"r constants\">pi<\/code><code class=\"r plain\">*t\/5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code> <code class=\"r comments\">#Right boundary condition<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"r plain\">fInitial =<\/code> <code class=\"r keyword\">function<\/code><code class=\"r plain\">(x)<\/code> <code class=\"r functions\">matrix<\/code><code class=\"r plain\">(<\/code><code class=\"r functions\">rep<\/code><code class=\"r plain\">(0,m*n), nrow=m)<\/code> <code class=\"r comments\">#Initial condition<\/code><\/div>\n<div class=\"line number17 index16 alt2\">&nbsp;<\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r comments\">#Run simulation<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"r plain\">dx = x[2]-x[1]<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"r plain\">r = nu*dt\/dx^2<\/code><\/div>\n<div class=\"line number21 index20 alt2\">&nbsp;<\/div>\n<div class=\"line number22 index21 alt1\"><code class=\"r comments\">#Create tri-diagonal matrix A with entries 1-2r and r<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The <strong>tri-diagonal matrix<\/strong> A is shown in the following figure<\/p>\n<\/div>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-9427\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/tridiag2.png?w=676\" alt=\"tridiag2\"><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<div>\n<div id=\"highlighter_152968\" class=\"syntaxhighlighter r\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r comments\">#Impose inital conditions<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">u =<\/code> <code class=\"r functions\">fInitial<\/code><code class=\"r plain\">(x)<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">u[1,1] =<\/code> <code class=\"r functions\">fLeft<\/code><code class=\"r plain\">(0)<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">u[1,n] =<\/code> <code class=\"r functions\">fRight<\/code><code class=\"r plain\">(0)<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r functions\">for<\/code> <code class=\"r plain\">(i<\/code> <code class=\"r keyword\">in<\/code> <code class=\"r plain\">1:(<\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(t)-1)) {<\/code><\/div>\n<div class=\"line number7 index6 alt2\">&nbsp;<\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,] = A%*%(u[i,])&nbsp;&nbsp;<\/code> <code class=\"r comments\"># Find solution at next time step<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,1] =<\/code> <code class=\"r functions\">fLeft<\/code><code class=\"r plain\">(t[i])&nbsp;<\/code> <code class=\"r comments\"># Impose left B.C.<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,n] =<\/code> <code class=\"r functions\">fRight<\/code><code class=\"r plain\">(t[i])<\/code> <code class=\"r comments\"># Impose right B.C.<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The following animation shows the solution obtained to the heat equation using the numerical method (in R) described above,<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9419\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/heat2.gif?w=626&amp;h=626\" alt=\"heat2\" width=\"626\" height=\"626\"><\/p>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<div class=\"text_cell_render border-box-sizing rendered_html\">\n<p>&nbsp;<\/p>\n<h2>Wave Equation<\/h2>\n<p>&nbsp;<\/p>\n<\/div>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-9456\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f18.png?w=676\" alt=\"f18\"><img decoding=\"async\" class=\"alignnone size-full wp-image-9457\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f19.png?w=676\" alt=\"f19\"><\/p>\n<p>The next figure shows how can a numerical method be used to solve the wave PDE<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-9460\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f20.png?w=676&amp;h=948\" alt=\"f20\" width=\"676\" height=\"948\"><\/p>\n<h2>Implementation in R<\/h2>\n<div>\n<div id=\"highlighter_534495\" class=\"syntaxhighlighter r\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r comments\">#Define simulation parameters<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"r plain\">x =<\/code> <code class=\"r functions\">seq<\/code><code class=\"r plain\">(0,1,1\/99)<\/code> <code class=\"r comments\">#Spatial grid<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r plain\">dt = 0.5<\/code> <code class=\"r comments\">#Time step<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">tMax = 200<\/code> <code class=\"r comments\">#Simulation time<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">c = 0.015<\/code> <code class=\"r comments\">#Wave speed<\/code><\/div>\n<div class=\"line number6 index5 alt1\">&nbsp;<\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">fLeft =<\/code> <code class=\"r keyword\">function<\/code><code class=\"r plain\">(t) 0<\/code> <code class=\"r comments\">#Left boundary condition<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"r plain\">fRight =&nbsp;<\/code><code class=\"r keyword\">function<\/code><code class=\"r plain\">(t) 0.1*<\/code><code class=\"r functions\">sin<\/code><code class=\"r plain\">(t\/10)<\/code> <code class=\"r comments\">#Right boundary condition<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r plain\">fPosInitial =<\/code> <code class=\"r keyword\">function<\/code><code class=\"r plain\">(x)<\/code> <code class=\"r functions\">exp<\/code><code class=\"r plain\">(-200*(x-0.5)^2)<\/code> <code class=\"r comments\">#Initial position<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"r plain\">fVelInitial =<\/code>&nbsp;<code class=\"r keyword\">function<\/code><code class=\"r plain\">(x) 0*x<\/code> <code class=\"r comments\">#Initial velocity<\/code><\/div>\n<div class=\"line number11 index10 alt2\">&nbsp;<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r comments\">#Run simulation<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r plain\">dx = x[2]-x[1]<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r plain\">r = c*dt\/dx<\/code><\/div>\n<div class=\"line number15 index14 alt2\">&nbsp;<\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"r plain\">n =<\/code> <code class=\"r functions\">length<\/code><code class=\"r plain\">(x)<\/code><\/div>\n<div class=\"line number17 index16 alt2\"><code class=\"r plain\">t =<\/code> <code class=\"r functions\">seq<\/code><code class=\"r plain\">(0,tMax,dt)&nbsp;<\/code> <code class=\"r comments\">#Time vector<\/code><\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r plain\">m =<\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(t) + 1<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Now iteratively compute<span>&nbsp;<\/span><em>u(x,t)<\/em><span>&nbsp;<\/span>by imposing the following<span>&nbsp;<\/span><strong>boundary conditions<\/strong><\/p>\n<p>1.<span>&nbsp;<\/span><em>u(0,t) = 0<\/em><br \/> 2.<span>&nbsp;<\/span><em>u(L,t) = (1\/10).sin(t\/10)<\/em><\/p>\n<p>along with the following<span>&nbsp;<\/span><strong>initial conditions<\/strong><\/p>\n<p>1.<span>&nbsp;<\/span><em>u(x,0) = exp(-500.(x-1\/2)<sup>2<\/sup>)<\/em><br \/> 2.<span>&nbsp;<\/span><em>&part;u(x,0)\/&part;t = 0.x<\/em><\/p>\n<p>as defined in the above code snippet.<\/p>\n<\/p>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\">\n<div>\n<div id=\"highlighter_315279\" class=\"syntaxhighlighter r\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<div class=\"line number16 index15 alt1\">16<\/div>\n<div class=\"line number17 index16 alt2\">17<\/div>\n<div class=\"line number18 index17 alt1\">18<\/div>\n<div class=\"line number19 index18 alt2\">19<\/div>\n<div class=\"line number20 index19 alt1\">20<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"r comments\">#Create tri-diagonal matrix A here, as described in the algorithm<\/code><\/div>\n<div class=\"line number2 index1 alt1\">&nbsp;<\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"r comments\">#Impose initial condition<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"r plain\">u =&nbsp;<\/code><code class=\"r functions\">matrix<\/code><code class=\"r plain\">(<\/code><code class=\"r functions\">rep<\/code><code class=\"r plain\">(0, n*m), nrow=m)<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"r plain\">u[1,] =<\/code> <code class=\"r functions\">fPosInitial<\/code><code class=\"r plain\">(x)<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"r plain\">u[1,1] =<\/code> <code class=\"r functions\">fLeft<\/code><code class=\"r plain\">(0)<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"r plain\">u[1,n] =<\/code> <code class=\"r functions\">fRight<\/code><code class=\"r plain\">(0)<\/code><\/div>\n<div class=\"line number8 index7 alt1\">&nbsp;<\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"r functions\">for<\/code> <code class=\"r plain\">(i<\/code> <code class=\"r keyword\">in<\/code> <code class=\"r plain\">1:<\/code><code class=\"r functions\">length<\/code><code class=\"r plain\">(t)) {<\/code><\/div>\n<div class=\"line number10 index9 alt1\">&nbsp;<\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r comments\">#Find solution at next time step<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r functions\">if<\/code> <code class=\"r plain\">(i == 1) {<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"r spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"r plain\">u[2,] = 1\/2*(A%*%u[1,]) + dt*<\/code><code class=\"r functions\">fVelInitial<\/code><code class=\"r plain\">(x)<\/code><\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r plain\">}<\/code> <code class=\"r keyword\">else<\/code> <code class=\"r plain\">{<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"r spaces\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,] = (A%*%u[i,])-u[i-1,]<\/code><\/div>\n<div class=\"line number16 index15 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r plain\">}<\/code><\/div>\n<div class=\"line number17 index16 alt2\">&nbsp;<\/div>\n<div class=\"line number18 index17 alt1\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,1] =<\/code> <code class=\"r functions\">fLeft<\/code><code class=\"r plain\">(t[i])<\/code> <code class=\"r comments\">#Impose left B.C.<\/code><\/div>\n<div class=\"line number19 index18 alt2\"><code class=\"r spaces\">&nbsp;&nbsp;<\/code><code class=\"r plain\">u[i+1,n] =<\/code> <code class=\"r functions\">fRight<\/code><code class=\"r plain\">(t[i])<\/code> <code class=\"r comments\">#Impose right B.C.<\/code><\/div>\n<div class=\"line number20 index19 alt1\"><code class=\"r plain\">}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>The following animation shows the output of the above implementation of the solution of wave PDE using R, it shows how the waves propagate, given a set of BCs and ICs.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-9461\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/wave.gif?w=914&amp;h=914\" alt=\"wave\" width=\"914\" height=\"914\"><\/p>\n<\/div>\n<p>&nbsp;<\/p>\n<h2><strong>Some audio processing: De-noising an audio file with Fourier Transform<\/strong><\/h2>\n<div class=\"inner_cell\">\n<p>Let&rsquo;s denoise an input noisy audio file (part of the theme music from Satyajit Ray&rsquo;s famous movie &#2474;&#2469;&#2503;&#2480; &#2474;&#2494;&#2433;&#2458;&#2494;&#2482;&#2496;, Songs of the road) using python<span>&nbsp;<\/span><em>scipy.fftpack<\/em><span>&nbsp;<\/span>module&rsquo;s<span>&nbsp;<\/span><em>fft()<\/em><span>&nbsp;<\/span>implementation.<\/p>\n<p>The noisy input file was generated and uploaded<span>&nbsp;<\/span><a href=\"https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_noisy.wav\">here<\/a>.<\/p>\n<\/p>\n<div>\n<div id=\"highlighter_121387\" class=\"syntaxhighlighter python\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<div class=\"line number14 index13 alt1\">14<\/div>\n<div class=\"line number15 index14 alt2\">15<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"python keyword\">from<\/code> <code class=\"python plain\">scipy.io<\/code> <code class=\"python keyword\">import<\/code> <code class=\"python plain\">wavfile<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">scipy.fftpack as fp<\/code><\/div>\n<div class=\"line number3 index2 alt2\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">numpy as np<\/code><\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"python keyword\">import<\/code> <code class=\"python plain\">matplotlib.pylab as plt<\/code><\/div>\n<div class=\"line number5 index4 alt2\">&nbsp;<\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"python comments\"># first fft to see the pattern then we can edit to see signal and inverse<\/code><\/div>\n<div class=\"line number7 index6 alt2\"><code class=\"python comments\"># back to a better sound<\/code><\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"python plain\">Fs, y<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">wavfile.read(<\/code><code class=\"python string\">'pather_panchali_noisy.wav'<\/code><code class=\"python plain\">)<\/code> <code class=\"python comments\"># can be found here: \"<a href=\"https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_noisy.wav\">https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_noisy.wav<\/a>\" data-mce-href=\"<a href=\"https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_noisy.wav\">https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_noisy.wav<\/a>\".<\/code><\/div>\n<div class=\"line number9 index8 alt2\">&nbsp;<\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"python comments\"># you may want to scale y, in this case, y was already scaled in between [-1,1]<\/code><\/div>\n<div class=\"line number11 index10 alt2\"><code class=\"python plain\">Y<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">fp.fftshift(fp.fft(y))&nbsp;<\/code> <code class=\"python comments\">#Take the Fourier series and take a symmetric shift<\/code><\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"python plain\">fshift<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">np.arange(<\/code><code class=\"python keyword\">-<\/code><code class=\"python plain\">n<\/code><code class=\"python keyword\">\/<\/code><code class=\"python keyword\">\/<\/code><code class=\"python value\">2<\/code><code class=\"python plain\">, n<\/code><code class=\"python keyword\">\/<\/code><code class=\"python keyword\">\/<\/code><code class=\"python value\">2<\/code><code class=\"python plain\">)<\/code><code class=\"python keyword\">*<\/code><code class=\"python plain\">(Fs<\/code><code class=\"python keyword\">\/<\/code><code class=\"python plain\">n)<\/code><\/div>\n<div class=\"line number13 index12 alt2\">&nbsp;<\/div>\n<div class=\"line number14 index13 alt1\"><code class=\"python plain\">plt.plot(fshift, Y.real)<\/code> <code class=\"python comments\">#plot(t, y); #plot the sound signal<\/code><\/div>\n<div class=\"line number15 index14 alt2\"><code class=\"python plain\">plt.show()<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>You will obtain a figure like the following:<br \/><img decoding=\"async\" class=\"alignnone size-full wp-image-9479\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f22-1.png?w=676\" alt=\"f22\"><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div>\n<div id=\"highlighter_898576\" class=\"syntaxhighlighter python\">\n<table border=\"0\" cellspacing=\"0\">\n<tbody>\n<tr>\n<td class=\"gutter\">\n<div class=\"line number1 index0 alt2\">1<\/div>\n<div class=\"line number2 index1 alt1\">2<\/div>\n<div class=\"line number3 index2 alt2\">3<\/div>\n<div class=\"line number4 index3 alt1\">4<\/div>\n<div class=\"line number5 index4 alt2\">5<\/div>\n<div class=\"line number6 index5 alt1\">6<\/div>\n<div class=\"line number7 index6 alt2\">7<\/div>\n<div class=\"line number8 index7 alt1\">8<\/div>\n<div class=\"line number9 index8 alt2\">9<\/div>\n<div class=\"line number10 index9 alt1\">10<\/div>\n<div class=\"line number11 index10 alt2\">11<\/div>\n<div class=\"line number12 index11 alt1\">12<\/div>\n<div class=\"line number13 index12 alt2\">13<\/div>\n<\/td>\n<td class=\"code\">\n<div class=\"container\">\n<div class=\"line number1 index0 alt2\"><code class=\"python plain\">L<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python functions\">len<\/code><code class=\"python plain\">(fshift)<\/code> <code class=\"python comments\">#Find the length of frequency values<\/code><\/div>\n<div class=\"line number2 index1 alt1\"><code class=\"python plain\">Yfilt<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">Y<\/code><\/div>\n<div class=\"line number3 index2 alt2\">&nbsp;<\/div>\n<div class=\"line number4 index3 alt1\"><code class=\"python comments\"># find the frequencies corresponding to the noise here<\/code><\/div>\n<div class=\"line number5 index4 alt2\"><code class=\"python functions\">print<\/code><code class=\"python plain\">(np.argsort(Y.real)[::<\/code><code class=\"python keyword\">-<\/code><code class=\"python value\">1<\/code><code class=\"python plain\">][:<\/code><code class=\"python value\">2<\/code><code class=\"python plain\">])<\/code><\/div>\n<div class=\"line number6 index5 alt1\"><code class=\"python comments\"># 495296 639296<\/code><\/div>\n<div class=\"line number7 index6 alt2\">&nbsp;<\/div>\n<div class=\"line number8 index7 alt1\"><code class=\"python plain\">Yfilt[<\/code><code class=\"python value\">495296<\/code><code class=\"python plain\">]<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">Yfilt[<\/code><code class=\"python value\">639296<\/code><code class=\"python plain\">]<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python value\">0<\/code>&nbsp; <code class=\"python comments\"># find the frequencies corresponding to the spikes<\/code><\/div>\n<div class=\"line number9 index8 alt2\"><code class=\"python plain\">plt.plot(fshift, Yfilt.real)<\/code><\/div>\n<div class=\"line number10 index9 alt1\"><code class=\"python plain\">plt.show()<\/code><\/div>\n<div class=\"line number11 index10 alt2\">&nbsp;<\/div>\n<div class=\"line number12 index11 alt1\"><code class=\"python plain\">soundFiltered<\/code> <code class=\"python keyword\">=<\/code> <code class=\"python plain\">fp.ifft(fp.ifftshift(Yfilt)).real<\/code><\/div>\n<div class=\"line number13 index12 alt2\"><code class=\"python plain\">wavfile.write(<\/code><code class=\"python string\">'pather_panchali_denoised.wav'<\/code><code class=\"python plain\">, Fs, soundNoisy)<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"cell border-box-sizing text_cell rendered\">\n<div class=\"inner_cell\"><img decoding=\"async\" class=\"alignnone size-full wp-image-9480\" src=\"https:\/\/sandipanweb.files.wordpress.com\/2020\/06\/f23.png?w=676\" alt=\"f23\"><\/div>\n<\/div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-r\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div>\n<div class=\"cell border-box-sizing code_cell rendered\">\n<div class=\"input\">\n<div class=\"inner_cell\">\n<div class=\"input_area\">\n<div class=\" highlight hl-r\">The denoised output wave file produced with the filtering can be found<span>&nbsp;<\/span><a href=\"https:\/\/github.com\/sandipan\/edx\/blob\/courses\/pather_panchali_denoised.wav\">here<\/a>.&nbsp;(use vlc media player to listen to input and output wave files)<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><a href=\"https:\/\/www.datasciencecentral.com\/xn\/detail\/6448529:BlogPost:961100\">Go to Source<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Author: Sandipan Dey This is the 2nd part of the article on a few applications of Fourier Series in solving differential equations. All the problems [&hellip;] <span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/www.aiproblog.com\/index.php\/2020\/07\/10\/fourier-series-and-differential-equations-with-some-applications-in-r-and-python-part-2\/\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":457,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"footnotes":""},"categories":[26],"tags":[],"_links":{"self":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3649"}],"collection":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/comments?post=3649"}],"version-history":[{"count":0,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/posts\/3649\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/media\/469"}],"wp:attachment":[{"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/media?parent=3649"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/categories?post=3649"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aiproblog.com\/index.php\/wp-json\/wp\/v2\/tags?post=3649"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}