A novel numerical integration technique is applied for the calculation of the infinite integrals of (1) and (2). It is based on the presence of the terms
$e^{-(h_i+h_j)u}$ and$e^{-2 h_i u}$ in the integrand and on the observation that the integral of (2) has as a factor the term$cos(uy)$ . Therefore, some of the roots of the integrand are known. Thus, when the horizontal distance$y$ between the two conductors is not zero, the integral in the right part of (2) can be calculated as follows.
The Gauss–Legendre method [14] is applied to calculate the integral between zero and the first root of
$cos(uy)$ , as this method is capable of handling the initial steep descent of the integrand. Then the Lobatto rule [10] is applied in the intervals between subsequent roots of$cos(uy)$ . The procedure is repeated until convergence is achieved, controlled by a user defined tolerance, set to$10^{-9}$ in this paper.
For the calculation of the integral in (1) or the integral in (2) in the case where the horizontal distance
$y$ is zero, the procedure is described below.
The Gauss–Legendre method is applied in order to find the integral at an initial interval between zero and
$u_0 = 4 \times 10^{-4}/(h_i+h_j)$ in (2) or$u_0 = 4 \times 10^{-4}/(2h_i)$ in (1). Then the shifted Gauss-Laguerre method [14] is used for the evaluation of the rest of the integral. The procedure is repeated iteratively. In each iteration, the initial interval is bisected and the use of the Gauss–Legendre method is extended by$10 u_0$ intervals to the right of$u_0$ . Convergence is achieved when the absolute difference between two succedent values of calculated integral is less than the predefined tolerance.
In all cases examined, convergence is achieved after 3–4 iterations.
"The Gauss–Legendre method is applied to calculate the integral between zero and the first root... as this method is capable of handling the initial steep descent of the integrand."
This is handled by the first Gauss-Legendre integral computation in the function:
Gu_1 = compute_legendre_integral(u(1), height, s_legendre, w_legendre, permittivity_layers, omega);function G = compute_legendre_integral(interval, height, points, weights, permittivity, omega)
% Compute integral using Gauss-Legendre quadrature
G = 0;
for w = 1:length(weights)
u_new = ((interval * (points(w) - 1)) / 2) + interval;
F_u = nakagawa(u_new, omega, permittivity);
G = G + weights(w) * exp(-2 * height * u_new) * F_u;
end
G = G * interval / 2;
endThis term evaluates the integral over the interval
- Compute the initial segment of the integral from 0 to the first integration step size
u(1), where the function typically has a steep descent (as the paper mentions). -
compute_legendre_integralimplements Gauss-Legendre quadrature, which uses roots of Legendre polynomials and weights for high accuracy in this segment. - Gauss-Legendre quadrature is well-suited for this, as it accurately handles functions with rapid changes in this region.
- It divides
$[0, u_0]$ into sub-intervals using the Legendre points and weights, which optimally sample the steep descent.
The first interval
u(1) = 4e-4 / (2 * height);This scales the step size by the conductor height, ensuring it is small enough to capture the steep descent behavior, captured by the exponential term within the integration loop:
G = G + weights(w) * exp(-2 * height * u_new) * F_u;- The Gauss-Legendre method integrates over finite intervals by summing weighted function evaluations at specific quadrature nodes
$u_{\text{new}}$ within the interval. - Each node
$u_{\text{new}}$ contributes to the integral based on the value of the integrand at that point. - Since
$u_{\text{new}}$ varies for each quadrature point, the exponential decay must be applied individually at each node.
For a finite interval
Here,
"Then the shifted Gauss-Laguerre method is used for the evaluation of the rest of the integral."
This term evaluates the semi-infinite part of the integral starting from
This is handled by the Laguerre quadrature computation:
Gu_2 = compute_laguerre_integral(u(1), height, s_laguerre, w_laguerre, permittivity_layers);function G = compute_laguerre_integral(u_start, height, points, weights, permittivity)
% Compute integral using Laguerre quadrature
G = 0;
for v = 1:length(weights)
u_new = points(v) / (2 * height) + u_start;
F_u = nakagawa(u_new, 2 * pi * permittivity, permittivity);
G = G + weights(v) * F_u;
end
G = G * exp(-2 * height * u_start) / (2 * height);
endThe general description of the computation is as follows:
- Compute the contribution of the integral for the semi-infinite part of the domain using Gauss-Laguerre quadrature, i.e. the part of the integral extending to infinity, starting at
$u_0$ . - Laguerre quadrature naturally handles the exponential decay of terms like
$e^{-2 h \cdot u}$ , which dominate in the semi-infinite domain. - Gauss-Laguerre is well-suited for semi-infinite intervals. The weights
$w_\text{laguerre}$ and nodes$s_\text{laguerre}$ are designed to approximate integrals weighted by exponential decay terms$e^{-x}$ . It assumes the exponential decay$e^{-x}$ is already factored into the quadrature weights and nodes. - In this case,
$e^{-2 \cdot \text{height} \cdot u_{\text{new}}}$ is already accounted for by the Laguerre quadrature weights (inherently designed for$e^{-x}$ ), so only$e^{-2 \cdot \text{height} \cdot u_{\text{start}}}$ needs to be applied after the summation.
For the semi-infinite integral, the shifted domain becomes:
Gauss-Laguerre handles
The compute_laguerre_integral function implements:
u_new = points(v) / (2 * height) + u_start;-
$u_{\text{start}} = u(1)$ ensures a shift to match the end of the Gauss-Legendre interval. -
$F_u$ is computed via the Nakagawa function, which is the main part of the integrand.
function F = nakagawa(u, omega, permittivity)
% Compute the Nakagawa function
mu_0 = 4 * pi * 1e-7;
epsilon_0 = 8.854187817e-12;
% Free-space propagation constant
k_0 = omega * sqrt(mu_0 * epsilon_0);
% Return Nakagawa function value
F = 1 / (u + sqrt(u^2 + 1j * omega * mu_0 * (1 / permittivity)));
endThe nodes and weights of Laguerre quadrature are tailored for integrals involving exponentials like
The paper explains why two methods are used:
-
Gauss-Legendre for
$[0, u_0]$ :
- This interval contains a steep descent of the integrand, which Gauss-Legendre handles efficiently for short, finite intervals.
- The sharp initial decay means that uniform quadrature (e.g., trapezoidal) would need many points to achieve similar accuracy.
-
Gauss-Laguerre for
$[u_0, \infty)$ :
- This region is dominated by the exponential decay
$e^{-2 h \cdot u}$ , making Laguerre quadrature the natural choice for efficient evaluation. - Using Gauss-Legendre here would require transforming the infinite domain or truncating it, which is less efficient.
It is noted that Gu_1 and Gu_2 do not integrate over the same interval. They are complementary contributions to the overall integral:
-
Gu_1: Covers$[0, u_0]$ . -
Gu_2: Covers$[u_0, \infty)$ .
Gauss-Laguerre quadrature is specifically designed for semi-infinite integrals of the form:
To compute an integral over
u_new = points(v) / (2 * height) + u_start;Step 1: Original semi-infinite interval
The base Laguerre quadrature nodes (points) and weights (weights) are computed for the standard interval
Where:
-
$x_v$ : Gauss-Laguerre nodes. -
$w_v$ : Gauss-Laguerre weights.
Step 2: Shifting the interval to start at
From the code:
u_new = points(v) / (2 * height) + u_start;-
u_start: Acts as the starting point of the shifted interval$u_0$ . -
points(v) / (2 * height): Scales the Laguerre nodes appropriately for the integration range.
This transformation moves the integration domain from
Step 3: How the exponential decay is handled
Laguerre quadrature implicitly accounts for the exponential decay
From the code:
G = G + weights(v) * F_u; % Sum the weighted function valuesIn the computation of Gu_2, the Laguerre transformation shifts the effective interval to
- The use of shifted
$u_{\text{new}} = u_0 + x_v / (2 \cdot h)$ . - The exponential decay factor
$e^{-u}$ , inherent in Laguerre quadrature.
Thus, even though Gu_2 is computed using Gauss-Laguerre points and weights, it effectively integrates from
u_new = points(v) / (2 * height) + u_start;In conclusion, Gu_2 does indeed compute the contribution from
"The procedure is repeated iteratively. In each iteration, the initial interval is bisected and the use of the Gauss–Legendre method is extended by intervals to the right of
$u_0$ ."
This is implemented in the iterative loop of the code:
for i = 2:iteration_limit
% Update step size
step_factor = 1 / (2^(i - 1));
u(i) = 10 * u(i - 1);
% Gauss-Legendre segments
Gu_3 = compute_legendre_integral(u(1) * step_factor, height, s_legendre, w_legendre, permittivity_layers, omega);
Gu_4 = compute_legendre_integral(u(i) - u(i - 1), height, s_legendre, w_legendre, permittivity_layers, omega);
% Laguerre contribution
Gu_6 = compute_laguerre_integral(u(i), height, s_laguerre, w_laguerre, permittivity_layers);
% Total impedance
dZ(i) = Gu_3 + Gu_4 + Gu_6;
% Check convergence
if abs(dZ(i) - dZ_previous) <= tolerance
break;
end
% Update for next iteration
dZ_previous = dZ(i);
endThe general description of the computation is as follows:
- Extends the integration by progressively adding contributions from new intervals, refining the solution iteratively.
- The step factor halves the segment size at each iteration, improving resolution.
u(i)defines the new integration bound, increasing logarithmically to cover the semi-infinite domain.
The main terms in the algorithm are:
-
Gu_3: Computes a small segment at the leftmost interval$[0, u_0/2]$ using Gauss-Legendre. -
Gu_4: Computes the interval between the two successive bounds$[u(i-1), u(i)]$ using Gauss-Legendre. -
Gu_6: Adds the Laguerre contribution for the new interval$[u(i), \infty)$ . -
Convergence check: The code compares successive impedance estimates
$dZ(i)$ to$dZ(i-1)$ using:
if abs(dZ(i) - dZ_previous) <= toleranceThe loop stops when the change falls below the predefined tolerance.
"Convergence is achieved when the absolute difference between two successive values of the calculated integral is less than the predefined tolerance."
This is reflected in the final line of the main function:
d_Z = 1j * omega * mu_0 * dZ(i) / pi;Once convergence is achieved, the final self-impedance dZ(i) represents the converged value of the integral.
| Step in the paper | Code implementation |
|---|---|
| Initial steep descent handled by Gauss-Legendre | Gu_1 = compute_legendre_integral(u(1), ...) |
| Shifted Gauss-Laguerre for semi-infinite domain | Gu_2 = compute_laguerre_integral(u(1), ...) |
| Iterative refinement via step bisection | Iterative for loop, halving the step size: step_factor = 1 / (2^(i-1)), adding contributions with Gu_3, Gu_4, and Gu_6. |
| Convergence check using tolerance | if abs(dZ(i) - dZ_previous) <= tolerance, breaking the loop when the result stabilizes. |
| Final impedance computed after convergence | d_Z = 1j * omega * mu_0 * dZ(i) / pi, assembling the result using the final converged value of the total integral. |
function d_Z = method_self_aeras_1_strwma(frequency, permittivity_layers, height)
% Numerically evaluate self-impedance integrals using hybrid quadrature
% frequency: frequency of operation [Hz]
% permittivity_layers: permittivity values of the layers
% height: distance from conductor to ground [m]
% --- Constants ---
tolerance = 1e-10; % Convergence tolerance
mu_0 = 4 * pi * 1e-7; % Magnetic permeability
omega = 2 * pi * frequency;
% Load Gauss-Legendre and Laguerre points/weights
[s_legendre, w_legendre] = load_quadrature('ah16.txt');
[s_laguerre, w_laguerre] = load_quadrature('ah35.txt');
% --- Initialization ---
u(1) = 4e-4 / (2 * height);
dZ_previous = 0;
iteration_limit = 100; % Fail-safe iteration cap
% Compute initial segments
Gu_1 = compute_legendre_integral(u(1), height, s_legendre, w_legendre, permittivity_layers, omega);
Gu_2 = compute_laguerre_integral(u(1), height, s_laguerre, w_laguerre, permittivity_layers);
dZ(1) = Gu_1 + Gu_2;
% Iterative computation
for i = 2:iteration_limit
% Update step size
step_factor = 1 / (2^(i - 1));
u(i) = 10 * u(i - 1);
% Gauss-Legendre segments
Gu_3 = compute_legendre_integral(u(1) * step_factor, height, s_legendre, w_legendre, permittivity_layers, omega);
Gu_4 = compute_legendre_integral(u(i) - u(i - 1), height, s_legendre, w_legendre, permittivity_layers, omega);
% Laguerre contribution
Gu_6 = compute_laguerre_integral(u(i), height, s_laguerre, w_laguerre, permittivity_layers);
% Total impedance
dZ(i) = Gu_3 + Gu_4 + Gu_6;
% Check convergence
if abs(dZ(i) - dZ_previous) <= tolerance
break;
end
% Update for next iteration
dZ_previous = dZ(i);
end
% Final result
d_Z = 1j * omega * mu_0 * dZ(i) / pi;
end
% --- Helper Functions ---
function [points, weights] = load_quadrature(filename)
% Load quadrature points and weights from file
data = load(filename);
points = data(:, 1);
weights = data(:, 2);
end
function G = compute_legendre_integral(interval, height, points, weights, permittivity, omega)
% Compute integral using Gauss-Legendre quadrature
G = 0;
for w = 1:length(weights)
u_new = ((interval * (points(w) - 1)) / 2) + interval;
F_u = nakagawa(u_new, omega, permittivity);
G = G + weights(w) * exp(-2 * height * u_new) * F_u;
end
G = G * interval / 2;
end
function G = compute_laguerre_integral(u_start, height, points, weights, permittivity)
% Compute integral using Laguerre quadrature
G = 0;
for v = 1:length(weights)
u_new = points(v) / (2 * height) + u_start;
F_u = nakagawa(u_new, 2 * pi * permittivity, permittivity);
G = G + weights(v) * F_u;
end
G = G * exp(-2 * height * u_start) / (2 * height);
end
function F = nakagawa(u, omega, permittivity)
% Compute the Nakagawa function
mu_0 = 4 * pi * 1e-7;
epsilon_0 = 8.854187817e-12;
% Free-space propagation constant
k_0 = omega * sqrt(mu_0 * epsilon_0);
% Return Nakagawa function value
F = 1 / (u + sqrt(u^2 + 1j * omega * mu_0 * (1 / permittivity)));
end