0% found this document useful (0 votes)
178 views73 pages

nu3MATLAB Codes

This document contains MATLAB code for solving differential equations numerically. It includes code to generate Hermite polynomials, calculate rain attenuation and phase shift, solve the 1D wave equation using finite differences, and solve Poisson's equation using the successive over-relaxation method.

Uploaded by

botametunosega
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
178 views73 pages

nu3MATLAB Codes

This document contains MATLAB code for solving differential equations numerically. It includes code to generate Hermite polynomials, calculate rain attenuation and phase shift, solve the 1D wave equation using finite differences, and solve Poisson's equation using the successive over-relaxation method.

Uploaded by

botametunosega
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 73

MATLAB Codes

clear all; format compact;format short g; tic

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% THIS PROGRAM GENERATES HERMITE'S FUNCTIONS HN(X) IN TWO WAYS
USING:
% 1) SERIES EXPANSION
% 2) RECURRENCE RELATION
% THE TWO METHODS ARE COMPARED
% X = ARGUMENT (FIXED IN THIS PROGRAM)
% N = ORDER OF THE FUNCTION
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

X = 0.5; %Argument
NMAX = 15; %Order of Function

% METHOD 1: SERIES EXPANSION FORMULA Eq. (2.190)


for N = 0:NMAX
SUM = 0;
FN = factorial(N);
I = floor(N/2); %Greatest Integer Function
for K = 0:I
M = N - 2*K;
FM = factorial(M);
FK = factorial(K);
SUM = SUM + ( ((-1)^K)*FN*((2*X)^M) )/( FK*FM );
end
HS(N+1) = SUM;
end

% METHOD 2: RECURRENCE FORMULA Eq. (2.191a)


HR(1) = 1;
HR(2) = 2*X;
for k = 2:N
n = k-1; %MATLAB HR vector starts at 1 while equation
% subscript starts at 0
HR(k+1) = 2*X*HR(k) - 2*(n)*HR(k-1);
end

Difference = HS-HR;

hdr = [{'N'},{'Series Expansion'},{'Recurrence'},{'Difference'}];


output = [hdr; num2cell([(0:N)',HS',HR', Difference'])];
disp([' Values of Hn(x) for x = ',num2str(X),', 0<=n<=',num2str(N)])
disp(output)

Fig. 2.11 Program for Hermite function Hn(x).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%
% MAIN PROGRAM
%
% FOR SPHERICAL RAIN DROPS, THIS PROGRAM CALCULATES
ATTENUATION IN dB/KM
% AND PHASE SHIFT IN DEG/KM FOR A GIVEN RAIN RATE
%
% R = RAIN RATE IN MM/HR
% D = DROP DIAMETER IN CM
% F = FREQUENCY IN GHZ
% AT = ATTENUATION IN dB/KM
% PH = PHASE SHIFT IN DEG/KM
% V = TERMINAL VELOCITY OF RAIN DROPS
% P = PERCENT OF TOTAL VOLUME AS MEASURED
% M = COMPLEX REFRACTIVE INDEX OF WATER AT T = 20 C
% X = ALPHA = K*A

clear all; format compact; tic

%Inputs:
F = 11.0; %Frequency (GHz)
NMAX = 10; %Ideally inf but 10 is sufficient eqn (2.256)

LAM = 30.0/F; % WAVELENGTH IN CM

% Raindrop Terminal Velocity Data


V=[2.1,3.9,5.3,6.4,7.3,7.9,8.35,8.7,9.0,9.2,9.35,9.5,9.6,9.6];

% Rain rate (mm/hr)


R=[0.25,1.25,2.5,5.0,12.5,25.0,50.0,100.0,150.0];

% Laws and Parsons drop-size distribution for various rain rate (% of total volume)
P =1/100*[28.0, 50.1, 18.2, 3.0, 0.7, 0 0 0 0 0 0 0 0 0;...
10.9, 37.1, 31.3, 13.5, 4.9, 1.5, 0.6, 0.2, 0 0 0 0 0 0;...
7.3, 27.8, 32.8, 19.0, 7.9, 3.3, 1.1, 0.6, 0.2, 0 0 0 0 0;...
4.7, 20.3, 31.0, 22.2, 11.8, 5.7, 2.5, 1.0, 0.5, 0.3, 0 0 0 0;...
2.6, 11.5, 24.5, 25.4, 17.3, 10.1, 4.3, 2.3, 1.2, 0.6, 0.2 0 0 0;...
1.7, 7.6, 18.4, 23.9, 19.9, 12.8, 8.2, 3.5, 2.1, 1.1, 0.5, 0.3 0 0;...
1.2, 5.4, 12.5, 19.9, 20.9, 15.6, 10.9, 6.7, 3.3, 1.8, 1.1, 0.5, 0.2, 0;...
1.0, 4.6, 8.8, 13.9, 17.1, 18.4, 15.0, 9.0, 5.8, 3.0, 1.7, 1.0, 0.7, 0;...
1.0, 4.1, 7.6, 11.7, 13.9, 17.7, 16.1, 11.9, 7.7, 3.6, 2.2, 1.2, 1.0, 0.3]';

f = [0.6 0.8 1 1.6 2 3 4 6 11 16 20 30 40 60 80 100 160 200 300];


% Refractive Index of Water at 20 degrees C, real and complex portions
mr= [8.96 8.956 8.952 8.933 8.915 8.858 8.78 8.574 7.884 7.148 6.614 5.581 4.886
4.052 3.581 3.282 2.82 2.668 2.481];
mi= [0.1713 0.2172 0.2648 0.4105 0.5078 0.7471 0.9771 1.399 2.184 2.614 2.78 2.848
2.725 2.393 2.100 1.864 1.382 1.174 0.8466];

% Interpolate refractive index of water to target frequency. F must be


% within the range of f.
mr_i = interp1(f,mr,F);
mi_i = interp1(f,mi,F);
M = mr_i - mi_i*i;

N = 1:NMAX;
D = 0.05*(1:length(V));
SO = zeros(1,length(V));
SB = zeros(1,length(V));
for I = 1:length(V) %I sweeps rain drop diameter

X = pi*D(I)/LAM;

% CALCULATE THE SCATTERING COEFFICIENTS an and bn

% Spherical Bessel function of the first kind of order n


J = sqrt(pi./(2*X)).*besselj(N+0.5,X);
JD = -N.*sqrt(pi./(2*X)).*besselj(N+0.5,X)+ X.*sqrt(pi./(2*X)).*besselj(N+0.5-1,X);
JM = sqrt(pi./(2*M*X)).*besselj(N+0.5,M*X);
JMD= -N.*sqrt(pi./(2*M*X)).*besselj(N+0.5,M*X)+
M*X.*sqrt(pi./(2*M*X)).*besselj(N+0.5-1,M*X);
H = sqrt(pi./(2*X)).*besselh(N+0.5,2,X);
HD = -N.*sqrt(pi./(2*X)).*besselh(N+0.5,2,X)+X.*sqrt(pi./(2*X)).*besselh(N+0.5-
1,2,X);

A1 = JM.*JD - J.*JMD;
A2 = JM.*HD - H.*JMD;
B1 = J.*JMD - (M^2)*JM.*JD;
B2 = H.*JMD - (M^2)*JM.*HD;
an = A1./A2;
bn = B1./B2;
cn = i./(X*A2);
dn = -i*M./(X*B2);
% FORWARD SCATTERING AMPLITUDE FUNCTION S(O)
SO(I) = sum((2*N+1).*(an+bn))/2;
% NORMALIZED RADAR CROSS-SECTION
SB(I)=(abs( sum((2*N+1).*((-1).^N).*( an - bn )) )/X).^2;
end

AT = zeros(1,size(P,2));
PH = zeros(1,size(P,2));
for n = 1:size(P,2) % N sweeps rain rate
% CALCULATE ATTENUATION AND PHASE SHIFT
ATO = real(SO).*P(:,n)'./(6*D.^3.* V);
AT(n) = 4.343*R(n)*(LAM/pi)^2*sum(ATO);

PHO = imag(SO).*P(:,n)'./(6*D.^3.*V);
PH(n) = 90.0*R(n)*(LAM/pi)^2/pi*sum(PHO);
end

disp(['Attenuation and Phase Shift at ',num2str(F),' GHz'])


hdr = [{'Rain rate (mm/hr)'},{'Attenuation (dB/km)'},{'Phase shift (deg/km)'}];
out = [hdr; num2cell([R', AT', PH'])];
disp(out)

figure(1),
semilogy(R,AT,'--'),
xlabel('rain rate (mm/hr)'),ylabel('Attenuation (dB/km)')
legend([num2str(F),' GHz'],'location','southeast')

Fig. 2.16 MATLAB program for Examples 2.13 and 2.14.

% ********************************************************************
% MATLAB code for example 3.2 on one-dimensional wave equation solved
% using an explicit finite difference scheme
%*********************************************************************

clear all; format compact; tic

%Explicit Method
delx = 0.1; % resolution size
r = 1; % 'aspect ratio'
u = 1; % Constant of given wave equation
delt = r^2*delx/u; % time step size
Tsteps = round(1/delt); % Number of time steps

% X1 is the potential grid of the simulation, due to symetry only half


% of the field is calculated.
X1 = zeros(Tsteps,1/(2*delx)+2); % Initilize X1

%Initial conditions and reflection line defined


x = 0:delx:.5+delx;
X1(1,:) = sin(pi*x);
X1(2,2:end-1) = .5*(X1(1,1:end-2)+X1(1,3:end));
X1(2,end) = X1(2,end-2); %reflection line

for row = 3:size(X1,1)


for col = 2:size(X1,2)-1
X1(row,col) = X1(row-1,col-1)+X1(row-1,col+1)-X1(row-2,col); % eqn. (3.26)
end
X1(row,end) = X1(row,end-2); %reflected line
end

%Use symetry condition to create entire field


X2 = [X1,fliplr(X1(:,1:end-3))];

figure(1),imagesc(0:delx:1,(0:delt:Tsteps*delt),X2),colorbar
ylabel('\leftarrow time (sec)')
xlabel('x')
title('Hyperbolic PDE')

if (delx==.1)
dispmat = [X1(1:8,1:7)];
disp(sprintf('\nCompare to Table 3.5, Solution of the Wave Equation in Example
3.2'))
disp(num2str(dispmat))
end

Fig. 3.8 MATLAB code for Example 3.2.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%
% FINITE DIFFERENCE SOLUTION OF POISSON'S EQUATION:
% Vxx + Vyy = G
% USING THE METHOD OF SUCCESSIVE OVER-RELAXATION
%
% NX : NO. OF INTERVALS ALONG X-AXIS
% NY : NO. OF INTERVALS ALONG Y-AXIS
% A X B : DIMENSION OF THE SOLUTION REGION
% V(I,J) : POTENTIAL AT GRID POINT (X,Y) = H*(I,J)
% WHERE I = 0,1,...,NX, J = 0,1,....,NY
% H : MESH SIZE
% *******************************************************
% SPECIFY BOUNDARY VALUES AND NECESSARY PARAMETERS
A=1;B=1;
V1=0;V2=10;V3=20;V4=-10;
NX= 20; %4 12 20
NY= NX;
H = A/NX;
% SET INITIAL GUESS EQUAL TO ZEROS OR TO AVERAGE OF FIXED
VALUES

for I=1:NX-1
for J=1:NY-1
V(I+1,J+1)=(V1 + V2 + V3 + V4)/4.0;
end
end
% SET POTENTIALS AT FIXED NODES
for I = 1:NX-1
V(I+1,1)=V1;
V(I+1,NY+1)=V3;
end
for J=1:NY-1
V(1,J+1)=V4;
V(NX+1,J+1)=V2;
end
V(1,1)=(V1 + V4)/2.0;
V(NX+1,1)=(V1 + V2)/2.0;
V(1,NY+1)=(V3 + V4)/2.0;
V(NX+1,NY+1)=(V2 + V3)/2.0;
% FIND THE OPTIMUM OVER-RELAXATION FACTOR
T = cos(pi/NX) + cos(pi/NY);
W = ( 8 - sqrt(64 - 16*T^2))/(T^2);
disp(['SOR Factor Omega = ',num2str(W)])
W4 = W/4;
% ITERATION BEGINS
NCOUNT = 0;

loop = 1;
while loop == 1;
RMIN = 0;
for I =1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J;
G = -36.0*pi*X*(Y - 1.0);
R = W4*( V(I+2,J+1) + V(I,J+1) + V(I+1,J+2) + V(I+1,J)-4.0*V(I+1,J+1) -
G*H*H );
RMIN = RMIN + abs(R);
V(I+1,J+1) = V(I+1,J+1) + R;
end
end
RMIN = RMIN/(NX*NY);
if(RMIN>=0.0001)
NCOUNT = NCOUNT + 1;
if(NCOUNT>100)
loop = 0;
disp('SOLUTION DOES NOT CONVERGE IN 100 ITERATIONS')
end
else
%Then RMIN is less than .0001 and then solution has converged
loop = 0;
disp(['Solution Converges in ',num2str(NCOUNT),' iterations'])
disp(['h = ', num2str(H)])
end
end

Vnum = V;

%Grab original points a through i


abc = zeros(1,9);
a_tic = 1;
vec = [0:H:1];
for ii = .25:.25:.75
for jj = .25:.25:.75
xind = find(vec==ii);
yind = find(vec==jj);
%disp([xind,yind])
abc(a_tic) = Vnum(xind,yind);
a_tic = a_tic + 1;
end
end

% OUTPUT THE FINITIE DIFFERENCE APPROX. RESULTS

% ---------------------------------------------------------
% CALCULATE THE EXACT SOLUTION
%
% POISSON'S EQUATION WITH HOMOGENEOUS BOUNDARY CONDITIONS

% SOLVED BY SERIES EXPANSION


%
for I =1:NX-1
X = H*I;
for J = 1:NY-1
Y = H*J;
SUM = 0;
for M = 1:10 % TAKE ONLY 10 TERMS OF THE SERIES
FM = M;
for N = 1:10
FN = N;
FACTOR1 = (FM*pi/A)^2 + (FN*pi/B)^2;
FACTOR2 = ( (-1)^(M+N) )*144*A*B/(pi*FM*FN);
FACTOR3 = 1 - (1 - (-1)^N)/B;
FACTOR = FACTOR2*FACTOR3/FACTOR1;
SUM = SUM + FACTOR*sin(FM*pi*X/A)*sin(FN*pi*Y/B);
end
end
VH = SUM;

% LAPLACE'S EQUATION WITH INHOMOGENEOUS BOUNDARY


CONDITIONS
% SOLVED USING THE METHOD OF SEPARATION OF VARIABLES

C1=4*V1/pi;
C2=4*V2/pi;
C3=4*V3/pi;
C4=4*V4/pi;
SUM=0;
for K =1:10 % TAKE ONLY 10 TERMS OF THE SERIES
N=2*K-1;
AN=N;
A1=sin(AN*pi*X/B);
A2=sinh(AN*pi*(A-Y)/B);
A3=AN*sinh(AN*pi*A/B);
TERM1=C1*A1*A2/A3;
B1=sinh(AN*pi*X/A);
B2=sin(AN*pi*Y/A);
B3=AN*sinh(AN*pi*B/A);
TERM2=C2*B1*B2/B3;
D1=sin(AN*pi*X/B);
D2=sinh(AN*pi*Y/B);
D3=AN*sinh(AN*pi*A/B);
TERM3=C3*D1*D2/D3;
E1=sinh(AN*pi*(B-X)/A);
E2=sin(AN*pi*Y/A);
E3=AN*sinh(AN*pi*B/A);
TERM4=C4*E1*E2/E3;
TERM = TERM1 + TERM2 + TERM3 + TERM4;
SUM=SUM + TERM;
end
VI = SUM;
Vexact(I+1,J+1) = VH + VI;
end
end

%Grab original points a through i


abc2 = zeros(1,9);
a_tic = 1;
vec = [0:H:1];
for ii = .25:.25:.75
for jj = .25:.25:.75
xind = find(vec==ii);
yind = find(vec==jj);
%disp([xind,yind])
abc2(a_tic) = Vexact(xind,yind);
a_tic = a_tic + 1;
end
end

figure(1),
imagesc(flipud(Vnum')),
colorbar
ylabel('y'), xlabel('x')
title('Example 3.4: Poisson PDE')

format short g
disp(' numerical exact')
disp([abc' abc2'])

Fig. 3.12 MATLAB code for Example 3.4.

%**************************************************************
% Using the finite difference method
% This program calculates the characteristic impedance of the transmission
% line shown in Fig. 3.14.
%**************************************************************
clear all; format compact;

% Output:
%
% H NT Zo
% --------------------------------
% 0.25 700 49.05
% 0.1 500 58.074
% 0.05 500 65.817
% 0.05 700 63.103
% 0.05 1000 61.53

H = 0.05;
NT = 1000;

A = 2.5; B = 2.5; D = 0.5; W = 1.0;

ER=2.35;
EO=8.81E-12;
U=3.0E+8;

NX = A/H;
NY = B/H;
ND = D/H;
NW = W/H;
VD = 100.0;

% CALCULATE CHARGE WITH AND WITHOUT DIELECTRIC


ERR = 1.0;
for L=1:2
E1 = EO;
E2 = EO*ERR;

% INITIALIZATION
V = zeros(NX+2,NY+2);

% SET POTENTIAL ON INNER CONDUCTOR (FIXED NODES) EQUAL TO VD


V(2:NW+2,ND+2) = VD;

% CALCULATE POTENTIAL AT FREE NODES


P1 = E1/(2*(E1 + E2));
P2 = E2/(2*(E1 + E2));
for K=1:NT
for I=0:NX-1
for J=0:NY-1
if( (J==ND)&&(I<=NW) )
%do nothing
elseif (J==ND)
% IMPOSE BOUNDARY CONDITION AT THE INTERFACE
V(I+2,J+2) = 0.25*(V(I+3,J+2) + V(I+1,J+2)) + ...
P1*V(I+2,J+3) + P2*V(I+2,J+1);
elseif(I==0)
% IMPOSE SYMMETRY CONDITION ALONG Y-AXIS
V(I+2,J+2) = (2*V(I+3,J+2) + V(I+2,J+3) + V(I+2,J+1))/4.0;
elseif(J==0)
% IMPOSE SYMMETRY CONDITION ALONG X-AXIS
V(I+2,J+2) = (V(I+3,J+2) + V(I+1,J+2) + 2*V(I+2,J+3))/4.0;
else
V(I+2,J+2) = (V(I+3,J+2)+V(I+1,J+2)+V(I+2,J+3)+V(I+2,J+1))/4.0;
end
end
end
% Animation of calculation
% figure(1),imagesc(V),colorbar,title([num2str(K),'/',num2str(NT)])
% drawnow
end

% NOW, CALCULATE THE TOTAL CHARGE ENCLOSED IN A


% RECTANGULAR PATH SURROUNDING THE INNER CONDUCTOR
IOUT = round((NX + NW)/2);
JOUT = round((NY + ND)/2);
% SUM POTENTIAL ON INNER AND OUTER LOOPS
for K=1:2
SUM = E1*sum(V(3:IOUT+1,JOUT+2)) ...
+ E1*V(2,JOUT+2)/2 + E2*V(IOUT+2,2)/2;
for J=1:JOUT-1
if(J<ND)
SUM = SUM + E2*V(IOUT+2,J+2);
elseif(J==ND)
SUM = SUM + (E1+E2)*V(IOUT+2,J+2)/2;
else
SUM = SUM + E1*V(IOUT+2,J+2);
end
end
if K==1
SV(1) = SUM;
end
IOUT = IOUT - 1;
JOUT = JOUT - 1;
end
SUM = SUM + 2.0*E1*V(IOUT+2,JOUT+2);
SV(2) = SUM;
Q(L) = abs( SV(1) - SV(2) );
ERR = ER;
end

% FINALLY, CALCULATE Zo
C0 = 4.0*Q(1)/VD;
C1 = 4.0*Q(2)/VD;
Z0 = 1.0/( U*sqrt(C0*C1) );

disp([H,NT,Z0])

Fig. 3.21 MATLAB code for Example 3.6.

%*******************************************************************
% APPLICATION OF THE FINITE-DIFFERENCE TIME-DOMAIN METHOD
% This program involves the penetration of a lossless dielectric SPHERE
% by a plane wave. The program provides in the maximum absolute value of
% Ey and Ez during the final half-wave of time-stepping
% Assumption:
% +y-directed incident wave with components Ez and Hx.
% I,J,K,NN correspond to X,Y,Z, and Time.
% IMAX,JMAX,KMAX are the maximum values of x,y,z
% NNMAX is the total number of timesteps.
% NHW represents one half-wave cycle.
% MED is the number of different uniform media sections.
% JS is the j-position of the plane wave front.

% THIS PROGRAM WAS DEVELOPED BY V. BEMMEL [80]


% AND LATER IMPROVED BY D. TERRY

clear all; format compact; tic

IMAX=19; JMAX=39; KMAX=19;


NMAX=2; NNMAX=500; NHW=40; MED=2; JS=3;
DELTA=3E-3; CL=3.0E8; F=2.5E9;

% Define scatterer dimensions


OI=19.5; OJ=20.0; OK=19.0; RADIUS=15.0;

ER=[1.0,4.0]; % CONSTITUTIVE PARAMETERS


SIG=[0.1,0.0];

% Statement function to compute position w.r.t. center of the sphere


E0=(1E-9)/(36*pi);
U0=(1E-7)*4*pi;
DT=DELTA/(2*CL);
R=DT/E0;
RA=(DT^2)/(U0*E0*(DELTA^2));
RB=DT/(U0*DELTA);
TPIFDT = 2.0*pi*F*DT;

%********************************************************
% EP # 1 - COMPUTE MEDIA PARAMETERS
%********************************************************

CA = 1-R*SIG./ER;
CB = RA./ER;
CBMRB = CB/RB;

% (i) CALCULATE THE REAL/ACTUAL GRID POINTS

% Initialize the media arrays.Index (M) determines which


% medium each point is actually located in and is used to
% index into arrays which determine the constitutive
% parameters of the medium.There are separate M determining
% arrays for EX, EY, and EZ. These arrays correlate the
% integer values of I,J,K to the actual position within
% the lattice. Computing these values now and storing them in these
% arrays as opposed to computing them each time they are
% needed saves a large amount of computation time.

x = 0:(IMAX+1); y = 0:(JMAX+1); z = 0:(KMAX+1);


[Mx,My,Mz]=ndgrid(x,y,z);

IXMED = (sqrt((Mx-OI+.5).^2+(My-OJ).^2+(Mz-OK).^2)<=RADIUS)+1;
IYMED = (sqrt((Mx-OI).^2+(My-OJ+.5).^2+(Mz-OK).^2)<=RADIUS)+1;
IZMED = (sqrt((Mx-OI).^2+(My-OJ).^2+(Mz-OK+.5).^2)<=RADIUS)+1;

% *************************************************
% STEP # 2 - INITIALIZE FIELD COMPONENTS
% *************************************************
% components for output

EY1 = zeros(1,JMAX+2);
EZ1 = zeros(1,JMAX+2);

EX=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);
EY=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);
EZ=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);
HX=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);
HY=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);
HZ=zeros(IMAX+2,JMAX+2,KMAX+2,NMAX+1);

% ********************************************************
% STEP # 3 - USE FD/TD ALGORITHM TO GENERATE
% FIELD COMPONENTS
% ********************************************************
% SINCE ONLY FIELD COMPONENTS AT CURRENT TIME (t) AND PREVIOUS

% TWO TIME STEPS ( t-1 AND t-2) ARE REQUIRED FOR COMPUTATION,

% WE SAVE MEMORY SPACE BY USING THE FOLLOWING INDICES


% NCUR is index in for time t
% NPR1 is index in for t-1
% NPR2 is index in for t-2

% NOTES %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% *ind03c.m I incremented the time so it goes 1 2 3, instead of 0 1 2

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%

NCUR = 3;
NPR1 = 2;
NPR2 = 1;
for NN = 1: NNMAX % TIME LOOP
if mod(NN,10)==0
disp(['NN = ',num2str(NN)]) % DISPLAY PROGRESS
end
% Next time step - move indices up a notch.
NPR2 = NPR1;
NPR1 = NCUR;
NCUR = mod( NCUR, 3)+1;
for K=0:KMAX % Z LOOP
for J=0:JMAX % Y LOOP
for I=0:IMAX % X LOOP
% (ii)-APPLY SOFT LATTICE TRUNCATION CONDITIONS

%---x=delta/2
if (I==0)
if ((K~=KMAX)&&(K~=0))
HY(0+1,J+1,K+1,NCUR) = (HY(1+1,J+1,K-1+1,NPR2) +
HY(1+1,J+1,K+1,NPR2)+ HY(1+1,J+1,K+1+1,NPR2))/3;
HZ(0+1,J+1,K+1,NCUR) = (HZ(1+1,J+1,K-1+1,NPR2) +
HZ(1+1,J+1,K+1,NPR2)+ HZ(1+1,J+1,K+1+1,NPR2))/3;

else
if (K==KMAX)
HY(0+1,J+1,KMAX+1,NCUR) = (HY(1+1,J+1,KMAX-
1+1,NPR2)+ HY(1+1,J+1,KMAX+1,NPR2))/2;
HZ(0+1,J+1,K+1,NCUR)=( HZ(1+1,J+1,K-1+1,NPR2)+
HZ(1+1,J+1,K+1,NPR2) )/2;
else
HY(0+1,J+1,K+1,NCUR) = ( HY(1+1,J+1,K+1,NPR2)+
HY(1+1,J+1,K+1+1,NPR2))/2;
HZ(0+1,J+1,0+1,NPR2)=(HZ(1+1,J+1,0+1,NPR2)+
HZ(1+1,J+1,1+1,NPR2))/2;
end
end
end
% ---y=0
if (J==0)
EX(I+1,0+1,K+1,NCUR)=EX(I+1,1+1,K+1,NPR2);
EZ(I+1,0+1,K+1,NCUR)=EZ(I+1,1+1,K+1,NPR2);
else
%---y=ymax
if (J==JMAX)
EX(I+1,JMAX+1,K+1,NCUR)=EX(I+1,JMAX-1+1,K+1,NPR2);
EZ(I+1,JMAX+1,K+1,NCUR)=EZ(I+1,JMAX-1+1,K+1,NPR2);
end
end
%---z=0
if(K==0)
if ((I~=0)&&(I~=IMAX))
EX(I+1,J+1,0+1,NCUR) = (EX(I-1+1,J+1,1+1,NPR2) +
EX(I+1,J+1,1+1,NPR2)+EX(I+1+1,J+1,1+1,NPR2))/3;
EY(I+1,J+1,0+1,NCUR) = (EY(I-1+1,J+1,1+1,NPR2) +
EY(I+1,J+1,1+1,NPR2)+EY(I+1+1,J+1,1+1,NPR2))/3;
else
if (I==0)

EX(0+1,J+1,0+1,NCUR)=(EX(0+1,J+1,1+1,NPR2)+EX(1+1,J+1,1+1,NPR2))/2;

EY(I+1,J+1,0+1,NCUR)=(EY(I+1,J+1,1+1,NPR2)+EY(I+1+1,J+1,1+1,NPR2))/2;
else
EX(I+1,J+1,0+1,NCUR)=(EX(I-
1+1,J+1,1+1,NPR2)+EX(I+1,J+1,1+1,NPR2))/2;
EY(I+1,J+1,0+1,NCUR)=(EY(I-
1+1,J+1,1+1,NPR2)+EY(I+1,J+1,1+1,NPR2))/2;
end
end
end

% (iii) APPLY FD/TD ALGORITHM

%-----a. HX generation:

HX(I+1,J+1,K+1,NCUR)=HX(I+1,J+1,K+1,NPR1)+RB*(EY(I+1,J+1,K+1+1,NPR1)-
EY(I+1,J+1,K+1,NPR1)+EZ(I+1,J+1,K+1,NPR1)-EZ(I+1,J+1+1,K+1,NPR1));
%-----b. HY generation:

HY(I+1,J+1,K+1,NCUR)=HY(I+1,J+1,K+1,NPR1)+RB*(EZ(I+1+1,J+1,K+1,NPR1)-
EZ(I+1,J+1,K+1,NPR1)+EX(I+1,J+1,K+1,NPR1)-EX(I+1,J+1,K+1+1,NPR1));
%-----c. HZ generation:

HZ(I+1,J+1,K+1,NCUR)=HZ(I+1,J+1,K+1,NPR1)+RB*(EX(I+1,J+1+1,K+1,NPR1)-
EX(I+1,J+1,K+1,NPR1)+EY(I+1,J+1,K+1,NPR1)-EY(I+1+1,J+1,K+1,NPR1));
%---k=kmax ! SYMMETRY
if (K==KMAX)
HX(I+1,J+1,KMAX+1,NCUR)=HX(I+1,J+1,KMAX-1+1,NCUR);
HY(I+1,J+1,KMAX+1,NCUR)=HY(I+1,J+1,KMAX-1+1,NCUR);
end
% -----d. EX generation:
if ((J~=0)&&(J~=JMAX)&&(K~=0))
M = IXMED( I+1, J+1, K+1 );
EX(I+1,J+1,K+1,NCUR) = CA(M)*EX(I+1,J+1,K+1,NPR1) +
CBMRB(M)*(HZ(I+1,J+1,K+1,NCUR)-HZ(I+1,J-1+1,K+1,NCUR)+HY(I+1,J+1,K-
1+1,NCUR)-HY(I+1,J+1,K+1,NCUR));
end
%-----e. EY generation:
if(K~=0)
M = IYMED( I+1, J+1, K+1 );
if I~=0
EY(I+1,J+1,K+1,NCUR)=CA(M)*EY(I+1,J+1,K+1,NPR1) +
CBMRB(M)*(HX(I+1,J+1,K+1,NCUR)-HX(I+1,J+1,K-1+1,NCUR)+HZ(I-
1+1,J+1,K+1,NCUR)-HZ(I+1,J+1,K+1,NCUR));
else
EY(I+1,J+1,K+1,NCUR)=CA(M)*EY(I+1,J+1,K+1,NPR1) +
CBMRB(M)*(HX(I+1,J+1,K+1,NCUR)-HX(I+1,J+1,K-1+1,NCUR)+ 0 -
HZ(I+1,J+1,K+1,NCUR));
end
end
%-----f. EZ generation:
if ((J~=0)&&(J~=JMAX))

M = IZMED( I+1, J+1, K+1 );


% sig(ext)=0 for Ez only from Taflove[14]
if(M==1)
CAM=1;
else
CAM=CA(M);
end

if I~=0

EZ(I+1,J+1,K+1,NCUR)=CAM*EZ(I+1,J+1,K+1,NPR1)+CBMRB(M)*(HY(I+1,J+1,K
+1,NCUR)-HY(I-1+1,J+1,K+1,NCUR)+HX(I+1,J-1+1,K+1,NCUR)-
HX(I+1,J+1,K+1,NCUR));
else
EZ(I+1,J+1,K+1,NCUR)=CAM*EZ(I+1,J+1,K+1,NPR1)+CBMRB(M)*(HY(I+1,J+1,K
+1,NCUR)- 0 +HX(I+1,J-1+1,K+1,NCUR)-HX(I+1,J+1,K+1,NCUR));
end

% (iv) APPLY THE PLANE-WAVE SOURCE


if (J==JS)
EZ(I+1,JS+1,K+1,NCUR) = EZ(I+1,JS+1,K+1,NCUR)
+sin( TPIFDT*NN );
end
end
%---i=imax+1/2 ! SYMMETRY
if(I==IMAX)
EY(IMAX+1+1,J+1,K+1,NCUR)=EY(IMAX+1,J+1,K+1,NCUR);
EZ(IMAX+1+1,J+1,K+1,NCUR)=EZ(IMAX+1,J+1,K+1,NCUR);
end
%---k=kmax
if(K==KMAX)
EX(I+1,J+1,KMAX+1+1,NCUR)=EX(I+1,J+1,KMAX-1+1,NCUR);
EY(I+1,J+1,KMAX+1+1,NCUR)=EY(I+1,J+1,KMAX-1+1,NCUR);
end
end % X LOOP
% ********************************************************
% STEP # 4 - RETAIN THE MAXIMUM ABSOLUTE VALUES DURING
% THE LAST HALF-WAVE
% ********************************************************
if ( (K==KMAX)&&(NN>(NNMAX-NHW)) )
TEMP = abs( EY(IMAX+1,J+1,KMAX-1+1,NCUR) );
if (TEMP > EY1(J+1) )
EY1(J+1) = TEMP;
end
TEMP = abs( EZ(IMAX+1,J+1,KMAX+1,NCUR) );
if (TEMP > EZ1(J+1) )
EZ1(J+1) = TEMP;
end
end
end % Y LOOP
end % Z LOOP
end % TIME LOOP
% *******************************************************
toc

figure(3),plot(6:34,EY1(6:34),'.-')
ylabel('Computed |E_y|/|E_i_n_c|')
xlabel('j')
grid on
figure(4),plot(5:34,EZ1(5:34),'.-')
ylabel('Computed |E_z|/|E_i_n_c|')
xlabel('j')
grid on

Fig. 3.31 Computer program for FDTD three-dimensional scattering problem.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% MATLAB CODE FOR EXAMPLE 3.9:
% AN AXISYMMETRIC PROBLEM OF AN EARTHED CYLINDER PARTIALLY
FILLED WITH
% CHARGED LIQUID SOLVED USING FINITE DIFFERENCE SCHEME
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

A=1; % Radius of cylindrical tank (meters)


B=1; % Height of liquid in tank
C=1; % Height of gas in tank

ER1=1;ER2=2;EO=8.854E-12; %dielectric parameters

H = 0.05; %spacial step size


NA = A/H; %number of points along A
NB = B/H; %number of points along B
NC = C/H; %number of points along C
NBC = NB + NC; %%number of points along B & C
NMAX = 500; %number of iterations
RHOV = 1E-5;
G = -RHOV/(ER2*EO);
GH2 = G*H^2;

%INITIALIZE - THIS ALSO TAKES CARE OF DIRICHLET CONDITIONS


V = zeros(NA+1,NBC+1); %V(radius, height)

%NOW, APPLY FINITE DIFFERENCE SCHEME

for N = 1:NMAX
for I = 2:NA %step through radius
FM = (2*(I-1) - 1)/(2*(I-1)); %note that indicie starts at 1 instead of 0
FP = (2*(I-1) + 1)/(2*(I-1));

%step through liquid (z+ direction)


for J = 2:NB
V(I,J) = 0.25*( V(I,J-1) + V(I,J+1)...
+ FM*V(I-1,J) + FP*V(I+1,J) - GH2 );
end

%step through gas (z+ direction)


for J = NB+2:NBC
V(I,J) = 0.25*( V(I,J-1) + V(I,J+1)...
+ FM*V(I-1,J) + FP*V(I+1,J) );
end
%ALONG THE GASS-LIQUID INTERFACE
V(I,NB+1) = 0.5*( V(I,NB+2)*ER1/(ER1+ER2)+...
V(I,NB)*ER2/(ER1+ER2) )...
+ 0.25*(FM*V(I-1,NB+1)+FP*V(I+1,NB+1) );
end
%IMPOSE NEUMANN CONDITION ALONG THE Z-AXIS
for J = 2:NBC
V(1,J) = ( 4.0*V(2,J) + V(1,J-1)+V(1,J+1))/6.0;
end
end

% OUTPUT THE POTENTIAL ALONG RHO = 0.5, 0 < Z < 1.0


NR5 = 0.5/H;

radius = 0:H:A;
height = 0:H:(B+C);

figure(1),
subplot(211),
plot(height,V(NR5+1,(0:NBC)+1)/1000.0)
ylabel('V(kV)')
title('Potential distribution in the tank of Fig. 3.38 along \rho=0.5m')
subplot(212)
plot(radius ,V((0:NA)+1,NB+1)/1000.0)
title('Potential distribution in the tank of Fig. 3.38 along gas-liquid interface')
ylabel('V(kV)')

figure(2),surf(height,radius,V/1000)
ylabel('radius in tank')
xlabel('height in tank')
zlabel('Potential (kV)')

Fig. 3.39 MATLAB code for Example 3.9.

clear all
% Compare MATLAB Bessel function to a customly created Bessel function
% function nc_method is needed by this program

% Inputs:
x = 0.1:0.1:2; % input to bessel function
m = 0; %order of bessel function
n = 6; % Newton-Cotes rule
N = 840; % Newton-Cotes N

% Compare with built in MATLAB


J = besselj(m,x);

% Create custom Bessel function


lwr = 0; %lower limit of integration
uppr= pi; %upper limit of integration
theta = linspace(0,pi,N+1);

for ii = 1:length(x)
% Create function to be integrated
A = cos(x(ii)*sin(theta)-m*theta)/pi;

%Integrate with newton-cotes method


J_m(ii) = nc_method(A,lwr,uppr,n);
end

% Difference between MATLAB and custom Bessel


compare = J-J_m;

% eps is the Spacing of floating point numbers in MATLAB.


% Any number smaller than in magnitude than eps is essentially zero
% Try 1 + eps, this is equal to 1.
v_eps = [eps, eps];
x_eps = [x(1),x(end)];

figure(1),
subplot(211),plot(x,J,x,J_m,':')
title('Comparison between MATLAB and Custom Bessel function')
legend('MATLAB','Custom')
subplot(212),plot(x,compare,'-o',x_eps,v_eps,x_eps,-v_eps)
title('Difference between MATLAB and Custom Bessel')
legend('difference','+eps','-eps')

%figure(2),plot(theta,A)

(a)

Fig. 3.46 (a) Main program for Example 3.10.

function I = nc_method(f,a,b,n)

% I = nc_method_fun(f,a,b,n)
%
% Calculates Newton-Cotes Method Quadrature
%
% Inputs:
% f : data vector from function to be integrated
% a : lower integration limit
% b : upper integration limit
% n : order of approximating polynomial
%
% Output:
% I : Value of Integral
%
% NOTE that m (the number of sections) must be a multiple of the order of
% the approximation polynomial

m = length(f)-1; %Divide the data into m sections

%Below checks if the requirement that m is a multiple of n


if rem(m,n) ~= 0
disp('Error: length(f)-1 must be a multiple of n')
I = NaN; return
end

h = (b-a)/m; %step size.


C = nc_weight (n); %Get Newton-Cotes Number.
I = 0; %intitialize I
for ii = 1:n:m,
ind2 = (ii:ii+n); %select indicies of function
Ai = n*h*f(ind2)*C; %Equation (3.138)
I = I+Ai; %Equation (3.142)
end

function q = nc_weight(n)
% returns in q the weights for the N-point Newton-Cotes quadrature rule.
% N must be between 1 and 8.

if (n<1)
disp('error: newton-cotes order must be at least 1!')
elseif (n==1) % Trapezoidal rule:
q = [1 1]'/2;
elseif (n==2) % Simpson's rule:
q = [1 4 1]'/6;
elseif (n==3) % Simpson's 3/8 rule:
q = [1 3 3 1]'/8;
elseif (n==4)% Boole's rule:
q = [7 32 12 32 7]'/90;
elseif (n==5)
q = [19 75 50 50 75 19]'/288;
elseif (n==6)
q = [41 216 27 272 27 216 41]'/840;
elseif (n==7)
q = [751 3577 1323 2989 2989 1323 3577 751]'/17280;
elseif (n==8)
q = [989 5888 -928 10496 -4540 10496 -928 5888 989]'/28350;
else
disp('error: N must be no more than 8!')
end

(b)

Fig. 3.46 (b) Function for the main program in (a); for Example 3.10.

clear all; format compact; tic

% Output of this program


%W=H N Nx Ny Zo
%1 7 5 2 67.735
%1 11 8 3 64.963
% 0.5 7 5 2 96.758
% 0.5 11 8 3 99.098
% *****************************************************************
% THIS PROGRAM CALCULATES THE CHARACTERISTIC IMPEDANCE
% Zo OF A BOXED MICROSTRIP LINE USING COLLOCATION
% POINT-MATCHING METHOD
% *****************************************************************

X=[5 5 5, 4.0, 2.0, 1.0, 0.5, 0.0, -0.5, -1.0 -1];


Y=[0.0,0.5,1 1 1 1 1 1 1 1 ,0.5];
EO=8.8541E-12;VL=3.0E+8;

% INPUT DATA
% W : Width of conductor
% H : Vertical separation of conductor and ground planes
% V0 : Potential at the conductor
% W1 : Horizontal separation of conductor and ground plane
% NMAX : Number of matching points
% NBC : NO. OF POINTS ON BC OR X-AXIS
% ER : Dielectric parameter

for qq = 1:4
switch qq
case 1
W = 1; NMAX = 7; NBC = 5;
str = sprintf('\n\nW=H N Nx Ny Zo ');
disp(str)
case 2
W = 1; NMAX = 11; NBC = 8;
case 3
W =.5; NMAX = 7; NBC = 5;
case 4
W =.5; NMAX = 11; NBC = 8;
end

H = W;
W1 = 5.0;
ER = 1.0;
V0 = 1.0;
NCD = NMAX - NBC; % NO. OF POINTS ON DC OR Y-AXIS
DX = (W + W1)/NBC;
DY = H/NCD;
EPS = EO*ER;

% CALCULATE R & PHI FOR EACH POINT (X,Y)

for N = 1:NMAX
R(N) = sqrt( X(N)^2 + Y(N)^2 );
if (X(N))<0
PHI(N) = pi - atan( Y(N)/abs(X(N)) );
elseif X(N)==0
PHI(N) = pi/2;
elseif X(N)>0
PHI(N) = atan( Y(N)/X(N) );
end
end

% CALCULATE MATRICES F(I,J) AND B(I)

for I = 1:NMAX
B(I) = -V0;
M = 0;
for J = 1:NMAX
M = 2*J - 1;
FM = (M)/2.0;
if (I==NMAX)
CC = cos(PHI(I))*cos(PHI(I)*FM);
SS = sin(PHI(I))*sin(PHI(I)*FM);
F(I,J) = ( R(I)^(FM-1.) )*(CC + SS)*FM;
B(I) = 0.0;
else
F(I,J) = ( R(I)^(FM) )*cos(FM*PHI(I));
end
end
end

% DETERMINE THE EXPANSION COEFFICIENTS A(I)

IDM = 30;
F = inv(F);
for I = 1:NMAX
A(I) = 0.0;
for J = 1:NMAX
A(I) = A(I) + F(I,J)*B(J);
end
end

% NOW, CALCULATE CHARGE ON THE X-SIDE, i.e. BC

RHO = 0.0;
YC = H;
XC = -W - DX/2.0;
for I = 1:NBC
XC = XC + DX;
RC = sqrt(XC^2 + YC^2);
if(XC)<=0
PC = pi - atan(YC/abs(XC));
else
PC = atan(YC/XC);
end

for K = 1:NMAX
FK = (2*K - 1)/2.0;
RRO = sin(PC)*cos(FK*PC) - cos(PC)*sin(FK*PC);
RHO = RHO - A(K)*FK*(RC^(FK-1))*RRO*DX*EPS;
end
end

% NEXT, CALCULATE THE CHARGE ONT THE Y-SIDE, i.e. DC

XC = W1;
YC = -DY/2;
for I = 1:NCD
YC = YC + DY;
RC = sqrt(XC^2 + YC^2);
PC = atan(YC/XC);
for K = 1:NMAX
FK = (2*K - 1)/2;
RRO = cos(PC)*cos(FK*PC) + sin(PC)*sin(FK*PC);
RHO = RHO - A(K)*FK*(RC^(FK-1))*RRO*DY*EPS;
end
end

% CALCULATE THE CHARACTERISTIC IMPEDANCE Zo

Q = 4.0*RHO;
C = abs(Q)/V0;
Z0 = sqrt(ER)/( C*VL );
%disp([C,Z0])
%disp([W N NBC NCD C Z0])
str = sprintf('%3g %3g %3g %3g %g',W, N, NBC, NCD, Z0);
disp(str)
end

Fig. 4.7 Computer program for Example 4.11.

% *****************************************************************
% USING MOMENTS METHOD,
% THIS PROGRAM DETERMINES THE CHARACTERISTIC IMPEDANCE
% OF A STRIP TRANSMISSION LINE
% WITH CROSS-SECTION W X H
% THE STRIPS MAITAINED AT 1 VOLT AND -1 VOLT.
%
% ONE STRIP IS LOCATED ON THE Y = H/2 PLANE WHILE THE OTHER
% IS LOCATED ON THE Y = -H/2 PLANE.
%
% ALL DIMENSIONS ARE IS S.I. UNITS
%
% N IS THE NUMBER OF SUBSECTIONS INTO WHICH EACH STRIP IS
DIVIDED
% *****************************************************************

% FIRST, SPECIFY THE PARAMETERS

NN = [3 7 11 18 39 59];

disp(' ')
disp('n Zo')

for N = NN
CL=3.0e8; % SPEED OF LIGHT IN FREE SPACE
ER=1.0;
EO=8.8541878176E-12;
H=2.0;
W=5.0;

NT=2*N;
DELTA = W/(N);

% SECOND, CALCULATE THE MATCH POINTS


% AND THE COEFFICIENT MATRIX [A]

for K=1:N
X(K) = DELTA*(K - .5);
Y(K) = -H/2.0;
X(K+N) = X(K);
Y(K+N) = H/2.0;
end

FACTOR = DELTA/(2.0*pi*EO);

for I=1:NT
for J=1:NT
if(I==J) %eqn (5.98)
A(I,J) = -(log(DELTA) - 1.5)*FACTOR;
else
R = sqrt( (X(I) - X(J))^2 + (Y(I) - Y(J))^2 );
A(I,J) = -log(R)*FACTOR;
end
end
end

% NOW DETERMINE THE MATRIX OF CONSTANT VECTOR [B]

for K=1:N
B(K)=1.0;
%The line below was commented!
B(K+N)= -1.0; %rja -this line needed to be un-commented
end

% INVERT MATRIX A(I,J) AND CALCULATE MATRIX RO(N)


% CONSISTING OF THE UNKNOWN ELEMENTS
% ALSO CALCULATE THE TOTAL CHARGE Q,
% THE CAPACITANCE C, AND THE CHARACTERISTIC IMPEDANCE Zo.

NIV=NT;
NMAX=100;
A = inv(A);
for I=1:NT
RO(I)=0.0;
%The line below had an error N instead of NT
for M=1:NT
RO(I)=RO(I) + A(I,M)*B(M);
end
end
SUM=0.0;
for I=1:N
SUM = SUM + RO(I);
end
Q=SUM*DELTA;
VD=2.0;
C=abs(Q)/VD;
ZO = sqrt(ER)/(CL*C);

disp(num2str([N ZO ]))

end

Fig. 5.9 MATLAB program for Example 5.7.


%====================================================
% THIS PROGRAM CALCULATES THE SCATTERING PATTERN
% OF AN ARRAY OF PARALLEL WIRES
% ====================================================

clear; format compact;

thearray = 1; % thearray equals 1 for a plane array and 2 for a semicircular array

%PHIO and THETAO define the axis of propagation


THETAO = pi/2.0; %elevation angle pi/2
LAMBDA=1.0; %wavelength
EO = 1.0; %E field
R = 1.125*LAMBDA; %Radius of semicircle array
K = 2.0*pi/LAMBDA; %Propagation constant
AA = 0.05/K; %wire radius
S = 1.0/K; %wire spacing
H = K*cos(THETAO); %H & G are part of the incident wave definition
G = sqrt( K^2 - H^2 );

% DEFINE WIRE LOCATIONS


if thearray ==1
NN = 15; %Number of wires
PHIO = 40;
X = zeros(1,NN);
Y = linspace(-1,1,NN);
elseif thearray ==2
NN = 30;
PHIO = 0.0;
PHI2 = linspace(-pi/2,pi/2,NN);
X = R*cos(PHI2);
Y = R*sin(PHI2);
end
% CALCULATE RHO
[Mx,My]=meshgrid(X,Y);
RHO = sqrt((Mx-Mx').^2+(My-My').^2)+diag(AA*ones(1,NN));

% CONSTRUCT MATRIX [A]


A = besselh(0,2,G*RHO);

% CONSTRUCT MATRIX [B]


ALPHA = X*sin(THETAO)*cos(PHIO)+ Y*sin(THETAO)*sin(PHIO);
B = EO*exp( -i*K*ALPHA).';
% SOLVE FOR MATRIX[I] CONSISTING OF "MODIFIED CURRENT" OR
CURRENT COEFFICIENTS
A = inv(A);
I = A*B;

% FINALLY, CALCULATE THE SCATTERING PATTERN E(PHI)


PHI = linspace(0,pi,128);
ALP = cos(PHI.')*X + sin(PHI.')*Y;
E = abs(exp( i*G*ALP)*I);

% Plot E(PHI)
if thearray ==2
figure(1),plot(PHI*180/pi,E)
title('Scattering Pattern')
xlabel('\phi (Degrees)')
ylabel('E(\phi)')
grid on
elseif thearray ==1

% ang = PHI*180/pi-90;
% field = fftshift(E);

figure(2),plot(PHI*180/pi,E)
title('Example 5.8 compare to Fig. 5.16')
xlabel('\phi (Degrees)')
ylabel('E(\phi)')
grid on

end

Fig. 5.15 Computer program for Example 5.8.

%ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
% This program determines the power absorption of bilogical bodies.
% bodies are assumed to have the permeability of freespace
% eo = permittivity of free space
% er = relative permittivity of the body
% f = frequency in Hz, w in rad/s
% sig = conductivity
% xd, yd and zd have the x, y z coordiantes of the cells
% N is the number of cells
% Ei = incident electric field
% Rmn = distance between cell m and n.
% cxpmn and cxqmn = cos(theta_xp_mn) and cos(theta_xq_mn)
% We compute the 9 block matrices separately although one might have a
% function to that and combine them into the G matrix.
% For the diagonal blocks we compute the diagonal elements.
% for the off-diagonal blocks they are zeros.
clear all; close all
R=3e-2; H = R/4; an = H*(0.75/pi)^(1/3);
eo = 8.854e-12; muo = pi*4e-7;
f = 918e6; er = 35; sig=0.7;
w = 2*pi*f; ko = w*sqrt(muo*eo);
N=40; %

xd = [0.5*H*ones(1,8) 1.5*H*ones(1,6) 2.5*H*ones(1,4) 3.5*H 3.5*H ...


0.5*H*ones(1,6) 1.5*H*ones(1,4) 2.5*H*ones(1,2) ...
0.5*H*ones(1,4) 1.5*H*ones(1,2) ...
0.5*H*ones(1,2)];

yd= [0.5*H*ones(1,20) 1.5*H*ones(1,12) 2.5*H*ones(1,6)


3.5*H*ones(1,2)];

zd=[(3.5*H:-H:-3.5*H) (2.5*H:-H:-2.5*H) (1.5*H:-H:-1.5*H) 0.5*H -0.5*H


...
(2.5*H:-H:-2.5*H) (1.5*H:-H:-1.5*H) 0.5*H -0.5*H ...
(1.5*H:-H:-1.5*H) 0.5*H -0.5*H ...
0.5*H -0.5*H];
r=[xd(:) yd(:) zd(:)];

tow=[(sig+j*w*eo*(er-1))*ones(N,1)];

A=-j*w*muo*ko*H^3/4/pi;
C=-2*j*w*muo/3/ko^2*(exp(-j*ko*an)*(1+j*ko*an)-1)-1/3/j/w/eo;
Ei = [86.83*exp(-j*ko*zd(:));0*exp(-j*ko*zd(:));0*exp(-j*ko*zd(:))];

%Gxx
for m=1:N
for n=1:N
if m==n
Gxx(m,n) = C*tow(n)-1;
else
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,1)-r(n,1))/Rmn;
cxqmn =(r(m,1)-r(n,1))/Rmn;

B = (almn^2-1-j*almn)+cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gxx(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end
%Gyy
for m=1:N
for n=1:N
if m==n
Gyy(m,n) = C*tow(n)-1;
else
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,2)-r(n,2))/Rmn;
cxqmn =(r(m,2)-r(n,2))/Rmn;

B = (almn^2-1-j*almn)+cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gyy(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gzz
for m=1:N
for n=1:N
if m==n
Gzz(m,n) = C*tow(n)-1;
else
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,3)-r(n,3))/Rmn;
cxqmn =(r(m,3)-r(n,3))/Rmn;

B = (almn^2-1-j*almn)+cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gzz(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gxy
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,1)-r(n,1))/Rmn;
cxqmn =(r(m,2)-r(n,2))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gxy(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gxz
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,1)-r(n,1))/Rmn;
cxqmn =(r(m,3)-r(n,3))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gxz(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gyx
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,2)-r(n,2))/Rmn;
cxqmn =(r(m,1)-r(n,1))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gyx(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gyz
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,2)-r(n,2))/Rmn;
cxqmn =(r(m,3)-r(n,3))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gyz(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gzx
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,3)-r(n,3))/Rmn;
cxqmn =(r(m,1)-r(n,1))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gzx(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end

%Gzy
for m=1:N
for n=1:N
if m~=n
Rmn=norm(r(m,:)-r(n,:));
almn = ko*Rmn;
cxpmn =(r(m,3)-r(n,3))/Rmn;
cxqmn =(r(m,2)-r(n,2))/Rmn;

B = cxpmn*cxqmn*(3-almn^2+3*j*almn);
Gzy(m,n)= A* tow(n)*exp(-j*almn)/almn^3*B;
end
end
end
G = [Gxx Gxy Gxz;Gyx Gyy Gyz;Gzx Gzy Gzz];
E = -G\Ei;
Nx=[4 11 16 19];
Ny=[4 23 34 39];
Nz= 8:-1:1;;

Exaxis = (abs(E(Nx)).^2+abs(E(N+Nx)).^2+abs(E(2*N+Nx)).^2);
Exaxis = [Exaxis(4:-1:1);Exaxis];
Eyaxis = (abs(E(Ny)).^2+abs(E(N+Ny)).^2+abs(E(2*N+Ny)).^2);
Eyaxis = [Eyaxis(4:-1:1);Eyaxis];
Ezaxis = 2*(abs(E(Nz)).^2+abs(E(N+Nz)).^2+abs(E(2*N+Nz)).^2);

EMAX=max([Exaxis;Eyaxis;Ezaxis]);
Exaxis=Exaxis/EMAX;
Eyaxis=Eyaxis/EMAX;
Ezaxis=Ezaxis/EMAX;
pd=(-2.625:.75:2.625);
plot(pd,Exaxis,'ok');hold on
plot(pd,Eyaxis,'ok','MarkerFaceColor','k');
plot(pd,Ezaxis,'sk');
pdi=(-2.625:5.25/199:2.625);
Exaxisi=interp1(pd,Exaxis,pdi,'spline');
Eyaxisi=interp1(pd,Eyaxis,pdi,'spline');
Ezaxisi=interp1(pd,Ezaxis,pdi,'spline');
plot(pdi,Exaxisi,'k','LineWidth',2);
plot(pdi,Eyaxisi,'-.k','LineWidth',2);
plot(pdi,Ezaxisi,':k','LineWidth',2);
xlabel('cm','FontSize',12)
axis([-3 3 0 1.1]);grid
text(-1.5,.28,'y')
text(-1.5,.45,'z')
text(-1.5,.92,'x')

Fig. 5.26 Computer program for Example 5.11.

%OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
% FINITE ELEMENT SOLUTION OF LAPLACE'S EQUATION FOR
% TWO-DIMENSIONAL PROBLEMS
% TRIANGULAR ELEMENTS ARE USED
%
% THE UNKNOWN POTENTIALS ARE OBTAINED USING
% ITERATION METHOD
%
% ND = NO. OF NODES
% NE = NO. OF ELEMENTS
% NP = NO. OF FIXED NODES (WHERE POTENTIAL IS PRESCRIBED)
% NDP(I) = NODE NO. OF PRESCRIBED POTENTIAL, I = 1,2,...NP
% VAL(I)) = VALUE OF PRESCRIBED POTENTIAL AT NODE NDP(I)
% NL(I,J) = LIST OF NODES FOR EACH ELEMENT I, WHERE
% LF(I) = LIST OF FREE NODES I = 1,2,...,NF=ND-NP
% J = 1, 2, 3 IS THE LOCAL NODE NUMBER
% CE(I,J) = ELEMENT COEFFICIENT MATRIX
% ER(I) = VALUE OF THE RELATIVE PERMITTIVITY FOR ELEMENT I
% C(I,J) = GLOBAL COEFFICIENT MATRIX
% X(I), Y(I) = GLOBAL COORDINATES OF NODE I
% XL(J), YL(J) = LOCAL COORDINATES OF NODE J = 1,2,3
% V(I) = POTENTIAL AT NODE I
% MATRICES P(I) AND Q(I) ARE DEFINED IN EQ.(6.1.1)

% ***************************************************
% FIRST STEP - INPUT DATA DEFINING GEOMETRY AND
% BOUNDARY CONDITIONS
% ***************************************************
clear;
NI = 50; %! NO. OF ITERATIONS
NE=25; %Number of Elements
ND=21;
NP=15;

X = [0 0.2 0.4 0.6 0.8 1.0 0 0.2 0.4 0.6 0.8 0 0.2 0.4 0.6 0 0.2 0.4 0 0.2 0];
Y = [0 0 0 0 0 0 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.4 0.6 0.6 0.6 0.8 0.8 1.0];

NDP = [1 2 3 4 5 6 7 11 12 15 16 18 19 20 21];
VAL = [0 0 0 0 0 50 0 100 0 100 0 100 0 100 50];

NL = [ 1 2 7 ;2 8 7;2 3 8; 3 9 8; 3 4 9; 4 10 9; 4 5 10; 5 11 10; 5 6 11;...


7 8 12;8 13 12; 8 9 13;9 14 13;9 10 14; 10 15 14; 10 11 15;...
12 13 16; 13 17 16; 13 14 17; 14 18 17; 14 15 18; 16 17 19; 17 20 19; 17 18 20; 19 20
21];

EO = 1.0E-9/(36.0*pi);
ER = ones(1,NE);
% ***************************************************
% SECOND STEP - EVALUATE COEFFICIENT MATRIX FOR EACH
% ELEMENT AND ASSEMBLE GLOBALLY
% ***************************************************
C = zeros(ND,ND);
for I = 1: NE
% FIND LOCAL COORDINATES XL, YL FOR ELEMENT I
XL = X(NL(I,:));
YL = Y(NL(I,:));

P = [YL(2) - YL(3),YL(3) - YL(1),YL(1) - YL(2)];


Q = [XL(3) - XL(2),XL(1) - XL(3),XL(2) - XL(1)];
AREA = 0.5*abs( P(2)*Q(3) - Q(2)*P(3) );
% DETERMINE COEFFICIENT MATRIX FOR ELEMENT I
CE = ER(I)*(P'*P+Q'*Q)/(4*AREA);
% ASSEMBLE GLOBALLY - FIND C(I,J)
J=1:3;
L=1:3;
IR = NL(I,J);
IC = NL(I,L);
C(IR,IC) = C(IR,IC) + CE(J,L);
end

% *************************************************
% THIRD STEP - SOLVE THE RESULTING SYSTEM
% ITERATIVELY
% *************************************************
%
% DETERMINE LF - LIST OF FREE NODES
LF = setdiff(1:ND, NDP);
V = zeros(1,ND);
V(NDP) = VAL;
NF = length(LF);

for N = 1:NI
for ii = 1:NF
rowC = C(LF(ii),:);
rowC(LF(ii)) = 0;
V(LF(ii)) = -1/(C(LF(ii),LF(ii)))*rowC*V.';
end
figure(1),stem(V),drawnow
end

disp([{'Node','X','Y','Potential'};num2cell([(1:ND)',X',Y',V'])]);

Fig. 6.10 Computer program for Example 6.2.

clear;
% *****************************************************
% FINITE ELEMENT SOLUTION OF THE WAVE EQUATION
% TRIANGULAR ELEMENTS ARE USED
%
% ND = NO. OF NODES
% NE = NO. OF ELEMENTS
% NL(I,J) = LIST OF NODES FOR EACH ELEMENT I, WHERE
% CE(I,J) = ELEMENT COEFFICIENT MATRIX
% C(I,J) = GLOBAL COEFFICIENT MATRIX
% X(I), Y(I) = GLOBAL COORDINATES OF NODE I
% XL(J), YL(J) = LOCAL COORDINATES OF NODE J = 1,2,3
% MATRICES P(I) AND Q(I) ARE DEFINED IN
% LF(I) = LIST OF FREE NODES
% ALAM(I) = CONTAINS EIGENVALUES

% ***************************************************
% FIRST STEP - INPUT DATA DEFINING GEOMETRY AND
% BOUNDARY CONDITIONS (USE SUBROUTINE GRID)
% ***************************************************

NX = 10;
select = 1; %select=1 for square, select=2 for rectangular

if select == 1 %For Square Waveguide


NY = 1*NX; AA = 1.0; BB = 1.0;
else %For Rectangular Waveguide
NY = 2.0*NX; AA = 1.0; BB = 2.0;
end

DELTAX = AA/NX;
DELTAY = BB/NY;
DX = ones(1,NX)*DELTAX;
DY = ones(1,NY)*DELTAY;

[NE,ND,NP,NL,X,Y,NDP]=gridmesh(NX,NY,DX,DY);

% Plot Mesh - Grab X and Y values of element nodes. Note: inserting NaN
% keeps the plot function from connecting different elements together!
mx = reshape([X([NL,NL(:,1)]),NaN*zeros(NE,1)]',1,NE*5);
my = reshape([Y([NL,NL(:,1)]),NaN*zeros(NE,1)]',1,NE*5);

figure(2),plot(X,Y,'o',mx,my,':'),xlabel('x'), ylabel('y')

% ***************************************************
% SECOND STEP - EVALUATE COEFFICIENT MATRIX FOR EACH
% ELEMENT AND ASSEMBLE GLOBALLY
% ***************************************************

C = zeros(ND,ND);
T = zeros(ND,ND);

for I = 1: NE
% FIND LOCAL COORDINATES XL, YL FOR ELEMENT I
XL = X(NL(I,:));
YL = Y(NL(I,:));
P = [YL(2) - YL(3),YL(3) - YL(1),YL(1) - YL(2)];
Q = [XL(3) - XL(2),XL(1) - XL(3),XL(2) - XL(1)];
AREA = 0.5*abs( P(2)*Q(3) - Q(2)*P(3) );

% DETERMINE COEFFICIENT MATRIX FOR ELEMENT I


CE = (P'*P+Q'*Q)/(4*AREA);

% ASSEMBLE GLOBALLY - FIND C(I,J) AND T(I,J)


J=1:3; L=1:3;
IR = NL(I,J);
IC = NL(I,L);
C(IR,IC) = C(IR,IC) + CE(J,L);
T(IR,IC) = T(IR,IC) + AREA/12*[2 1 1;1 2 1;1 1 2];
end

% *************************************************
% THIRD STEP - SOLVE THE RESULTING SYSTEM
% *************************************************
% DETERMINE LF(I) - LIST OF FREE NODES

LF = setdiff(1:ND, NDP);
NF = length(LF);

% FROM GLOBAL C AND T, FIND C_ff AND T_ff (f for free nodes)
C_ff = C(LF,LF);
T_ff = T(LF,LF);

A = inv(T_ff)*C_ff;

ALAM = eig(A);
% *************************************************
% FOURTH STEP - OUTPUT THE RESULTS
% *************************************************

Kcalc = sqrt(min(ALAM));

Kc = sqrt( (pi/AA)^2+(pi/BB)^2 );
theerror = 100*(Kcalc-Kc)/Kc;

s1 = sprintf('\n Nx Ne Kcalc %% error');


s2 = sprintf('\n %-3.5g %-3.5g %-6.5g %-3.5g',NX,NE,Kcalc,theerror);

disp([s1,s2])

Fig. 6.11 Computer program for Example 6.3.

function [NE,ND,NP,NL,X,Y,NDP]=gridmesh(NX,NY,DX,DY)
% function [NE,ND,NP,NL,X,Y,NDP]=gridmesh(NX,NY,DX,DY)
% ******************************************************
% THIS PROGRAM DIVIDES A RECTANGULAR DOMAIN INTO
% TRIANGULAR ELEMENTS (NY BY NY NONUNIFORM
% MESH IN GENERAL)
% NX & NY ARE THE NUMBER OF SUBDIVISIONS ALONG X & Y AXES
% NE = NO. OF ELEMENTS IN THE MESH
% ND = NO. OF NODES IN THE MESH
% NP = NO. OF BOUNDARY (PRESCRIBED) NODES
% X(I) & Y(I) ARE GLOBAL COORDINATES OF NODE I
% DX(I) & DY(I) ARE DISTANCES BETWEEN NODES ALONG X & Y AXES
% NL(I,J) IS THE LIST OF NODES FOR ELEMENT I, J = 1, 2, 3 ARE
% LOCAL NUMBERS
% NDP(I) = LIST OF PRESCRIBED NODES I
%
% REF: J. N. REDDY, “AN INTRODUCTION TO THE FINITE ELEMENT
% METHOD.” NEW YORK: MCGRAW-HILL, 1984, P. 436

% CALCULATE NE, ND, AND NP


NE = 2*NX*NY; %Number of elements
NP = 2*(NX + NY); %Number of prescribed nodes (edges)
NX1 = NX+1; %Number of nodes in the X direction
NY1 = NY +1; %Number of nodes in the Y direction
ND = NX1 * NY1; %Number of nodes in mesh

% Determine Node List which follows a regular pattern utilized below.


NL1 = 1:(NX1*NY);
NL1(NX1:NX1:end) = [];

NL3 = (NX+2):(NX+NX1*NY+1);
NL3(NX1:NX1:end) = [];

NL = zeros(NE,3);
NL(1:2:end,1) = NL1;
NL(2:2:end,1) = NL1;
NL(1:2:end,2) = NL3+1;
NL(2:2:end,2) = NL1+1;
NL(1:2:end,3) = NL3;
NL(2:2:end,3) = NL3+1;

% DETERMINE X AND Y (look saw tooth waves)


x1 = [0 cumsum(DX)]'*ones(1,NY1);
X = reshape(x1,1,numel(x1));

y1 = ones(NX1,1)*[0 cumsum(DY)];
Y = reshape(y1,1,numel(y1));
% DETERMINE NDP, [bottom, right, top, left]
NDP = [1:(NX1) , 2*(NX1):(NX1):ND , (ND-1):-1:(ND-NX) , ((ND-2*NX-1)):-(NX1):
(NX+2)];

Fig. 6.13 Program GRID.

function ch6_FIG6_16

fd=inline('ddiff( dunion(drectangle(p,0,5,0,10),drectangle(p,5,8,5,10)) ,dcircle(p,2.5,7.5,


1.5) )','p');

box=[-.1 -.1; 8.1 10.1];


fix=[0 0; 0 5; 0 10; 5 0; 5 5; 5 10; 8 5; 8 10];
[p,t]=distmesh2d(fd,@huniform,0.7,box,fix);
disp('Mesh Complete')

function [p,t]=distmesh2d(fd,fh,h0,bbox,pfix,varargin)
%DISTMESH2D 2-D Mesh Generator using Distance Functions.
% [P,T]=DISTMESH2D(FD,FH,H0,BBOX,PFIX,FPARAMS)
%
% P: Node positions (Nx2)
% T: Triangle indices (NTx3)
% FD: Distance function d(x,y)
% FH: Scaled edge length function h(x,y)
% H0: Initial edge length
% BBOX: Bounding box [xmin,ymin; xmax,ymax]
% PFIX: Fixed node positions (NFIXx2)
% FPARAMS: Additional parameters passed to FD and FH
%
% Example: (Uniform Mesh on Unit Circle)
% fd=inline('sqrt(sum(p.^2,2))-1','p');
% [p,t]=distmesh2d(fd,@huniform,0.2,[-1,-1;1,1],[]);
%
% Example: (Rectangle with circular hole, refined at circle boundary)
% fd=inline('ddiff(drectangle(p,-1,1,-1,1),dcircle(p,0,0,0.5))','p');
% fh=inline('min(4*sqrt(sum(p.^2,2))-1,2)','p');
% [p,t]=distmesh2d(fd,fh,0.05,[-1,-1;1,1],[-1,-1;-1,1;1,-1;1,1]);
%
% See also: MESHDEMO2D, DISTMESHND, DELAUNAYN, TRIMESH.

% Copyright (C) 2004-2006 Per-Olof Persson.

dptol=.001; ttol=.1; Fscale=1.2; deltat=.2; geps=.001*h0; deps=sqrt(eps)*h0;


% 1. Create initial distribution in bounding box (equilateral triangles)
[x,y]=meshgrid(bbox(1,1):h0:bbox(2,1),bbox(1,2):h0*sqrt(3)/2:bbox(2,2));
x(2:2:end,:)=x(2:2:end,:)+h0/2; % Shift even rows
p=[x(:),y(:)]; % List of node coordinates

% 2. Remove points outside the region, apply the rejection method


p=p(feval(fd,p,varargin{:})<geps,:); % Keep only d<0 points
r0=1./feval(fh,p,varargin{:}).^2; % Probability to keep point
p=[pfix; p(rand(size(p,1),1)<r0./max(r0),:)]; % Rejection method
N=size(p,1); % Number of points N

pold=inf; % For first iteration


while 1
% 3. Retriangulation by the Delaunay algorithm
if max(sqrt(sum((p-pold).^2,2))/h0)>ttol % Any large movement?
pold=p; % Save current positions
t=delaunayn(p); % List of triangles
pmid=(p(t(:,1),:)+p(t(:,2),:)+p(t(:,3),:))/3; % Compute centroids
t=t(feval(fd,pmid,varargin{:})<-geps,:); % Keep interior triangles
% 4. Describe each bar by a unique pair of nodes
bars=[t(:,[1,2]);t(:,[1,3]);t(:,[2,3])]; % Interior bars duplicated
bars=unique(sort(bars,2),'rows'); % Bars as node pairs
% 5. Graphical output of the current mesh
trimesh(t,p(:,1),p(:,2),zeros(N,1))
view(2),axis equal,axis off,drawnow
end

% 6. Move mesh points based on bar lengths L and forces F


barvec=p(bars(:,1),:)-p(bars(:,2),:); % List of bar vectors
L=sqrt(sum(barvec.^2,2)); % L = Bar lengths
hbars=feval(fh,(p(bars(:,1),:)+p(bars(:,2),:))/2,varargin{:});
L0=hbars*Fscale*sqrt(sum(L.^2)/sum(hbars.^2)); % L0 = Desired lengths
F=max(L0-L,0); % Bar forces (scalars)
Fvec=F./L*[1,1].*barvec; % Bar forces (x,y components)
Ftot=full(sparse(bars(:,[1,1,2,2]),ones(size(F))*[1,2,1,2],[Fvec,-Fvec],N,2));
Ftot(1:size(pfix,1),:)=0; % Force = 0 at fixed points
p=p+deltat*Ftot; % Update node positions

% 7. Bring outside points back to the boundary


d=feval(fd,p,varargin{:}); ix=d>0; % Find points outside (d>0)
dgradx=(feval(fd,[p(ix,1)+deps,p(ix,2)],varargin{:})-d(ix))/deps; % Numerical
dgrady=(feval(fd,[p(ix,1),p(ix,2)+deps],varargin{:})-d(ix))/deps; % gradient
p(ix,:)=p(ix,:)-[d(ix).*dgradx,d(ix).*dgrady]; % Project back to boundary

% 8. Termination criterion: All interior nodes move less than dptol (scaled)
if max(sqrt(sum(deltat*Ftot(d<-geps,:).^2,2))/h0)<dptol, break; end
end

function h=huniform(p,varargin)
h=ones(size(p,1),1);

(a)

function d=drectangle(p,x1,x2,y1,y2)

d=-min(min(min(-y1+p(:,2),y2-p(:,2)),-x1+p(:,1)),x2-p(:,1));

function d=dcirc(p,xc,yc,r)

d=sqrt((p(:,1)-xc).^2+(p(:,2)-yc).^2)-r;

function d=dunion(d1,d2), d=min(d1,d2);

function d=ddiff(d1,d2), d=max(d1,-d2);

(b)

Fig. 6.16 MATLAB code for automatic mesh generation: (a) main program, (b)
functions that the main function will need.

%=============================================================
% USING THE TLM METHOD, THIS PROGRAM CALCULATES THE RELATIVE
% CURRENT DENSITY JR IN A ROUND COPPER WIRE
% THE EXACT SOLUTION JRE IS ALSO INCLUDED
% =============================================================

clear

% SPECIFY INPUT DATA

F = 1.0E+9;
SIGMA = 5.8E+7;
PIE = 4.0*atan(1.0);
MIU = 4.0*PIE*1.0E-7;
OMEGA = 2.0*PIE*F;
DELTA = sqrt( 2.0/(SIGMA*MIU*OMEGA) );
H = 0.1*DELTA;
A = 4.0*DELTA;
NMAX = A/H;

% INITIALIZE AND CALCULATE RELATIVE CURRENT DENSITY JR USING


TLM

V(1) = 0;
V(2) = 0.1*(SIGMA*( (1) - 0.5 )*(H^2));

for N = 3:NMAX+1
V(N) = (SIGMA*(N-1-0.5)*H^2)/(SIGMA*(N-2-0.5)*H^2) *( V(N-1) - V(N-2) )...
+ i*((OMEGA*MIU/(N-2)))*(SIGMA*(N-1-0.5)*H^2)*V(N-1) + V(N-1);
end

N = 2:NMAX+1;
I = ( V(N) - V(N-1) )./(SIGMA*(N-1-0.5)*H^2);
JR = abs(I/I(NMAX));

% CALCULATE THE CURRENT DENSITY JRE FROM THE EXACT SOLUTION

K = 0:20;
NRO = 1:NMAX;
X = ( (NRO)/(NMAX) )*A*sqrt(2.0)/DELTA;
[K2,X2] = meshgrid(K,X);

FB = ( (X2/2).^(2*K2) )./(factorial(K2).^2);
BEO = FB*exp(i*K*pi/2).';

JRE = abs(BEO);
JRE = JRE/JRE(NMAX); % RELATIVE CURRENT DENSITY

RHO = (1:NMAX)/(NMAX);

%Output Result

disp(sprintf('\n%s %s %s','RADIAL POSITION','TLM J','EXACT J'));

for N=4:4:NMAX
s2 = sprintf('%10g %16g %12g',RHO(N), JR(N), JRE(N));
disp(s2)
end

figure(1),plot(RHO,JR,RHO,JRE)
ylabel('Relative current Density');
xlabel('Radial position')
Fig. 7.7 Computer program for Example 7.1.

clear
% *****************************************************************
% THIS PROGRAM APPLIES THE TLM METHOD TO SOLVE
% ONE-DIMENSIONAL WAVE PROBLEMS. THE SPECIFIC EXAMPLE
% SOLVED HERE IS DESCRIBED AS FOLLOWS:-
%
% THE TEM WAVES ON A 25 x 11 MATRIX
% THE BOUNDARES AT ARE AT X = 2 AND X = 10
% INITIAL IMPULSE EXCITATION IS ALONG Z=4 AT t = 0
% AND SUBSEQUENTLY THIS LINE IS SET TO ZERO. THE GRID
% IS TERMINATED AT Z=25. OUTPUT IS TAKEN AT Z = 14,
% X = 6 FOR Ey AND Hx FOR 100,150,200 ITERATIONS
% VI(IT,I,J,K) -- ARRAY FOR INCIDENT VOLTAGE
% VR(IT,I,J,K) -- ARRAY FOR REFLECTED VOLTAGE
% IT = 1 -- FOR PREVIOUS PULSE VALUE
% =2 -- FOR CURRENT PULSE VALUE
% I,J -- CORRESPOND TO NODE LOCATION (Z,X)
% K = 1..4 -- FOR TERMINALS
% NX -- INDEX OF NODES IN X-DIRECTION
% NZ -- INDEX OF NODES IN Z-DIRECTION
% NX/NZ B,E -- INDEX OF BEGINNING, END NODE
% NX/NX O -- INDEX OF OUTPUT NODE
% GAMMA -- RELFLECTION COEFFICIENT AT THE BOUNDARY C
% DELTA -- MESH SIZE DIVIDED BY LAMBA
% ITRATE -- NO. OF ITERATIONS
% *****************************************************************

VI = zeros(2,25,11,4); VR = zeros(2,25,11,4);
EFI = zeros(1,20); EFR = zeros(1,20);
HFI = zeros(1,20); HFR = zeros(1,20);

CEF = zeros(1,20); CHF = zeros(1,20);


OUT = zeros(20,9);

NXB=2;NXE=10;NZB=4;NZE=24;NT=4;ITRATE=200;
NXO=6;NZO=14;PIE=3.1415927;GAMMA=0;DELTA=.002;

% STEP #1 *********************************************************

% INSERT INITIAL PUSLE EXCITATION ALONG LINE Z = 4


VI(1,NZB+1,NXB:NXE,2) = 1.0;

% STEP #2 *********************************************************

% UsinG EQS. (7.40) TO (7.42), CALCULATE THE


% REFLECTED VOLTAGE AND SUBMIT IT DIRECTLY
% TO THE NEIGHBORING NODE.

K = 1:20; II = 0;
DEL = DELTA:DELTA:DELTA*20;
OUT(:,1) = DEL;

for ITIME = 1: ITRATE


IT = 2;
for I = (NZB+1):NZE
for J = NXB:NXE

VR(IT,I,J,1:NT) = 0.5*sum(VI(IT-1,I,J,1:NT)) - VI(IT-1,I,J,1:NT);

VI(IT,I,J-1,3) = VR(IT,I,J,1);
VI(IT,I-1,J,4) = VR(IT,I,J,2);
VI(IT,I,J+1,1) = VR(IT,I,J,3);
VI(IT,I+1,J,2) = VR(IT,I,J,4);

% STEP #3 *********************************************************

% UsinG EQS. (7.43) AND (7.44), INSERT BOUNDARY CONDITIONS

if (J==NXE), VI(IT,I,NXE,3) = VR(IT,I,NXE,1); end


if (J==NXB), VI(IT,I,NXB,1) = VR(IT,I,NXB,3); end
if (I==NZE), VI(IT,NZE,J,4) = GAMMA*VR(IT,NZE,J,4); end
end
end

% STEP #4 *********************************************************

% UsinG EQS. (7.46) - (7.49), CALCULATE IMPULSE RESPONSE


% OF Ey and Hx AT Z=NZO,X=NXO

EI = sum(VI(IT,NZO,NXO,1:NT)) * 0.5;
HI = VI(IT,NZO,NXO,2) - VI(IT,NZO,NXO,4);

% SUM THE FREQUENCY RESPONSE FOR DIFFERENT VALUES OF MESH-SIZE


DIVIDED
% BY WAVELENGTH
CEF = CEF + EI*exp(j*2*pi*ITIME*DEL); %Complex E Field
CHF = CHF + HI*exp(j*2*pi*ITIME*DEL); %Complex H Field

% SAVE THE CURRENT PULSE MAGNITUDE FOR NEXT ITERATION

VI(IT-1,:,:,:) = VI(IT,:,:,:);
VR(IT-1,:,:,:) = VR(IT,:,:,:);

IT = ITIME;
if((IT==100)||(IT==150)||(IT==200))
II = II + 2;
% STEP #5 *********************************************************

% CALCULATE MAGNITUDE & ARGUMENT OF IMPEDANCE


OUT(K,II) = abs(CEF)./abs(CHF); % MAGNITUDE
ZARG = CEF./CHF;
OUT(K,II+1) = -atan(imag(ZARG)./real(ZARG));
end
end

% STEP #6 *********************************************************

% CALCULATE EXACT VALUE OF IMPEDANCE [REF. 13]

R2 = 1./(pi*DEL./(asin(sqrt(2).*sin(pi*DEL))));
R3 = tan(21.0*R2*pi.*DEL);
CNUM = R2+R3*i;
CDEM = 1 + j*real(CNUM).*imag(CNUM);
OUT(K,8) = abs(CNUM)./(abs(CDEM).*real(CNUM));
ZARG = CNUM./CDEM;
OUT(K,9) = atan(imag(ZARG)./real(ZARG));
% END

% disp('Compare to Table 7.2')


% disp(OUT(1:9,:))

hdr2 = {'','|Z|','Arg(Z)','|Z|','Arg(Z)','|Z|','Arg(Z)','|Z|','Arg(Z)'};
hdr3 = {'iteration','100','','150','','200','','Exact',''};
disp([hdr3;hdr2;num2cell(OUT(1:9,:))])

Fig. 7.14 Computer program for Example 7.2.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
:
:
:

DATA NXB,NXE,NZB,NZE,NT,ITRATE/2,10,2,24,4,200/
DATA NXO,NZO,PIE,GAMMA,DELTA/6,12,3.1415927,0,.02/

:
:
:

C STEP #3 ********************************************
C USING EQS. (7.43) AND (7.44), INSERT BOUNDARY
CONDITIONS
C
IF(J .EQ. NXE)VI(IT,I,NXE,3)= - VR(IT,I,NXE,1)
IF(J .EQ. NXB)VI(IT,I,NXB,1)=VR(IT,I,NXB,1)
IF(I .EQ. NZE)VI(IT,NZE,J,4)=GAMMA*VR(IT,NZE,J,4)

:
:
:

70 DEL = DEL + 0.001

:
:
:

(in Fortran)
Fig. 7.15 Modification in the program in Fig. 7.14 for simulating waveguide
problem in Example 7.3.

clear
% =======================================================
% THIS PROGRAM SOLVES A TYPICAL TWO-DIMENSIONAL
% WAVE PROPOGATION PROBLEM AT STATED BELOW:
% A WAVE GUIDE 6cm X 13cm IS FILLED WITH A
% DIELECTRIC OF RELATIVE PERMITTIVITY EQUAL TO 4.9
% AND CONDUCTIVITY 0.05 MHO/M. THIS GEOMETRY IS
% BEING SIMULATED ON A MATRIX OF 12 X 26 NODES
% THE MATRIX WAS EXCITED AT ALL POINTS ALONG THE
% LINE Z = 1 WITH IMPULSES CORRESPONDING TO Ey.
% THE IMPLUSE FUNCTION OF THE OUTPUT WAS TAKEN FROM
% THE POINT (Z = 6, X=6) AFTER 750 ITERATIONS.
% THE BOUNDARIES WERE SHORT CIRCUITED AT X = 0.5
% AND X = 12.5 AND TERMINATED AT Z = 26.5 IN AN
% OPEN CIRCUIT DISCONTINUITY.
% VI -- ARRAY FOR INCIDENT VOLTAGE
% VR -- ARRAY FOR REFLECTED VOLTAGE
% NX -- INDEX OF NODES IN X-DIRECTION
% NZ -- INDEX OF NODES IN Z-DIRECTION
% RO -- REFLECTION COEFFICIENT
% DELTA -- MESH SIZE (SPACING)
% DELTA -- MESH SIZE DIVIDED BY LAMBDA

VI=zeros(2,27,13,5);
VR=zeros(2,27,13,5);
EFI=zeros(1,50);
EFR=zeros(1,50);
HFI=zeros(1,50);
HFR=zeros(1,50);
NXB=1;
NXE=12;
NZB=1;
NZE=26;
NT=5;
ITRATE=750;
NXI=0;
NZI=1;
NXO=6;
NZO=6;
RoS=-1;
RoC=1;
Eo=8.854E-12;
Er=4.9;
SIGMA=0.05;
DELTA=0.005;

Yo = 4.0 * (Er/2 -1);


Ur = 1.0;
Uo = 4.0 * pi * 1.0E-07;
Go = SIGMA * DELTA * sqrt( Uo/Eo );
Y = 4.0 + Yo + Go;

% SINCE REFLECTION COEFFICIENT, RO, DEPENDS ON


% FREQUENCY, THE ITERATIONS MUST BE REPEATED FOR
% EACH VALUE OF THE MESH-SIZE DIVIDED BY WAVELENGTH.

DELTA = 0.0;
for L = 1:10
DELTA = DELTA + 0.003;

% INITIALIZE ALL NODES (BOTH FREE AND FIXED)


VI = zeros(2,NZE,NXE,NT);
VR = zeros(2,NZE,NXE,NT);

% START THE ITERATION


for ITime = 0: ITRATE

IT = 1;
for I = NZB: NZE
for J = NXB: NXE
SUM = 0.0;
for K = 1:4
SUM = SUM + VI(IT-1+1,I,J,K);
end
SUM = (SUM + Yo*VI(IT-1+1,I,J,5)) * 2/Y;

% INSERT THE INITIAL CONDITION AT I = 1

if ((ITime==0)&&(I==NZI)), SUM = 1.0; end

for K = 1: NT
VR(IT+1,I,J,K) = SUM - VI(IT-1+1,I,J,K);
end

if (J~=NXB), VI(IT+1,I,J-1,3) = VR(IT+1,I,J,1);end


if (I~=NZB), VI(IT+1,I-1,J,4) = VR(IT+1,I,J,2);end
if (J~=NXE), VI(IT+1,I,J+1,1) = VR(IT+1,I,J,3);end
if (I~=NZE), VI(IT+1,I+1,J,2) = VR(IT+1,I,J,4);end
VI (IT+1,I,J,5) = VR(IT+1,I,J,5);

% INSERT THE BOUNDARY CONDITIONS


% FOR THE SHORT CIRCUIT AT X = 0.5
if (J==NXB), VI(IT+1,I,1,1) = RoS*VR(IT+1,I,1,1);end

% FOR THE SHORT CIRCUIT AT X = 12.5


if (J==NXE), VI(IT+1,I,J,3) = RoS*VR(IT+1,I,J,3);end

% FOR THE OPEN CIRCUIT DISCONTINUITY AT Z = 26.5


if (I==NZE), VI(IT+1,I,J,4) = RoC*VR(IT+1,I,J,4);end

end
end

% IN ORDER TO CONSERVE SPACE, THE ARRAYS


% HAVE TO BE UPDATED

VI(IT-1+1,1:NZE,1:NXE,1:NT) = VI(IT+1,1:NZE,1:NXE,1:NT);
VR(IT-1+1,1:NZE,1:NXE,1:NT) = VR(IT+1,1:NZE,1:NXE,1:NT);

% CALCULATE IMPULSE RESPONCE AT Z=NZO, X=NXO


EI = (sum(VI(IT+1,NZO,NXO,1:4)) + Yo * VI(IT+1,NZO,NXO,5)) * 2.0/Y;
HI = -(VI(IT+1,NZO,NXO,2)-VI(IT+1,NZO,NXO,4));

% SUM THE FREQUENCY RESPONSE (imaginary and


% real parts) FOR DIFFERENT VALUES OF
% MESH-SIZE DIVIDED BY WAVELENGTH

T = (ITime);
EFI(L) = EFI(L)+EI*sin(2.0 * pi * T * DELTA);
EFR(L) = EFR(L)+EI*cos(2.0 * pi * T * DELTA);
HFI(L) = HFI(L)+HI*sin(2.0 * pi * T * DELTA);
HFR(L) = HFR(L)+HI*cos(2.0 * pi * T * DELTA);
OUT(L,1) = DELTA;
if (ITime==ITRATE)
CEF = EFR(L)+EFI(L)*i;
CHF = HFR(L)+HFI(L)*i;
OUT(L,2) = abs(CEF)/abs(CHF);

% CALCULATE ARGUMENT Z

ZARG = CEF/CHF;
XZ = real(ZARG);
YZ = imag(ZARG);
XYZ = YZ / XZ;
OUT(L,3) = -atan(XYZ);
end
end
end

format short g
disp(' DELTA |Z| Arg(Z)')
disp(OUT)

Fig. 7.19 Computer program for Example 7.4.

C********************************************************
C THIS PROGRAM ANLYSIZES THREE-DIMENSIONAL WAVE PROBLEMS
C USING THE TLM METHOD
C THE SPECIFIC EXAMPLE SOLVED HERE IS THE DETERMINATION
C OF THE TM DOMINANT NODE OF RECTANGULAR LOSSLESS CAVITY
C OF DIMENSION 12 X 8 X 6
C E ... E - field
C H ... H - field
C X ... X - component
C Y ... Y - component
C Z ... Z - component
C I ... incident impulse
C R ... reflected impulse
C NX ... number of nodes in X-direction
C NY ... number of nodes in Y-direction
C NZ ... number of nodes in Z-direction
C SHUNT and SERIES ... scatterring matrix
C DELTA = DELTAL/LAMDA (FREE SPACE)

IMPLICIT REAL*8(A,B,D-H,O-Z),COMPLEX*8(C),
1 INTEGER*2(I-N)
DIMENSION EXR(2,7,9,13,5), EXI(2,7,9,13,5),
1 EYR(2,7,9,13,5), EYI(2,7,9,13,5),
2 EZR(2,7,9,13,5), EZI(2,7,9,13,5),
3 HXR(2,7,9,13,5), HXI(2,7,9,13,5),
4 HYR(2,7,9,13,5), HYI(2,7,9,13,5),
5 HZR(2,7,9,13,5), HZI(2,7,9,13,5),
6 EX(2,1000),EY(2,1000),EZ(2,1000),
7 HX(2,1000),HY(2,1000),HZ(2,1000),
8 OUT(12,1000),SHUNT(5,5),SERIES(5,5)

COMMON / PART1 /NT,NXB,NXE,NYB,NYE,NZB,NZE,IT


SQMAG(CM) = ( CABS(CM) ) ** 2
DATA ITRATE,NXB,NXE,NYB,NYE,NZB,NZE,NT,DELTAL
1 /1000, 1, 12, 1, 8, 1, 6, 4, 1.0/
DATA NXI,NYI,NZI,NXO,NYO,NZO,RoH,NUMPT,DEL
1 /11, 7, 0, 2, 2, 2,-1.0,1000,0.0001/
DATA PI, Eo, Er, Ur,SIGMA,DELTA
1 /3.1415927,8.854E-12,1.0,1.0,0.0,0.01 /
DATA SERIES /-1.0,1.0,1.0,-1.0,-1.0,
1 1.0,-1.0,-1.0,1.0,1.0,
2 1.0,-1.0,-1.0,1.0,1.0,
3 -1.0,1.0,1.0,-1.0,-1.0,
4 -1.0,1.0,1.0,-1.0,-1.0/
DATA SHUNT / 1.0,1.0,1.0,1.0,1.0,
1 1.0,1.0,1.0,1.0,1.0,
2 1.0,1.0,1.0,1.0,1.0,
3 1.0,1.0,1.0,1.0,1.0,
4 1.0,1.0,1.0,1.0,1.0/

Uo = 4.0 * PI * 1.0E-07
Yo = 4.0 * (Er - 1.0)
Zo = 4.0 * (Ur - 1.0)
Go = SIGMA * DELTAL * SQRT(Uo/Eo)
Y = 4.0 + Yo + Go
Z = 4.0 + Zo
DO 5 I = 1,5
SHUNT(I,5) = SHUNT(I,5) * Yo
SERIES(5,I) = SERIES(5,I) * Zo
5 CONTINUE
C
C INITIALIZE ALL THE NODES
C
DO 10 IT = 1,2
DO 10 K = NZB, NZE
DO 10 J = NYB, NYE
DO 10 I = NXB, NXE
DO 10 L = 1, NT
EXI(IT,K,J,I,L) = 0.0
EYI(IT,K,J,I,L) = 0.0
EZI(IT,K,J,I,L) = 0.0
HXI(IT,K,J,I,L) = 0.0
HYI(IT,K,J,I,L) = 0.0
HZI(IT,K,J,I,L) = 0.0
EXR(IT,K,J,I,L) = 0.0
EYR(IT,K,J,I,L) = 0.0
EZR(IT,K,J,I,L) = 0.0
HXR(IT,K,J,I,L) = 0.0
HYR(IT,K,J,I,L) = 0.0
10 HZR(IT,K,J,I,L) = 0.0
C
C INSERT THE INITIAL EXITATION
C
DO 15 K = NZB, NZE
DO 15 L = 1, 4
EZR(2,K,NYI,NXI,L) = 1.0
15 CONTINUE
IT = 2
C
C START ITERATION
C
DO 60 ITime = 1, ITRATE
IF(ITIME .EQ. 1) GOTO 25
C
C COMPUTE THE REFLECTED E-FIELD AT ALL NODES
C
ISIGN = -1
CALL COMPUTE(EXR,EYR,EZR,SHUNT
1 ,Y,EXI,EYI,EZI,ISIGN)
C
C RE-INITIALIZE MATRIX AND FORCE TANGENTIAL
C E-FIELD TO ZERO AT BOUNDARY
C
DO 20 K = NZB, NZE
DO 20 J = NYB, NYE
DO 20 I = NXB, NXE
DO 20 L = 1, NT
HXI(IT-1,K,J,I,L) = 0.0
HYI(IT-1,K,J,I,L) = 0.0
HZI(IT-1,K,J,I,L) = 0.0
IF(I .EQ. NXB) THEN
EYR(IT,K,J,I,L) = 0.0
EZR(IT,K,J,I,L) = 0.0
HXR(IT,K,J,I,L) = 0.0
END IF
IF(J .EQ. NYB)THEN
EXR(IT,K,J,I,L) = 0.0
EZR(IT,K,J,I,L) = 0.0
HYR(IT,K,J,I,L) = 0.0
END IF
IF(K .EQ. NZB)THEN
EXR(IT,K,J,I,L) = 0.0
EYR(IT,K,J,I,L) = 0.0
HZR(IT,K,J,I,L) = 0.0
END IF
20 CONTINUE
25 CONTINUE
DO 30 K = NZB, NZE
DO 30 J = NYB, NYE
DO 30 I = NXB, NXE
IF(J .NE. NYB)HZI(IT-1,K,J-1,I,4)=EXR(IT,K,J,I,1)
IF(K .NE. NZB)HYI(IT-1,K-1,J,I,4)=EXR(IT,K,J,I,2)
HZI(IT-1,K,J,I,2) =EXR(IT,K,J,I,3)
HYI(IT-1,K,J,I,2) =EXR(IT,K,J,I,4)
IF(I .NE. NXB)HZI(IT-1,K,J,I-1,3)=EYR(IT,K,J,I,1)
IF(K .NE. NZB)HXI(IT-1,K-1,J,I,4)=EYR(IT,K,J,I,2)
HZI(IT-1,K,J,I,1) =EYR(IT,K,J,I,3)
HXI(IT-1,K,J,I,2) =EYR(IT,K,J,I,4)
IF(I .NE. NXB)HYI(IT-1,K,J,I-1,3)=EZR(IT,K,J,I,1)
IF(J .NE. NYB)HXI(IT-1,K,J-1,I,3)=EZR(IT,K,J,I,2)
HYI(IT-1,K,J,I,1) =EZR(IT,K,J,I,3)
HXI(IT-1,K,J,I,1) =EZR(IT,K,J,I,4)
30 CONTINUE
C
C INSERT THE BOUNDARY CONDITIONS AT ALL BOUNDARIES
C
DO 35 K = NZB, NZE
DO 35 J = NYB, NYE
DO 35 I = NXB, NXE
IF(I .EQ. NXB)THEN
HYI(IT-1,K,J,I,1) = RoH * HYR(IT,K,J,I,1)
HZI(IT-1,K,J,I,1) = RoH * HZR(IT,K,J,I,1)
END IF
IF(I .EQ. NXE)THEN
HZI(IT-1,K,J,I,3) = RoH * HZR(IT,K,J,I,3)
HYI(IT-1,K,J,I,3) = RoH * HYR(IT,K,J,I,3)
END IF
IF(J .EQ. NYB)THEN
HXI(IT-1,K,J,I,1) = RoH * HXR(IT,K,J,I,1)
HZI(IT-1,K,J,I,2) = RoH * HZR(IT,K,J,I,2)
END IF
IF(J .EQ. NYE)THEN
HXI(IT-1,K,J,I,3) = RoH * HXR(IT,K,J,I,3)
HZI(IT-1,K,J,I,4) = RoH * HZR(IT,K,J,I,4)
END IF
IF(K .EQ. NZB)THEN
HXI(IT-1,K,J,I,2) = RoH * HXR(IT,K,J,I,2)
HYI(IT-1,K,J,I,2) = RoH * HYR(IT,K,J,I,2)
END IF
IF(K .EQ. NZE)THEN
HXI(IT-1,K,J,I,4) = RoH * HXR(IT,K,J,I,4)
HYI(IT-1,K,J,I,4) = RoH * HYR(IT,K,J,I,4)
END IF
35 CONTINUE
C
C COMPUTE THE H-FIELDS AT ALL THE NODES
C
ISIGN = 1
CALL COMPUTE(HXR,HYR,HZR,SERIES,
1 Z,HXI,HYI,HZI,ISIGN)
C
C RE-INITIALIZE ALL THE NODES
C
DO 40 K = NZB, NZE
DO 40 J = NYB, NYE
DO 40 I = NXB, NXE
DO 40 L = 1, NT
EXI(IT-1,K,J,I,L) = 0.0
EYI(IT-1,K,J,I,L) = 0.0
EZI(IT-1,K,J,I,L) = 0.0
40 CONTINUE
DO 45 K = NZB, NZE
DO 45 J = NYB, NYE
DO 45 I = NXB, NXE
EZI(IT-1,K,J,I,4) =HXR(IT,K,J,I,1)
EYI(IT-1,K,J,I,4) =HXR(IT,K,J,I,2)
IF(J .NE. NYE)EZI(IT-1,K,J+1,I,2)=HXR(IT,K,J,I,3)
IF(K .NE. NZE)EYI(IT-1,K+1,J,I,2)=HXR(IT,K,J,I,4)
EZI(IT-1,K,J,I,3) =HYR(IT,K,J,I,1)
EXI(IT-1,K,J,I,4) =HYR(IT,K,J,I,2)
IF(I .NE. NXE)EZI(IT-1,K,J,I+1,1)=HYR(IT,K,J,I,3)
IF(K .NE. NZE)EXI(IT-1,K+1,J,I,2)=HYR(IT,K,J,I,4)
EYI(IT-1,K,J,I,3) =HZR(IT,K,J,I,1)
EXI(IT-1,K,J,I,3) =HZR(IT,K,J,I,2)
IF(I .NE. NXE)EYI(IT-1,K,J,I+1,1)=HZR(IT,K,J,I,3)
IF(J .NE. NYE)EXI(IT-1,K,J+1,I,1)=HZR(IT,K,J,I,4)
45 CONTINUE
C
C CALCULATE THE IMPULSE RESPONSE AT NXO,NYO,NZO
C
EXT = 0.0
EYT = 0.0
EZT = 0.0
HXT = 0.0
HYT = 0.0
HZT = 0.0
DO 50 L = 1, NT
EXT = EXT + EXI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
EYT = EYT + EYI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
EZT = EZT + EZI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
HXT = HXT + HXI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
HYT = HYT + HYI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
50 HZT = HZT + HZI(IT-1,NZO,NYO,NXO,L) * (2.0/Y)
C
C SUM THE FREQUENCY RESPONSE(imaginary and real
C parts) FOR DIFFERENT VALUES OF MESH-SIZE DIVIDED
C BY WAVELENGTHBUT FIRST CONVOLVE IMPULSE RESPONSE
C WITH HANNING PROFILE
C
DINCR = DELTA
DO 55 L = 1, NUMPT
T = DFLOAT(ITIME)
AMT = DFLOAT(ITRATE)
EXTH = EXT * (1.0 + DCOS(PI * T/AMT)) * 0.5
EYTH = EYT * (1.0 + DCOS(PI * T/AMT)) * 0.5
EZTH = EZT * (1.0 + DCOS(PI * T/AMT)) * 0.5
HXTH = HXT * (1.0 + DCOS(PI * T/AMT)) * 0.5
HYTH = HYT * (1.0 + DCOS(PI * T/AMT)) * 0.5
HZTH = HZT * (1.0 + DCOS(PI * T/AMT)) * 0.5
EX(1,L) = EX(1,L) + EXTH * DCOS(2.0*PI*T*DINCR)
EX(2,L) = EX(2,L) + EXTH * DSIN(2.0*PI*T*DINCR)
EY(1,L) = EY(1,L) + EYTH * DCOS(2.0*PI*T*DINCR)
EY(2,L) = EY(2,L) + EYTH * DSIN(2.0*PI*T*DINCR)
EZ(1,L) = EZ(1,L) + EZTH * DCOS(2.0*PI*T*DINCR)
EZ(2,L) = EZ(2,L) + EZTH * DSIN(2.0*PI*T*DINCR)
HX(1,L) = HX(1,L) + HXTH * DCOS(2.0*PI*T*DINCR)
HX(2,L) = HX(2,L) + HXTH * DSIN(2.0*PI*T*DINCR)
HY(1,L) = HY(1,L) + HYTH * DCOS(2.0*PI*T*DINCR)
HY(2,L) = HY(2,L) + HYTH * DSIN(2.0*PI*T*DINCR)
HZ(1,L) = HZ(1,L) + HZTH * DCOS(2.0*PI*T*DINCR)
HZ(2,L) = HZ(2,L) + HZTH * DSIN(2.0*PI*T*DINCR)
OUT(1,L) = DINCR
55 DINCR = DINCR + DEL
60 CONTINUE
DO L = 1, NUMPT
CEX = CMPLX(EX(1,L),EX(2,L))
CEY = CMPLX(EY(1,L),EY(2,L))
CEZ = CMPLX(EZ(1,L),EZ(2,L))
CHX = CMPLX(HX(1,L),HX(2,L))
CHY = CMPLX(HY(1,L),HY(2,L))
CHZ = CMPLX(HZ(1,L),HZ(2,L))
OUT(2,L) = CABS(CEX)
OUT(3,L) = CABS(CEY)
OUT(4,L) = CABS(CEZ)
OUT(5,L) = CABS(CHX)
OUT(6,L) = CABS(CHY)
OUT(7,L) = CABS(CHZ)
OUT(8,L)=SQRT(SQMAG(CEX)+SQMAG(CEY)+SQMAG(CEZ))
OUT(9,L)=SQRT(SQMAG(CHX)+SQMAG(CHY)+SQMAG(CHZ))
END DO
C
C PICK THE MODES
C
DO 65 L = 2, 9
DO 65 K = 1, NUMPT
IF(K .NE. 1 .AND. K .NE. NUMPT) THEN
IF(OUT(L,K) .GT. OUT(L,K-1) .AND.
1 OUT(L,K) .GT. OUT(L,K+1)) THEN
WRITE(6,80) L,K,(OUT(J,K),J=1,9)
END IF
END IF
65 CONTINUE
C
C WRITE OUT DATA FOR PLOTTING
C
DO 70 L = 2, 9
DO 70 K = 1, NUMPT
WRITE(6,75) K, OUT(1,K), OUT(L,K)
70 CONTINUE
75 FORMAT(I5,4F15.8)
80 FORMAT(2I5,10F8.4)
STOP
END
C*************************************************
C THIS SUBROUTINE COMPUTES THE REFLECTED PULSES
C
SUBROUTINE COMPUTE(AXR,AYR,AZR,SCATER,
1 W,AXI,AYI,AZI,ISIGN)
IMPLICIT REAL*8(A-H,O-Z), INTEGER*2(I-N)
DIMENSION AXR(2,NZE,NYE,NXE,NT),
1 AYR(2,NZE,NYE,NXE,NT),SCATER(5,5),
2 AZR(2,NZE,NYE,NXE,NT),AXI(2,NZE,NYE,NXE,NT),
3 AYI(2,NZE,NYE,NXE,NT),AZI(2,NZE,NYE,NXE,NT)

COMMON / PART1 /NT,NXB,NXE,NYB,NYE,NZB,NZE,IT

DO 20 K = NZB, NZE
DO 20 J = NYB, NYE
DO 20 I = NXB, NXE
C INSERT FEW LINES HERE FOR INHOMOGENEOUS CAVITY
DO 15 L = 1, NT
AXRS = 0.0
AYRS = 0.0
AZRS = 0.0
DO 10 M = 1, NT
AXRS = AXRS+2./W*SCATER(L,M)*AXI(IT-1,K,J,I,M)
AYRS = AYRS+2./W*SCATER(L,M)*AYI(IT-1,K,J,I,M)
AZRS = AZRS+2./W*SCATER(L,M)*AZI(IT-1,K,J,I,M)
10 CONTINUE
AXR(IT,K,J,I,L)=AXRS+ISIGN*AXI(IT-1,K,J,I,L)
AYR(IT,K,J,I,L)=AYRS+ISIGN*AYI(IT-1,K,J,I,L)
AZR(IT,K,J,I,L)=AZRS+ISIGN*AZI(IT-1,K,J,I,L)
15 CONTINUE
20 CONTINUE
RETURN
END

(in Fortran)
Fig. 7.26 Computer program for Example 7.5.

++++++++++++++++++++++++++++++++++++++++++++++++++++++

:
:
:

C*************************************************
C THIS SUBROUTINE COMPUTES THE REFLECTED PULSES
C
SUBROUTINE COMPUTE(AXR,AYR,AZR,SCATER,
1 WW,AXI,AYI,AZI,ISIGN)

:
:
:
C INSERT FEW LINES HERE FOR INHOMOGENEOUS CAVITY
IF ((I.GE.9).AND.(I.LE.13)
1 .AND.(ISIGN.EQ.-1)) THEN
NT = 5
W = WW
ELSE
NT = 4
W = 4.0
END IF

:
:
:

(in Fortran)
Fig. 7.28 Modification in the function COMPUTE for the inhomogeneous cavity of
Fig. 7.27.

000000000000000000000000000000000

for k = 1:100
r = rand;
theta(k) = acos( 1 – 2*r);
end;

Fig. 8.2 Random variable generator; for Example 8.1.

0000000000000000000000000000000

% Integration using crude Monte Carlo


% and antithetic methods
%
% Only few lines need be changed to use this
% program for any multi-dimensional integration
%
% the function fun.m is to be on a separate file

a =0; b= 1.0; c = 0; % limits of integration


d=2*pi;
alpha = 5;
nrun = 10000;
sum1 = 0; sum2 = 0;
for i=1:nrun
u1 = rand;
u2 = rand;
x1 = a + (b-a)*u1;
x2 = c + (d-c)*u2;
x3 = (b-a)*(1-u1);
x4 = (d-c)*(1-u2);
sum1 = sum1 + fun(x1,x2);
sum2 = sum2 + fun(x1,x2) + fun(x1,x4) + fun(x3,x2) +
fun(x3,x4);
end
area1 = (b-a)*(d-c)*sum1/nrun
area2 = (b-a)*(d-c)*sum2/(4*nrun)
(a)

function y=fun(rho,phi)
alpha = 5;
y=rho*exp(j*alpha*rho*cos(phi));

(b)

Fig. 8.3 MATLAB program for Monte Carlo evaluation of a two-dimensional


integral: (a) main program, (b) function fun.m kept in a separate file.

% Using fixed random walk MCM to solve a potential


% problem involving Laplace's equation; for Example 8.5

nrun = 2000; % no. of runs, N


delta = 0.05; % step size
A=1.0; B=1.0;
v1=0; v2=0; v3=100; v4=0;
xo=0.5;
yo=0.5;
io=xo/delta; % location at which U is to be determined
jo=yo/delta;
imax=A/delta;
jmax=B/delta;
sum=0;
ms = 0; % no. of steps before reaching the boundary
m1 = 0; % no. of walks terminating at v1
m2 = 0; % no. of walks terminating at v2
m3 = 0; % no. of walks terminating at v3
m4 = 0; % no. of walks terminating at v4
for k=1:nrun
i=io;
j=jo;
while i<=imax & j<=jmax
ms = ms + 1;
r=rand; %random number between 0 and 1
if (r >= 0.0 & r <= 0.25)
i=i+1;
end
if (r >= 0.25 & r <= 0.5)
i=i-1;
end
if (r >= 0.5 & r <= 0.75)
j=j+1;
end
if (r >= 0.75 & r <= 1.0)
j=j-1;
end
% check if (i,j) is on the boundary
if(i == 0)
sum=sum+ v4;
m4 = m4 +1;
break;
end
if(i == imax)
sum=sum+ v2;
m2 = m2 +1;
break;
end
if(j == 0)
sum=sum+ v1;
m1 = m1 + 1;
break;
end
if(j == jmax)
sum=sum+ v3;
m3 = m3 + 1;
break;
end
end % while
end
v=sum/nrun
m=ms/nrun

Fig. 8.13 MATLAB code for Example 8.5.

% Using floating random walk MCM


% to solve Laplace's equation; for Example 8.6
nrun = 500;
ntrials = 5; % no. of trials
tol=0.005; % tolerance
xo = 1.5; % location at which potential
yo = 0.5; % is to be determined
for n=1:ntrials
sum = 0.0;
m=0; % no. of steps before reaching the boundary
for k=1:nrun
x=xo;
y=yo;
while x >=0 & x <=2 & y >=0 & y<=2.5
u=rand; % generate a random no. and move to the next
point
phi=2.0*pi*u;
% find the shortest distance r;
rc = sqrt( (x-1)^2 + (y-1)^2 );
if (x >1 & x < 2 & y >0 & y < 1)
rx = min(x-1,2-x);
r = min(rx,y);
end
if (x >0 & x < 1 & y >1 & y < 2.5)
rx = min(x,y-1);
r = min(rx,2.5-y);
end
if (x >1 & x < 2 & y >1 & y < 2.5)
rx = min(2-x,2.5-y);
r = min(rx,rc);
end
x=x+r*cos(phi);
y=y+r*sin(phi);
m=m+1;
% check if (x,y) is on the boundary
if ( x < (1+tol) & y < (1+tol) ) % corner
sum=sum +0;
break;
end
if ( x >= (2-tol) )
sum=sum +30;
break;
end
if ( y >= (2.5-tol) )
sum=sum +20;
break;
end
if ( x < tol & y >1 & y < 2.5)
sum=sum +0;
break;
end
if ( x > tol & x < (1-tol) & y <= (1+tol) )
sum=sum +0;
break;
end
if ( x < (1+tol) & y >= tol & y <= 1 )
sum=sum +0;
break;
end
if ( x >= (1+tol) & x <= (2.5-tol) & y < tol )
sum=sum +0;
break;
end
end %while
end % nrun
vv(n)=sum/nrun;
steps(n)=m/nrun;
end % ntrials
% find the mean value of V and mean no. of steps
sum1 = 0.0;
sum2 = 0.0;
for n=1:ntrials
sum1 = sum1 + vv(n);
sum2 = sum2 + steps(n);
end
vmean=sum1/ntrials
stepm=sum2/ntrials
% calculate error
sum3=0.0;
for n=1:ntrials
sum3 = sum3 + ( vv(n) - vmean )^2;
end
std=sqrt( sum3/(ntrials-1) );
error = std*2.776/sqrt(ntrials)

Fig. 8.15 MATLAB code for Example 8.6.

% EXAMPLE 9.1 SOLVED USING METHOD OF LINES

AA = 1;
BB = 1;
N = 15;
% DETERMINE VECTOR ALPHA
H = AA/(N+1);
LAM = 2*sin ((1:N)*pi*0.5/(N+1) );
ALPHA = LAM/H;
% CALCULATE THE TRANSFORMATION MATRIX AND COEFFICIENT B
K = sqrt (2/(N+1));
T = zeros(N,N);
for I=1:N
for J=1:N
T(I,J) = K*sin (I*J*pi/(N+1));
end
end
V = 100*ones(N,1);
C = inv(T)*V;
A = ALPHA';
B = C./sinh(BB*A);
% CALCULATE V AT THE GIVEN POINTS
V1 = 0; V2 = 0; V3 = 0;
for K=1:N
V1 = V1 + T(4,K)*B(K)*sinh(ALPHA(K)*0.75);
V2 = V2 + T(8,K)*B(K)*sinh(ALPHA(K)*0.5);
V3 = V3 + T(12,K)*B(K)*sinh(ALPHA(K)*0.25);
end
diary
V1, V2, V3
diary off

Fig. 9.2 MATLAB code for Example 9.1.

%++++++++++++++++++++++++++++++++++++++++++++++++
% EXAMPLE 9.3 SOLVED USING METHOD OF LINES

% OUR OBJECTIVE IS TO DETERMINE THE POTENTIAL


% DISTRIBUTION IN A COAXIAL CABLE OF INNER RADIUS a
% AND OUTER RADIUS a ASSUMING A POTENTIAL DIFFERENCE OF Vo

a= 0.01; b = 0.02; Vo = 100;


N = 15;
h = 2*pi/N;
K = 1/sqrt (N);
% COMPUTE THE TRANSFORMATION MATRIX T AND MIU
T = zeros(N,N);
miu = zeros(N,1);
for I=1:N
miu(I) = 2*sin (I*h*0.5 )/h;
for J=1:N
alpha = I*J*h;
T(I,J) = K*( cos(alpha) + sin(alpha) );
end
end
% CALCULATE THE MATRIX D IN EQS. (9.3.2) AND (9.3.3)
D = zeros(2*N,2*N);
for i=1:2*N
for j=1:2*N
%Do the upper part of the matrix
if (i <= N & j < N)
D(i,j) = T(i,j)*a^miu(j);
end
if (i <= N & j == N)
D(i,j) = T(i,j);
end
if (i <= N & j > N & j < 2*N)
D(i,j) = T(i,j-N)*a^(-miu(j-N));
end
if (i <= N & j == 2*N)
D(i,j) = T(i,j-N)*log(a);
end
%Now do the lower part of the matrix
if (i > N & i <= 2*N & j < N)
D(i,j) = T(i-N,j)*b^miu(j);
end
if (i > N & i <= 2*N & j == N)
D(i,j) = T(i-N,j);
end
if (i > N & i <= 2*N & j > N & j < 2*N)
D(i,j) = T(i-N,j-N)*b^(-miu(j-N));
end
if (i > N & i <= 2*N & j == 2*N)
D(i,j) = T(i-N,j-N)*log(b);
end
end
end
% DETERMINE THE BOUNDARY POTENTIAL MATRIX
% AND THE COEFFICIENT MATRIX
F = zeros(2*N,1);
for i=1:2*N
if i > N
F(i) = Vo;
end
end
C = inv(D)*F;
% WITH THE COEFFICIENTS DETERMINED,
% NOW FIND TRANSFORMED POTENTIAL U
% AND FINALLY DETERMINE THE POTENTIAL V USING EQ. (9.30)
% WE MAY SELECT ANY VALUE OF phi, say, phi = 0^o, i.e. i=1
%del = (a -b)/M;
%rho = a:del:b;
rho = 0.01:0.001:0.02;
M = 10; % no. of divisions along rho
Vmol = zeros(M+1,1);
for k=1:M+1
Vmol(k) = 0.0;
for j=1:N
if (j <N)
U(j) = C(j)*(rho(k))^miu(j) + C(j+N)*(rho(k))^(-miu(j));
end
if (j == N)
U(j) = C(j) + C(j+N)*log(rho(k));
end
Vmol(k) = Vmol(k) + T(10,j)*U(j);
% Vmol(k) = Vmol(k) + T(1,j)*U(j);
end
end
% ALSO, CALCULATE THE EXACT VALUE OF V
Vex = Vo* (log(rho/a))/log(b/a);
diary
Vmol, Vex'
diary off
hold off
plot (rho,Vmol);
title( 'Fig. 9.5 Comparison of exact and method of lines solutions.')
xlabel('rho'), ylabel('V')
hold on
plot (rho,Vex);
hold off

Fig. 9.4 MATLAB code for Example 9.3.

%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
% EXAMPLE 9.4 SOLVED USING METHOD OF LINES
% THIS M-FILES REQUIRES TWO OTHER M-FILES
% "FUN.M" AND "ROOT.M" TO WORK
% FUN.M DETERMINES THE DETERMINANT OF MATRIX [F]
% ROOT.M FINDS THE ROOT(S) OF THE det(F)
global d

Nmax = 50; tol = 1E-5;


eeff1 = 5; eeff2 = 10;% initial/guessed values
for i=1:15
d = 0.01*i;
x(i) = d;
[eeff] = root('fun', eeff1, eeff2, tol, Nmax)
y(i) = eeff;
%diary a:test.out
end
diary
plot(x,y)
diary off

Fig. 9.9(a) Main MATLAB code for Example 9.4.

%+++++++++++++++++++++++++++++++
function determinant = fun(eeff)
% THIS FUNCTION IS NEEDED FOR EXAMPLE 9.4
% IT DETERMINES THE DETERMINANT OF MATRIX [F]
% FOR A GIVEN EFFECTIVE DIELECTRIC CONSTANT EEFF
global d

N = 9;
%d = 0.001;
a = 7*d; b = 3*d; w = 2*d;
er = 9; h = a/N; M = w/h;
lambdao = 1; %assumed
ko = 2*pi/lambdao;
% First calculate the transformation matrices
% Te (= T_ND) and Th (=T_DN)
cons=sqrt(2/(N+0.5));
for i=1:N
for j=1:N
alj = (j - 0.5)*pi/(N + 0.5);
if (j==1)
te(i,j) = 1/sqrt(N);
else
te(i,j) = cons*cos( (i-0.5)*alj);
end
end
end
% Calculate matrices: chi, eta, delta, and gamma
beta = ko*sqrt(eeff);
tau = (1 - eeff)/(er - eeff);
chi = zeros(N,1);
eta = zeros(N,1);
%gammae1 = zeros(N,N)
for i=1:N
x = ((i -0.5)*pi)/(2*N + 1)
chi(i) = sqrt( 4*sin(x)*sin(x) -h^2*(ko^2 - beta^2) );
eta(i) = sqrt( 4*sin(x)*sin(x) -h^2*(er*ko^2 - beta^2) );
end
for i=1:N
for j=1:N
if(i==j)
del(i,i) = 2*sin (((i - 0.5)*pi)/(2*N + 1));
gammae1(i,i) = chi(i)*coth(b*chi(i)/h);
gammah1(i,i) = chi(i)*tanh(b*chi(i)/h);
gammae2(i,i) = eta(i)*coth(d*eta(i)/h);
gammah2(i,i) = eta(i)*tanh(d*eta(i)/h);
else
del(i,j) = 0;
gammae1(i,j) = 0; gammae2(i,j) = 0;
gammah1(i,j) = 0; gammah2(i,j) = 0;
end
end
end
% calculate rho matrix
rho = inv(gammae1 + er*tau*gammae2 - eeff*(1 - tau)^2*del'*(inv(gammah1
+ tau*gammah2))*del);
F = [te(1:3,1:3)*rho(1:3,1:3)*te(1:3,1:3)'];
determinant = det(F);
% Next, solve for the root det(X) = 0 using 'root.m'

%+++++++++++++++++++++++++++++++++++++++++++++++++
function [x2] = root(F, x0, x1, tol, Nmax)
% THIS FUNCTION FINDS THE ROOTS OF fun(x) USING
% THE SECANT METHOD
% fun(x) - EXTERNAL FUNCTION THAT COMPUTES THE VALUES OF f(x)
% x0, x1 - LIMITS OF THE INITIAL RANGE
% x2 - ROOT RETURNED TO THE CALLING ROUTINE
% tol - TOLERANCE VALUE USED IN DETERMINING CONVERGENCE
% Nmax - MAXIMUM NO. OF ITERATIONS
%
% AUTHORS: M. V. ZEIGLER AND E. CHAMPION [37a]

%F0 = eval( [F, '(x0)']);


F0 = fun(x0);
dx = x1 - x0;
for I=1:Nmax
F1 = fun(x1);
%F1 = eval( [F, '(x1)']);
dx = F1*dx/(F1 - F0);
x2 = x1 - dx;
% CHECK IF TOLERANCE HAS BEEN MET
if (abs(dx) <= tol)
fprintf('root at x = %5.g\n', x2);
fprintf('root found after this no. of iterations %5.g\n',I);
break
end
dx = x2 - x1;
x0 = x1;
x1 = x2;
F0 = F1;
end

Fig. 9.9 For Example 9.4.

APPENDIX C

% A set of simultaneous equations [A][X]=[B] is solved by a simple Gaussian


% elimination scheme (without pivoting) and by the MATLAB backward slash "\"
% operation. The MATLAB backward slash "\" operation performs Gaussian
% elimination with pivoting as explained in "Numerical Computing with
% MATLAB" by Cleave Moler. This excellent reference is available for
% download at the mathworks website.

clear;

%Input matrix
A = [10 -7 0;-3 2 6;5 -1 5];
B = [7;4;6];

%MATLAB's backward slash operation


x = A\B;

%Begin simple Gaussian Elimination


N = size(A,1);
%Forward Elimination
for kk = 1:(N-1);
for ii = (kk+1):N
q = A(ii,kk)/A(kk,kk);
%Calculate Elements of the new matrix
jj = (kk+1):N;
A(ii,jj) = A(ii,jj) - q*A(kk,jj);
A(ii,kk) = q;
B(ii) = B(ii) - q*B(kk);
end
end
%Backward Substituion
X(N) = B(N)/A(N,N);
for ii = (N-1):-1:1
sum = A(ii,:)*X(:);
X(ii) = ( B(ii)-sum )/A(ii,ii);
end

thedifference = x-X(:)

Fig. C.1 Gauss elimination method of solving [A][X] = [B].

% This program applies the Cholesky elimination method to solve the system
% [A][X]=[B] where [AA] = augmented matrix [A,B] and compares the result to
% the MATLAB backslash operation.

clear;

%Define A and B
A = [10 -7 0;-3 2 6;5 -1 5];
B = [7;4;6];

%MATLAB backslash operation


x = A\B;

%Begin Cholesky elimination


AA = [A,B];
M = size(AA,2);
N = size(AA,1);

%Calculate the first row of the upper triangular matrix [T]


for jj = 2:M
AA(1,jj) = AA(1,jj)/AA(1,1);
end
%Calculate the other elements of [T] and lower triangular [L] matrices
for ii = 2:N
for qq = ii:N
sum = 0;
for kk = 1:(ii-1)
sum = sum + AA(qq,kk)*AA(kk,ii);
end
AA(qq,ii) = AA(qq,ii)-sum; %calculates [L]
end
for jj = ii+1:M
sum = 0;
for kk = 1:ii-1
sum = sum + AA(ii,kk)*AA(kk,jj);
end
AA(ii,jj) = (AA(ii,jj)-sum )/AA(ii,ii); %calculates [T]
end
end
%Solve for [X] by back substitution
X(N) = AA(N,M);
for nn = 1:N-1
sum = 0;
ii = N-nn;
for jj = ii+1:N
sum = sum + AA(ii,jj)*X(jj);
end
X(ii) = AA(ii,M)-sum;
end

thedifference = x-X(:)

Fig. C.2 Cholesky’s elimination method of solving [A][X]=[B].

% This program employs Gauss-Seidel iterative method to solve a set of


% simultaneous equations [A][X] = [B] and compares the result to the MATLAB
% backslash operator "\". This method will converge if the matrix A is
% diagonally dominant (i.e. the absolute value of the diagonal term is
% greater than the sum of absolute values of the other terms in each row).

clear;

%Define A and B
A = [10 -7 0;-3 6 1;2 -1 5];
B = [7;4;6];

%MATLAB backslash operation


x = A\B;
%Begin Gauss-Seidel iterative method
N = size(A,1);
X = zeros(N,1);
K = 0; % iteration count
TOL = 1e-3; % tolerance for zero
converged = 0; %while loop condition
Xnew = zeros(N,1);

while converged == 0
for ii = 1:N
Xnew(ii) = 1/A(ii,ii)*( B(ii) - A(ii,1:(ii-1))*Xnew(1:(ii-1))...
- A(ii,(ii+1):N)*X((ii+1):N));
end
%Convergent condition
d = sum(abs(Xnew-X))/sum(abs(Xnew));
%Replace old value with newly computed value
X = Xnew;

K = K + 1;
disp([num2str(K),' ',num2str(X(:)'),' ',num2str(d)])
if d<=TOL %convergence test
converged = 1;
end
end

thedifference = x-X(:)

Fig. C.3 Gauss-Seidel iterative method of solving [A][X]=[B].

% This program applies the conjugate gradients method to solve a set of


% simultaneous equations [A][X]=[B] and compares the result to the MATLAB
% backslash operator "\".

clear;

%Define A and B
A = [10 -7 0;-3 6 1;2 -1 5];
B = [7;4;6];

%MATLAB backslash operation


x = A\B;

%Begin Conjugate Gradients Method


N = size(A,1);
kk = 0;% iteration count
giveup = 20;
TOL = 1e-3; %tolerance for zero
X = zeros(N,1);
P = B;
R = B;
converged = 0; %while loop condition

%Iteration begins here


while ~converged
U = A*P;
alpha = (P.'*R)/(P.'*U);
X = X+alpha*P;
R = R-alpha*U;

%calculate residuals and direction vectors


if R.'*R<TOL
converged = 1;
disp(['Result: X = ',num2str(X')]);
elseif (kk>giveup)
disp('max number of iterations reached. exiting.')
converged = 1;
end
beta = -(R.'*U)/(P.'*U);
P = R+beta*P;

kk = kk + 1;
end

thedifference = x-X

Fig. C.4 The program applies the conjugate gradients method to solve [A][X]=[B].

%This program performs matrix inversion using Gauss-Jordan elimination


%method and the result is compared to the MATLAB function 'inv'

clear;

%Define [A]
A = [10 -7 0;-3 6 1;2 -1 5];
%MATLAB operation
matinv = inv(A);

%Begin Gauss-Jordan Elimination method


N = size(A,1);
%Calculate elements of reduced matrix
for kk = 1:N
ii = [1:(kk-1),(kk+1):N]; %non-pivot row index
jj = [1:(kk-1),(kk+1):N]; %non-pivot column index

%Calculate new elements of pivot row


A(kk,jj) = A(kk,jj)/A(kk,kk);

%Calculate element replacing pivot element


A(kk,kk) = 1/A(kk,kk);

%Calculate new elements not in povot row or pivot column


A(ii,jj) = A(ii,jj) - A(ii,kk)*A(kk,jj);

%Calculate replacement elements for pivot colum-except pivot element


A(ii,kk) = - A(ii,kk)*A(kk,kk);
end

anydiff = matinv-A

Fig. C.5 Matrix inversion using Gauss-Jordan simultaneous method.

% This example finds the largest Eigenvalue and the associated


% eigen vector of a matrix equation [A][X]=Lambda*[X] and
% compares this to the largest eigenvalue obtained by the
% MATLAB eig function.

clear;

%Define [A]
A = [10 -7 0;-3 6 1;2 -1 5];

%MATLAB eig function


eigval = eig(A);

%Begin Iterative Method


maxiter = 100;
epsi = 1e-3;
kk = 0;
X = ones(size(A,1),1);
valuefound = 0;

while ~valuefound
D = A*X;
Z = D/D(1);

%Check if result is sufficient


test = abs((X-Z)-epsi*abs(Z));
if max(abs(X-Z))<epsi
valuefound = 1;
elseif maxiter<kk
disp('Failed to find solution')
valuefound = 1;
end

X = Z;
disp(D')
kk = kk + 1;
end

lambda = D(1);

thedifference = lambda - eigval(1)

Fig. C.6 A program for finding the largest eigenvalue of equation [A][X] =
LAMBDA [X].
% The following program attempts to implement the Jacobi's method of
% finding eigenvalues and eigenvectors. Just for illustration we have
% taken a random 8x8 symmetric matrix. If the actual matrix is stored %
in a .mat file it has to be loaded using load command in the second
%line and the first line will be commented out. We have decided to have
% 10 iterations or less, when the determinant of the original matrix is
% close to that of the modified matrix. The difference E is treated as %
error. We wish that the error E is less than eps or # of iterations % =
10. These parametes have to be appropriately chosen based on one's %
experience and nature of the problem under consideration.
%
% *********** Description of the variables *********
% A = original matrix saved in Ao to start with.
% R is the rotation matrix.
% Rp is the product of all R's.
% At the end of the while loop Rp has the eigen vectors
% in its columns and A has the eigen values along the main diagonal.
% In fact MATLAB has a built-in routine called eig that finds the eigen
% values and the eigen vectors. So we wish to compare both the results;
% hence we have added a command at the bottom of the code
% asking to dispaly both. Note that the eigen values are not sorted in %
this code.
%%%%%%%%%%%%%%%

clear all;close all;


A = 5*rand(8); A = A+A';
%load Afile.mat
N = length(A(:,1)); % N = 8 in this case
Ao=A;
Rp=eye(N);
E=10; Niter=1;
while (E > eps)|(Niter<10)
for p = 1:N
for q = p+1:N
th = .5*atan(2*A(p,q)/(A(p,p)-A(q,q)));
R = eye(N);
R([p,q],[p,q]) = [cos(th) -sin(th);sin(th) cos(th)];
A=R'*A*R;
Rp=Rp*R;
end
end
Niter = Niter+1;
E=det(A)-det(Ao);
end
Rp
A
[V,D]=eig(A)
E

Fig. C.7 MATLAB code for finding all the eigenvalues and eigenvectors of the
equation [A][X] = LAMDBA [x]

You might also like