examples.mws

FourierTrigSeries package

Karel Srot, xsrot@math.muni.cz, www.math.muni.cz/~kriz/xsrot/fourierseries

Faculty of Science, Masaryk University, Czech Republic

This package concept differs from other Fourier series packages. It provides new data structure for the representation of trigonometric series and few procedures to manipulate trigonometric series and to compute Fourier series. Some procedures and data structure are (for better understanding) similar (but not exactly the same) to OrthogonalSeries package so in many cases you can use the OrthogonalSeries package help files.

>   

>    restart:

>    with(FourierTrigSeries);

[Add, ChangeBasis, Coefficients, ConvertToSum, Copy, Create, Degree, Derivate, DrawPartialSum, DrawPeriodicExtension, Evaluate, ExploreFourierSeriesCoefficients, FOURIERSERIES, GetFourierSeries, GetPar...
[Add, ChangeBasis, Coefficients, ConvertToSum, Copy, Create, Degree, Derivate, DrawPartialSum, DrawPeriodicExtension, Evaluate, ExploreFourierSeriesCoefficients, FOURIERSERIES, GetFourierSeries, GetPar...
[Add, ChangeBasis, Coefficients, ConvertToSum, Copy, Create, Degree, Derivate, DrawPartialSum, DrawPeriodicExtension, Evaluate, ExploreFourierSeriesCoefficients, FOURIERSERIES, GetFourierSeries, GetPar...

>   

Create()

Usage of the procedure Create is similar to OrthogonalSeries[Create] but there are few differences.

>    s:=Create({[1,2,3], n}, SinTrigP(n,x));

s := sin(x)+2*sin(2*x)+3*sin(3*x)+Sum(n*sin(n*x),n = 4 .. infinity)

>    type(s, FOURIERSERIES);

true

There are four types of orthogonal systems: SinTrigP, CosTrigP, CosSinTrigP and ExpTrigP2. ExpTrigP2 means that the series is defined as a sum which goes from the zero to the plus infinity (and not from the minus infinity to the plus infinity).

>    Create({[1,2,3], n}, CosTrigP(n,x));

1+2*cos(x)+3*cos(2*x)+Sum(n*cos(n*x),n = 3 .. infinity)

Creating series with different period.

>    Create({[1,2,3], n}, CosTrigP(n,x), Pi);

1+2*cos(2*x)+3*cos(4*x)+Sum(n*cos(2*n*x),n = 3 .. infinity)

When creating the series with both sine and cosine terms, the coefficients are specified by a list of pairs. Also it is necessary to use the option "general" to set the general coefficient of the series.

>    s:=Create({[1,[1,-1],[1/2,-1/2]], 'general'=[n,-n]}, CosSinTrigP(n,x));

s := 1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+Sum(n*cos(n*x)-n*sin(n*x),n = 3 .. infinity)

Some other possibilities to specify the coefficients (see OrthogonalSeries[Create]):

>    Create({[1,[1,-1],[1/2,-1/2]]}, CosSinTrigP(n,x));

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)

>    Create({[0=1,1=[1,-1],3=[1/2,-1/2]], 'general'=n, n=5..10}, CosSinTrigP(n,x));

1+cos(x)-sin(x)+1/2*cos(3*x)-1/2*sin(3*x)+Sum(n*cos(n*x)+n*sin(n*x),n = 5 .. 10)

>    Create({[0=1,1=[1,-1],3=[1/2,-1/2]], 'general'=n, n=5..10}, ExpTrigP2(n,x));

1+exp(x*I)-exp(-I*x)+1/2*exp(3*I*x)-1/2*exp(-3*I*x)+Sum(n*exp(n*x*I)+n*exp(-I*n*x),n = 5 .. 10)

The data structure of the type FOURIERSERIES:

>    lprint(s);

FourierTrigSeries:-FOURIERSERIES(S)

>    print(op(1,s));

ARRAY([0 .. 1],[(0) = TABLE(sparse,[
ARRAY([0 .. 1],[(0) = TABLE(sparse,[
ARRAY([0 .. 1],[(0) = TABLE(sparse,[
ARRAY([0 .. 1],[(0) = TABLE(sparse,[

ConvertToSum()

Converting series structure to the regular sum

>    ConvertToSum(s);

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+Sum(n*cos(n*x)-n*sin(n*x),n = 3 .. infinity)

>    lprint(%);

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+Sum(n*cos(n*x)-n*sin(n*x),n = 3 .. infinity)

Derivate()

Derivate the series

>    s2:=Derivate(s, 'x');

s2 := -cos(x)-sin(x)-cos(2*x)-sin(2*x)+Sum(-n^2*cos(n*x)-n^2*sin(n*x),n = 3 .. infinity)

>    s3:=Create({[t], t*n}, CosTrigP(n,x));

s3 := t+Sum(t*n*cos(n*x),n = 1 .. infinity)

>    Derivate(s3, 'x');

Sum(-n^2*t*sin(n*x),n = 1 .. infinity)

>    Derivate(s3, 't');

1+Sum(n*cos(n*x),n = 1 .. infinity)

Evaluate(), GetPartialSum()

Evaluation

>    Evaluate(s, x=Pi/4);

1/2+sum(n*cos(1/4*n*Pi)-n*sin(1/4*n*Pi),n = 3 .. infinity)

>    Evaluate(s, trunc=5);

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+3*cos(3*x)-3*sin(3*x)+4*cos(4*x)-4*sin(4*x)+5*cos(5*x)-5*sin(5*x)

The same can be obtained by

>    GetPartialSum(s, 5);

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+3*cos(3*x)-3*sin(3*x)+4*cos(4*x)-4*sin(4*x)+5*cos(5*x)-5*sin(5*x)

>    Evaluate(s, x=Pi/4, trunc=5);

-7/2-3*2^(1/2)

>    Evaluate(s, x=A, trunc=5);

1+cos(A)-sin(A)+1/2*cos(2*A)-1/2*sin(2*A)+3*cos(3*A)-3*sin(3*A)+4*cos(4*A)-4*sin(4*A)+5*cos(5*A)-5*sin(5*A)

ChangeBasis()

Conversion between orthogonal systems.

>    s2;

-cos(x)-sin(x)-cos(2*x)-sin(2*x)+Sum(-n^2*cos(n*x)-n^2*sin(n*x),n = 3 .. infinity)

>    ChangeBasis(s2, `ExpTrigP2`(n,x));

(-1/2+1/2*I)*exp(x*I)-(1/2+1/2*I)*exp(-I*x)+(-1/2+1/2*I)*exp(2*I*x)-(1/2+1/2*I)*exp(-2*I*x)+Sum((-1/2*n^2+1/2*I*n^2)*exp(n*x*I)+(-1/2*n^2-1/2*I*n^2)*exp(-I*n*x),n = 3 .. infinity)

>    ChangeBasis(%, `SinTrigP`(n,x));

`Cannot convert to SinTrigP, converting to CosSinTrigP`

-cos(x)-sin(x)-cos(2*x)-sin(2*x)+Sum(-n^2*cos(n*x)-n^2*sin(n*x),n = 3 .. infinity)

Add(), ScalarMultiply()

Adding two series and multiplying the series by a scalar.

>    s;

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+Sum(n*cos(n*x)-n*sin(n*x),n = 3 .. infinity)

>    s2;

-cos(x)-sin(x)-cos(2*x)-sin(2*x)+Sum(-n^2*cos(n*x)-n^2*sin(n*x),n = 3 .. infinity)

>    Add(s,s2);

1-2*sin(x)-1/2*cos(2*x)-3/2*sin(2*x)+Sum((-n^2+n)*cos(n*x)+(-n^2-n)*sin(n*x),n = 3 .. infinity)

>    Add(s,s2, 1, 3);

1-2*cos(x)-4*sin(x)-5/2*cos(2*x)-7/2*sin(2*x)+Sum((-3*n^2+n)*cos(n*x)+(-3*n^2-n)*sin(n*x),n = 3 .. infinity)

>    s3:=ScalarMultiply(s2, (1-alpha));

s3 := (-1+alpha)*cos(x)+(-1+alpha)*sin(x)+(-1+alpha)*cos(2*x)+(-1+alpha)*sin(2*x)+Sum(-(1-alpha)*n^2*cos(n*x)-(1-alpha)*n^2*sin(n*x),n = 3 .. infinity)

Coefficient(), Degree(), Truncate(), Copy()

Getting the coefficients and the degree of the partial sum, copying the series.

>    s;

1+cos(x)-sin(x)+1/2*cos(2*x)-1/2*sin(2*x)+Sum(n*cos(n*x)-n*sin(n*x),n = 3 .. infinity)

>    Coefficients(s,5);

[5, -5]

>    Degree(s3);

infinity

>    Truncate(s3,7);

(-1+alpha)*cos(x)+(-1+alpha)*sin(x)+(-1+alpha)*cos(2*x)+(-1+alpha)*sin(2*x)+Sum(-(1-alpha)*n^2*cos(n*x)-(1-alpha)*n^2*sin(n*x),n = 3 .. 7)

>    Degree(%);

7

Copying the series

>    s4:=Copy(s3);

s4 := (-1+alpha)*cos(x)+(-1+alpha)*sin(x)+(-1+alpha)*cos(2*x)+(-1+alpha)*sin(2*x)+Sum(-(1-alpha)*n^2*cos(n*x)-(1-alpha)*n^2*sin(n*x),n = 3 .. infinity)

SimplifyCoefficients()

Simplify the coefficients

>    s1:=Create({-1/(n-1)}, SinTrigP(n,x));

s1 := Sum(-1/(n-1)*sin(n*x),n = 1 .. infinity)

>    s2:=Create({n/(n-1)}, SinTrigP(n,x));

s2 := Sum(n/(n-1)*sin(n*x),n = 1 .. infinity)

>    Add(s1,s2);

Sum((n/(n-1)-1/(n-1))*sin(n*x),n = 1 .. infinity)

>    SimplifyCoefficients(%, simplify);

Sum(sin(n*x),n = 1 .. infinity)

GetFourierSeries()

Computing the Fourier series of the given function.

>    GetFourierSeries(cos(x)^4,x=-Pi..Pi);

3/8+1/2*cos(2*x)+1/8*cos(4*x)

>    GetFourierSeries(x+signum(x),x=-Pi..Pi);

Sum(-2/Pi*((-1)^n+(-1)^n*Pi-1)/n*sin(n*x),n = 1 .. infinity)

Getting the partial sum.

>    t:=Truncate(%, 4);

t := Sum(-2/Pi*((-1)^n+(-1)^n*Pi-1)/n*sin(n*x),n = 1 .. 4)

>    ConvertToSum(t);

Sum(-2/Pi*((-1)^n+(-1)^n*Pi-1)/n*sin(n*x),n = 1 .. 4)

Change the orthogonal system.

>    ChangeBasis(t, `ExpTrigP2`(n,x));

Sum(1/Pi*((-1)^n+(-1)^n*Pi-1)/n*exp(n*x*I)*I-I/Pi*((-1)^n+(-1)^n*Pi-1)/n*exp(-I*n*x),n = 1 .. 4)

>    GetFourierSeries(x^2,x=-Pi..Pi, exp);

1/3*Pi^2+Sum(2/n^2*(-1)^n*exp(n*x*I)+2/n^2*(-1)^n*exp(-I*n*x),n = 1 .. infinity)

Getting the Fourier series of the odd/even periodic extension.

>    GetFourierSeries(x^2,x=0..Pi, even);

1/3*Pi^2+Sum(4/n^2*(-1)^n*cos(n*x),n = 1 .. infinity)

>    GetFourierSeries(x^2,x=0..Pi, even, exp);

1/3*Pi^2+Sum(2/n^2*(-1)^n*exp(n*x*I)+2/n^2*(-1)^n*exp(-I*n*x),n = 1 .. infinity)

>    GetFourierSeries(x^3,x=-Pi..Pi);

Sum(2*(-1)^(1+n)*(-6+n^2*Pi^2)/n^3*sin(n*x),n = 1 .. infinity)

>    GetFourierSeries(x^3,x=-Pi..0, odd);

Sum(-2*(-1)^n*(-6+n^2*Pi^2)/n^3*sin(n*x),n = 1 .. infinity)

>   

ExploreFourierSeriesCoefficients()

Procedure computes values of Fourier series coefficients

>    ExploreFourierSeriesCoefficients(signum(sin(2*x)), x=-Pi..Pi);

1/2*a[0]+Sum(a[n]*cos(n*x)+b[n]*sin(n*x),n = 1 .. infinity)

a[n] = 0

b[n] = 2*((-1)^n+1-2*cos(1/2*Pi*n))/Pi/n

Look at coefficients in more detail

>    ExploreFourierSeriesCoefficients(signum(sin(2*x)), x=-Pi..Pi,2);

1/2*a[0]+Sum(a[n]*cos(n*x)+b[n]*sin(n*x),n = 1 .. infinity)

a[n] = 0

b[n] = PIECEWISE([-2*(-1+(-1)^k)/Pi/k, n = 2*k],[0, n = 2*k+1])

>    ExploreFourierSeriesCoefficients(signum(sin(2*x)), x=-Pi..Pi,4);

1/2*a[0]+Sum(a[n]*cos(n*x)+b[n]*sin(n*x),n = 1 .. infinity)

a[n] = 0

b[n] = PIECEWISE([0, n = 4*k],[0, n = 4*k+1],[4/Pi/(2*k+1), n = 4*k+2],[0, n = 4*k+3])

>    ExploreFourierSeriesCoefficients(signum(sin(2*x)), x=-Pi..Pi, 4, exp);

c[0]+Sum(c[n]*exp(n*x*I)+c[-n]*exp(-I*n*x),n = 1 .. infinity)

c[0] = 0

c[n] = PIECEWISE([0, n = 4*k],[0, n = 4*k+1],[-2*I/Pi/(2*k+1), n = 4*k+2],[0, n = 4*k+3])

c[-n] = PIECEWISE([0, n = 4*k],[0, n = 4*k+1],[2*I/Pi/(2*k+1), n = 4*k+2],[0, n = 4*k+3])

DrawPartialSum()

>    S:=GetFourierSeries(x,x=-1..1):

>    DrawPartialSum(S,3);

[Maple Plot]

>    DrawPartialSum(S,3,-2..2,scaling=constrained,color=blue,thickness=3);

[Maple Plot]

>   

DrawPeriodicExtension()

>    DrawPeriodicExtension(x,x=-1..1,-2..2);

[Maple Plot]

>    DrawPeriodicExtension(x,x=0..1,-3..3,even,thickness=3,color=blue,scaling=constrained);

[Maple Plot]

>    DrawPeriodicExtension(x^2,x=-1..0,-2..2,odd,drawlimits,scaling=constrained);

[Maple Plot]

>   

Solving the differential equation using the Fourier series.

>    Diff(y(x),x$2)+2*y(x)=Sum(sin(n*x)/n^4,n=1..infinity);

Diff(y(x),`$`(x,2))+2*y(x) = Sum(sin(n*x)/n^4,n = 1 .. infinity)

>    S1:=Create({[0],'general'=[0,1/n^4]}, CosSinTrigP(n,x));

S1 := Sum(sin(n*x)/n^4,n = 1 .. infinity)

Create the general series

>    S2:=Create({[a0], 'general'=[aN,bN]}, CosSinTrigP(n,x));

S2 := a0+Sum(aN*cos(n*x)+bN*sin(n*x),n = 1 .. infinity)

Derivate the series two times

>    tmp1:=Derivate(Derivate(S2, 'x'), 'x');

tmp1 := Sum(-n^2*aN*cos(n*x)-n^2*bN*sin(n*x),n = 1 .. infinity)

Add the multiple of the series

>    tmp2:=Add(tmp1,S2, 1, 2);

tmp2 := 2*a0+Sum((2*aN-n^2*aN)*cos(n*x)+(2*bN-n^2*bN)*sin(n*x),n = 1 .. infinity)

Our equation now has the form

>    tmp2=S1;

2*a0+Sum((2*aN-n^2*aN)*cos(n*x)+(2*bN-n^2*bN)*sin(n*x),n = 1 .. infinity) = Sum(sin(n*x)/n^4,n = 1 .. infinity)

Subtract the series

>    S:=Add(lhs(%), rhs(%), 1, -1);

S := 2*a0+Sum((2*aN-n^2*aN)*cos(n*x)+(-1/(n^4)+2*bN-n^2*bN)*sin(n*x),n = 1 .. infinity)

>    type(S, FOURIERSERIES);

true

Series S should have all coefficients equal to zero. Hence a0 = 0.

Get the general coefficient.

>    Coefficients(S);

[2*aN-n^2*aN, -1/(n^4)+2*bN-n^2*bN]

>    {%[1]=0, %[2]=0};

{2*aN-n^2*aN = 0, -1/(n^4)+2*bN-n^2*bN = 0}

>    solve(%, {aN, bN});

{bN = -1/(n^4*(-2+n^2)), aN = 0}

Create the solution.

>    Y:=Create({subs(%, bN)}, SinTrigP(n,x));

Y := Sum(-1/n^4/(-2+n^2)*sin(n*x),n = 1 .. infinity)

Check the solution

>    Add(Derivate(Derivate(Y, 'x'), 'x'), Y, 1, 2);

Sum((-2/n^4/(-2+n^2)+1/(n^2*(-2+n^2)))*sin(n*x),n = 1 .. infinity)

>    SimplifyCoefficients(%, simplify);

Sum(sin(n*x)/n^4,n = 1 .. infinity)

>   

>   

>