By Mark S. Gockenbach (siam, 2010)


Chapter 5: Boundary value problems in statics



Download 2.45 Mb.
Page11/25
Date09.06.2018
Size2.45 Mb.
#53772
1   ...   7   8   9   10   11   12   13   14   ...   25

Chapter 5: Boundary value problems in statics




Section 5.2: Introduction to the spectral method; eigenfunctions

I will begin by verifying that the eigenfunctions of the negative second derivative operator (under Dirichlet conditions), sin(nπx/l), are mutually orthogonal:



clear

syms m n pi x l

int(sin(n*pi*x/l)*sin(m*pi*x/l),x,0,l)

ans =


-(l*(m*cos(pi*m)*sin(pi*n) - n*cos(pi*n)*sin(pi*m)))/(pi*(m^2 - n^2))

simplify(ans)

ans =

-(l*(m*cos(pi*m)*sin(pi*n) - n*cos(pi*n)*sin(pi*m)))/(pi*(m^2 - n^2))


At first glance, this result is surprising: Why did MATLAB not obtain the expected result, 0? However, a moment's thought reveals the reason: The integral is not necessarily zero unless m and n are integers, and MATLAB has no way of knowing that the symbols m and n are intended to represent integers. When m is an integer, then sin(mπ)=0 and cos(mπ)=(-1)m. We can use the subs command to replace each instance of sin(mπ) by zero, and similarly for cos(mπ), sin(nπ), and cos(nπ):
subs(ans,sin(m*pi),0)

ans =


-(l*m*cos(pi*m)*sin(pi*n))/(pi*(m^2 - n^2))

subs(ans,cos(m*pi),(-1)^m)

ans =

-((-1)^m*l*m*sin(pi*n))/(pi*(m^2 - n^2))



subs(ans,sin(n*pi),0)

ans =


0
These substitutions are rather tedious to apply, but they are often needed when doing Fourier series computations. Therefore, I wrote a simple program to apply them:
type mysubs

function expr=mysubs(expr,varargin)


%expr=mysubs(expr,m,n,...)

%

% This function substitutes 0 for sin(m*pi) and (-1)^m



% for cos(m*pi), and similarly for sin(n*pi) and cos(n*pi),

% and any other symbols given as inputs.


syms pi

k=length(varargin);

for j=1:k

expr=subs(expr,sin(varargin{j}*pi),0);

expr=subs(expr,cos(varargin{j}*pi),(-1)^varargin{j});

end


expr=simplify(expr);
I will use mysubs often to simplify Fourier coefficient calculations.
Example 5.5
Let f(x) be defined as follows:
clear

syms x

f=x*(1-x)

f =


-x*(x - 1)
I can easily compute the Fourier sine coefficients of f on the interval [0,1]:
syms n pi

2*int(f*sin(n*pi*x),x,0,1)

ans =

(2*(4*sin((pi*n)/2)^2 - pi*n*sin(pi*n)))/(pi^3*n^3)



I simplify the result using mysubs:
a=mysubs(ans,n)

a =


(8*sin((pi*n)/2)^2)/(pi^3*n^3)

Here is the coefficient:


pretty(a)

/ pi n \2

8 sin| ---- |

\ 2 /


--------------

3 3


pi n
Using the symsum (symbolic summation) command, I can now create a partial Fourier sine series with a given number of terms. For example, suppose I want the Fourier sine series with n=1,2,…,10. Here it is:
S=symsum(a*sin(n*pi*x),n,1,10)

S =


(8*sin(pi*x))/pi^3 + (8*sin(3*pi*x))/(27*pi^3) + (8*sin(5*pi*x))/(125*pi^3) + (8*sin(7*pi*x))/(343*pi^3) + (8*sin(9*pi*x))/(729*pi^3)
I can plot the partial sum:
t=linspace(0,1,21);

plot(t,subs(S,x,t))




I can also plot the error in S as an approximation to f:
plot(t,subs(f,x,t)-subs(S,x,t))


The error looks jagged because I chose a coarse grid on which to perform the computations. Here is a more accurate graph:
t=linspace(0,1,101);

plot(t,subs(f,x,t)-subs(S,x,t))




I can also investigate how the error decreases as the number of terms in the Fourier series is increased. For example, here is the partial Fourier series with 20 terms:


S=symsum(a*sin(n*pi*x),n,1,20);
Here is the error in S as an approximation to f:
plot(t,subs(f,x,t)-subs(S,x,t))



A few notes about symsum

The symsum command has the form "symsum(expr,ii,m,n)", where ii must be a symbolic variable without an assigned value. If ii has previously been assigned a value, then the above command will not work. Here are some errors to be avoid:


This does not work because ii is not symbolic:
ii=1;

symsum(ii,ii,1,10)

??? Undefined function or method 'symsum' for input arguments of type 'double'.
This does not work because ii has a value:
syms ii

ii=sym(1);

symsum(ii,ii,1,10)

??? Error using ==> mupadmex



Error in MuPAD command: summation variable must be an identifier or indexed identifier [sum]
Error in ==> sym.symsum at 74

r = mupadmex('symobj::map',f.s,'symobj::symsum',x.s,a.s,b.s);
This is correct:
clear ii

syms ii

symsum(ii,ii,1,10)

ans =


55
When symsum(expr,ii,m,n) is executed, the values m, m+1, ... ,n are substituted for ii in expr, and the results are summed. This substitution is automatic, and is part of the function of the symsum command. By contrast, consider the following loop:
clear

syms ii

expr=ii^2;

s=sym(0);

for ii=1:10

s=s+expr;

end

s

s =

10*ii^2
Even though ii has a value when the line "s=s+expr" is executed, this value is not substituted into expr unless we specifically direct that it be. (The fact that the analogous substitution takes place during the execution of symsum is a special feature of symsum.) The subs command can be used to force this substitution:


clear

syms ii

expr=ii^2;

s=sym(0);

for ii=1:10

s=s+subs(expr);

end

s

s =

385
This use of the subs command, subs(expr), tells MATLAB that if a variable appears in expr, and that variable has a value in the MATLAB workspace, then the value should be substituted into expr.




Download 2.45 Mb.

Share with your friends:
1   ...   7   8   9   10   11   12   13   14   ...   25




The database is protected by copyright ©ininet.org 2024
send message

    Main page