Fourier Series using fourie.mac
- Subject: Fourier Series using fourie.mac
- From: Richard Hennessy
- Date: Tue, 28 Jul 2009 14:09:54 -0400
My package pw.mac can do the integration necessary to solve the Fourier
series directly without using "fourie.mac" as long as you remember how to do
it.
Here is a solution using pw.mac. All the needed functions are documented on
my web site.
This result is based on the fact that for x in the interval (-%pi/2, %pi/2)
abs(sin(x)) = pw([-%pi/2,-sin(x),0,sin(x),%pi/2],x) = signum(x) * sin(x)
(%i1) (load(pw), ratprint:false);
(%o1) false
(%i2) now:elapsed_run_time();
(%o2) 2.95
(%i3) declare(n,integer);
(%o3) done
(%i4) assume(n>0);
(%o4) [n>0]
(%i5) f:[-%pi/2, -sin(x), 0, sin(x), %pi/2];
(%o5) [-%pi/2,-sin(x),0,sin(x),%pi/2]
(%i6) a0 : pwdefint(pw(f,x), x, -%pi/2, %pi/2)/%pi;
(%o6) 2/%pi
(%i7) an : (s:1/(%pi/2)*pwdefint(pw(f,x)*cos(n*%pi*x/(%pi/2)), x, -%pi/2,
%pi/2),radcan(s));
(%o7)
-((4*n-2)*cos((2*%pi*n+%pi)/2)+(-4*n-2)*cos((2*%pi*n-%pi)/2)+4)/(4*%pi*n^2-%pi)
(%i8) bn : (s:(1/(%pi/2))*pwdefint(pw(f,x)*sin(n*%pi*x/(%pi/2)), x, -%pi/2,
%pi/2), radcan(s));
(%o8) 0
(%i9) (define(a(n), an),define(b(n), bn))$
(%i10) g(x, terms)
:=a0+sum(b(m)*sin(m*%pi*x/(%pi/2))+a(m)*cos(m*%pi*x/(%pi/2)), m, 1, terms)$
(%i11) define(h(x), periodic(pw(f,x),x,-%pi/2,%pi/2))$
(%i12) n:5;
(%o12) 5
(%i13) load(draw)$
(%i14) draw2d(
color=brown,
yrange=[-0,1],
label_alignment=left,
explicit(h(x),x,-%pi,%pi),
color=blue,
label(["f(x)=abs(sin(x))",-2,.3]),
label([concat("with fourier series for n = ",n), -2,.25]),
explicit(g(x,5),x,-%pi,%pi))$
(%i15) elapsed_run_time()-now;
(%o15) 2.44
To prove the identity
(%i1) display2d:false;
(o1) false
(%i2) abs(sin(x));
(o2) abs(sin(x))
(%i3) abs2signum(%);
(o3) sin(x)*signum(sin(x))
(%i4) periodic(sin(x),x,-%pi/2,%pi/2);
(o4) -cos(%pi*((x+%pi/2)/%pi-floor((x+%pi/2)/%pi)))
(%i5) integrate(%,x);
(o5) -'integrate(cos(%pi*((x+%pi/2)/%pi-floor((x+%pi/2)/%pi))),x)
(%i6) changevar(%,y-(x+%pi/2)/%pi,y,x);
(%o6) sin(%pi*floor(y)-%pi*y)
(%i7) subst((x+%pi/2)/%pi,y,%);
(o7) sin(%pi*floor((x+%pi/2)/%pi)-x-%pi/2)
(%i8) abs(sin(x))=pw([-%pi/2,-sin(x),0,sin(x),%pi/2],x);
(o8) abs(sin(x)) =
sin(x)*(signum(x)-signum(x-%pi/2))/2-sin(x)*(signum(x+%pi/2)-signum(x))/2
(%i9) simp_assuming(%,x<%pi/2,x>-%pi/2);
(o9) abs(sin(x)) = (signum(x)+1)*sin(x)/2-(1-signum(x))*sin(x)/2
(%i10) radcan(%);
(o10) abs(sin(x)) = signum(x)*sin(x)
(%i11)
You can get pw.mac from my site.
http://mysite.verizon.net/res11w2yb/id2.html
Hope this helps.
Richard Hennessy
2009/7/28 Leo Butler <l.butler at ed.ac.uk>
>
>
> On Tue, 28 Jul 2009, Rafa Topolnicki wrote:
>
> < Leo Butler pisze:
> < >
> < > On Mon, 27 Jul 2009, Rafa? Topolnicki wrote:
> < >
> < > < Hi,
> < > <
> < > < During testing Fourier Series Expansion in maxima I found a problem I
> < > < can't cope with.
> < > <
> < > < (%i3) load(fourie)
> < > < (%o3) /usr/share/maxima/5.18.1/share/calculus/fourie.mac
> < > < (%i4) f(x) := abs(sin(x))
> < > < (%o4) f(x) := abs(sin(x))
> < > < (%i5) flist : fourier(f(x), x, %pi)
> < > < 2
> < > < (%t5) a = ---
> < > < 0 %pi
> < > <
> < > < cos(%pi n) cos(%pi n) 1 1
> < > < 2 (---------- - ---------- + ------- - -------)
> < > < 2 n + 2 2 n - 2 2 n + 2 2 n - 2
> < > < (%t6) a = -----------------------------------------------
> < > < n %pi
> < > <
> < >
> < > The easiest thing to do would be to add a line
> < >
> < > %t6 : a[n] = if n=1 then 'limit( subst(n=_n,rhs(%t6)),_n,n ) else
> < > %rhs(%t6);
>
> You need to overcome the evaluation rules in sum. Here is one way to do
> this using a lambda-function:
>
> (%i2) load("fourie");
> (%o2) "/home/work/maxima/maxima-5.18.1-clisp/share/calculus/fourie.mac"
> (%i3) f(x):=abs(sin(x));
> (%o3) f(x):=abs(sin(x))
> (%i4) flist : fourier(f(x),x,%pi);
> (%t4) a[0] = 2/%pi
>
> (%t5) a[n] =
> 2*(cos(%pi*n)/(2*n+2)-cos(%pi*n)/(2*n-2)+1/(2*n+2)-1/(2*n-2))/%pi
>
> (%t6) b[n] = 0
>
> (%o6) [%t4,%t5,%t6]
> (%i7) %t5 : a[n] = 'apply(lambda([s], if s=1 then 0 else
> rhs(''%t5)),[n]);
> (%o7) a[n] = 'apply(lambda([s],
> if s = 1 then 0
> else rhs(
> a[n] = 2*(cos(%pi*n)/(2*n+2)
> -cos(%pi*n)/(2*n-2)+1/(2*n+2)
> -1/(2*n-2))
> /%pi)),[n])
> (%i8) fourexpand(flist,y,%pi,3)$
> (%i9) ev(%,nouns);
> (%o9) 2/%pi-4*cos(2*y)/(3*%pi)
>
>
> Leo
>
> --
> The University of Edinburgh is a charitable body, registered in
> Scotland, with registration number SC005336.
>
> _______________________________________________
> Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima
>