In: Electrical Engineering
write a matlab code of current distribution in wire
antenna using method of moments
(pocklington)
function [Zin, Current, ERadiated] = PocklingtonPulseSolution(TotalSegments, NumGauss, WireLength, ...
WireRadius, Frequency, ExcitationType, ThetaIn, NumTheta)
% PocklingtonPulseSolution calculates the solution to Pocklington's Integral Equation
% for a straight wire along z-axis.
%
% CALL: [Zin, Current, ERadiated] = PocklingtonPulseSolution(TotalSegments, ...
% NumGauss, WireLength, WireRadius, Frequency, ExcitationType, Theta, NumTheta)
% INPUTS:
% TotalSegments = total number of thin wire segments to use
% NumGauss = number of quadrature points for numerical integration
% WireLength = total wire length (meters)
% WireRadius = wire radius (meters)
% Frequency = operating frequency (Hz)
% ExcitationType = The wire excitation type to use
% ExcitationType = 0 : Delta-gap source located in center segment
% ExcitationType = 1 : Theta-polarized incident plane wave
% ThetaIn = Incident angle of plane wave if ExcitationType = 1 (radians)
% NumTheta = Number of scattering angles (0 <= theta <= 2*pi)
%
% OUTPUTS:
% Zin = Input impedance measured at center segment if ExcitationType = 0 (Ohms)
% Current = Complex-valued current in each segment (Amperes)
% ERadiated = Complex-valued radiated far-field over NumTheta angles (0 <= theta <= 2*pi)
% Reference:
%
% [1] Gibson, Walton C. "The Method of Moments in Electromagnetics," Taylor
% and Francis/CRC, 2008.
%
% Copyright (C) 2007 Tripoint Industries, Inc.
c = 299792458;
Mu = 4.0e-7*pi;
Epsilon = 1.0/(Mu*c*c);
w = 2.0*pi*Frequency;
k = w*sqrt(Mu*Epsilon);
Eta = sqrt(Mu/Epsilon);
TotalElements = TotalSegments;
DeltaZ = WireLength / TotalSegments;
z = linspace(-0.5*WireLength , 0.5*WireLength - DeltaZ, TotalSegments);
% zero matrix
A = zeros(TotalElements);
[GaussZ, GaussW] = lgwt(NumGauss, 0.0, 1); % Gauss integration weights and locations
GaussZ = GaussZ*DeltaZ;
GaussW = GaussW*DeltaZ;
% Compute the first part of the self term (Eqn. 4.63)
r2 = WireRadius*WireRadius;
num = sqrt(1 + 4*r2/(DeltaZ*DeltaZ)) + 1;
denom = sqrt(1 + 4*r2/(DeltaZ*DeltaZ)) - 1;
self = k*k*log(num/denom) - i*k*k*k*DeltaZ;
% Compute the second part of the self term (Eqn. 4.63)
limit2 = PocklingtonAnalyticTerm(0, DeltaZ/2.0, k, WireRadius);
limit1 = PocklingtonAnalyticTerm(0, -DeltaZ/2.0, k, WireRadius);
% Total self term
self = self + (limit2 - limit1);
% compute first row of matrix only
m = 1;
z_m = z(m) + 0.5*DeltaZ;
for n = 1:TotalElements
if m == n
A(m,n) = self;
else
term = 0.0;
% compute numerical part of Pocklington matrix
for i_gauss = 1:NumGauss
z_n = z(n) + GaussZ(i_gauss);
dz = z_m - z_n;
dz2 = dz*dz;
r = sqrt(dz2 + r2); % distance between surface point and interior wire point
r_inv = 1.0/r;
expterm = exp(-i*k*r)*r_inv;
term = term + expterm*GaussW(i_gauss);
end
limit2 = PocklingtonAnalyticTerm(z_m, z(n) + DeltaZ, k, WireRadius);
limit1 = PocklingtonAnalyticTerm(z_m, z(n), k, WireRadius);
A(m,n) = k*k*term + (limit2 - limit1);
end
end
% construct rest of matrix using first row
A = toeplitz(real(A(1,:))) + i*toeplitz(imag(A(1,:)));
% invert matrix
Ainv = inv(A);
rhs = zeros(TotalElements,1);
j = zeros(TotalElements,1);
% compute the right-hand side
if ExcitationType == 0
rhs(floor(TotalSegments/2)+1) = -i*4*pi*w*Epsilon*(1.0/DeltaZ); % delta-gap excitation
elseif ExcitationType == 1
for m = 1:TotalElements
z_m = z(m) + 0.5*DeltaZ;
rhs(m) = PlanewaveExcitation(z_m, k, ThetaIn);
end
rhs = -i*4*pi*w*Epsilon*v;
end
% solve for currents
Current = Ainv*rhs;
% array of theta for theta-pol radiated field
Theta = linspace(0.0, 2.0*pi, NumTheta);
for iTheta = 1:NumTheta
cosTheta = cos(Theta(iTheta));
sinTheta = sin(Theta(iTheta));
ERadiated(iTheta) = 0.0;
for m = 1:TotalElements
z_m = z(m) + 0.5*DeltaZ;
ERadiated(iTheta) = ERadiated(iTheta) + DeltaZ*Current(m)*sinTheta*exp(i*k*z_m*cosTheta);
end
ERadiated(iTheta) = -(i*w*Mu/(4.0*pi))*ERadiated(iTheta);
end
Zin = 1.0 / Current(floor(TotalSegments/2)+1);
return
function b = PlanewaveExcitation(z, k, Theta)
b = sin(Theta)*exp(i*k*z*cos(Theta));
return
% This function computes the Pockylinton analytic term following Eqn. (4.63)
function x = PocklingtonAnalyticTerm(zm, zp, k, WireRadius)
dz = zm - zp;
r = sqrt(dz*dz + WireRadius*WireRadius);
r_inv = 1.0/r;
x = dz*(1 + i*k*r)*r_inv*r_inv*r_inv*exp(-i*k*r);
return;