Professional Documents
Culture Documents
1.b) By using the general purpose ordinary differential equation solver developed in class (or otherwise), develop a Matlab function m-file based on the finite element method that will produce
an approximate solution to the boundary value problem of part 1.a. Your file should accept
as its single input parameter the number of elements to be used in computation of the solution. If you wish to compare your results with the exact solution to the problem, it is given by
u(x) = x3/2 (1 + 1.5 ln(x/3)) + x3 /9.
1.a) Multiply the given ODE by a test function v and integrate over the interval [1, 3]. Use integration
by parts to find
Z 3
Z 3
2
00
2
0 3
4x vu dx = 4x vu 1
(4x2 v 0 u0 + 8xvu0 ) dx.
1
Now use the boundary conditions to eliminate the u (1), u0 (3) with the result
Z
% number of elements
% number of nodes per element
% number of dofs per node
% total number of nodes in system
% total system dofs
% left hand end point
% right hand end point
lhbc=2; rhbc=6;
% parameters in boundary conditions
%----------------------------------------% input data for nodal coordinate values
%----------------------------------------gcoord=linspace(xleft,xright,nnode);
%----------------------------------------------------% input data for nodal connectivity for each element
%----------------------------------------------------nodes=[1:nel;2:nel+1];
%----------------------------------------% initialization of matrices and vectors
%----------------------------------------ff=zeros(sdof,1);
% initialization of system force vector
kk=zeros(sdof,sdof);
% initialization of system matrix
index=zeros(nnel*ndof,1); % initialization of index vector
k=zeros(2,2); f=zeros(2,1);
%----------------------------------------------------------------% computation of element matrices and vectors and their assembly
%----------------------------------------------------------------for iel=1:nel
% loop for the total number of elements
nl=nodes(iel,1); nr=nodes(iel,2); % extract nodes for (iel)-th element
xl=gcoord(nl); xr=gcoord(nr);% extract nodal coord values for the element
eleng=xr-xl;
% element length
index=feeldof1(iel,nnel,ndof);% extract system dofs associated with element
k=elstif(xl,xr);
% compute element matrix
f=elload(xl,xr);
% compute element vector
[kk,ff]=feasmbl2(kk,ff,k,f,index); % assemble element matrices and vectors
end
%----------------------------%
apply boundary conditions
%----------------------------av=acoef(xright);
ff(nnode)=ff(nnode)-av(1)*rhbc;
kk(nnode,nnode)=kk(nnode,nnode)-av(1);
av=acoef(xleft);
ff(1)=ff(1)+av(1)*lhbc;
kk(1,1)=kk(1,1)+av(1)*1.5;
%---------------------------% solve the matrix equation
%---------------------------fsol=kk\ff;
%---------------------
% analytical solution
%--------------------for i=1:nnode
x=gcoord(i);
esol(i)=x^(-1.5)*(-1+1.5*log(x/3))+x^3/9;
end
%-----------------------------------% print both exact and fem solutions
%-----------------------------------err=abs(esol-fsol);
num=1:1:sdof;
fprintf(%10s %10s %10s %10s\n,node, fem, exact, abs err);
fprintf(%10d %10.4f %10.4f %10.4f\n, [num; fsol; esol; err] );
plot(gcoord,fsol,k, gcoord,esol,ko);
%--------------------------------------------------------------------function k=elstif(xl,xr)
% approximate coefficients by their values at the midpoint of
% the element
xm=(xl+xr)/2; h=xr-xl;
av=acoef(xm); bm=bcoef(xm); cm=ccoef(xm);
k=-(av(1)/h)*[1 -1;-1 1]+((bm-av(2))/2)*[-1 1;-1 1]+(cm*h/6)*[2 1;1 2];
%--------------------------------------------------------------------function f=elload(xl,xr)
xm=(xl+xr)/2; h=xr-xl; fm=fcoef(xm);
f=(fm*h/2)*[1;1];
%--------------------------------------------------------------------function va=acoef(x)
va=[4*x^2;8*x];
%--------------------------------------------------------------------function b=bcoef(x)
b=16*x;
%--------------------------------------------------------------------function c=ccoef(x)
c=9;
%--------------------------------------------------------------------function f=fcoef(x)
f=9*x^3;
%=====================================================================
% utility files from Textbook
%=====================================================================
function [index]=feeldof1(iel,nnel,ndof)
%---------------------------------------------------------% Purpose:
%
Compute system dofs associated with each element in one%
dimensional problem
%
% Synopsis:
%
[index]=feeldof1(iel,nnel,ndof)
%
%
%
%
%
%
Variable Description:
index - system dof vector associated with element "iel"
iel - element number whose system dofs are to be determined
nnel - number of nodes per element
ndof - number of dofs per node
%-----------------------------------------------------------
edof = nnel*ndof;
start = (iel-1)*(nnel-1)*ndof;
for i=1:edof
index(i)=start+i;
end
function [kk,ff]=feasmbl2(kk,ff,k,f,index)
%---------------------------------------------------------% Purpose:
%
Assembly of element matrices into the system matrix &
%
Assembly of element vectors into the system vector
%
% Synopsis:
%
[kk,ff]=feasmbl2(kk,ff,k,f,index)
%
% Variable Description:
%
kk - system matrix
%
ff - system vector
%
k - element matrix
%
f - element vector
%
index - d.o.f. vector associated with an element
%-----------------------------------------------------------
edof = length(index);
for i=1:edof
ii=index(i);
ff(ii)=ff(ii)+f(i);
for j=1:edof
jj=index(j);
kk(ii,jj)=kk(ii,jj)+k(i,j);
end
end
function [kk,ff]=feaplyc2(kk,ff,bcdof,bcval)
%---------------------------------------------------------% Purpose:
%
Apply constraints to matrix equation [kk]{x}={ff}
%
% Synopsis:
%
[kk,ff]=feaplybc(kk,ff,bcdof,bcval)
%
% Variable Description:
%
kk - system matrix before applying constraints
%
ff - system vector before applying constraints
%
bcdof - a vector containging constrained d.o.f
%
bcval - a vector containing contained value
%
%
For example, there are constraints at d.o.f=2 and 10
%
and their constrained values are 0.0 and 2.5,
%
respectively. Then, bcdof(1)=2 and bcdof(2)=10; and
%
bcval(1)=1.0 and bcval(2)=2.5.
%----------------------------------------------------------n=length(bcdof);
sdof=size(kk);
for i=1:n
c=bcdof(i);
for j=1:sdof
kk(c,j)=0;
end
kk(c,c)=1;
ff(c)=bcval(i);
end