Near-optimal continuation pairs
Mario Berljafa and Stefan Güttel, May 2016Download PDF or m-file
Contents
Introduction
The MATLAB code provided here reproduces the numerical example from [2, Sec. 3.4]. This example demonstrates the effectiveness of the near-optimal strategy for selecting continuation pairs used for the expansion of a rational Krylov space during the execution of the rational Arnoldi algorithm; see [2, Alg. 2.1] and [2, Sec. 2], where the notion of continuation pairs is introduced. In [2, Sec. 2-3] we propose and analyze a framework for selecting these continuation pairs in such a way as to minimize the growth of the condition number of the rational Krylov basis undergoing the Gram--Schmidt process in order to avoid numerical stability problems. The motivation for this work is to provide a robust parallel rational Arnoldi algorithm where numerical instability problems have been reported. For more details we refer to [2] and the references therein.
MATLAB code
In the remainder we provide and briefly comment on the MATLAB code. A detailed discussion of the example itself is provided in [2, Sec. 3.4].
We first setup the problem, similar to the one from [1, Sec. 5.3].
N = 1000; n = 300; m = 16; % Surrogate problem to get the poles. A = -5*gallery('grcar', n, 3); b = ones(n, 1); xi = rkfit(expm(full(A)), A, b, inf(1, m)); % Actual problem. A = -5*gallery('grcar', N, 3); b = ones(N, 1);
For the near-optimal continuation strategy we use FOM(2) and FOM(3).
ucf = @(AB, nu, mu, x, param) ... util_continuation_fom(AB, nu, mu, x, param); param = struct('continuation', 'near-optimal', ... 'continuation_solve', ucf, ... 'continuation_bounds', true, ... 'orth', 'MGS', ... 'reorth', 1);
In the remainder we run the rational Arnoldi algorithm using rat_krylov first with FOM(2), and then with FOM(3) for the prediction of near-optimal continuation pairs.
for cntm = 2:3 % Use FOM(cntm) to predict near-optimal continuation pairs. param.continuation_m = cntm; [V, K, H, out] = rat_krylov(A, b, xi, param); % This holds the norms of \widehat f_{j+1}. Delta = out.Fhat; % The following correspond to [2, eq. (3.20)]. delta_u = 1 + 2*out.fhat + out.Fhat.^2; delta_l = 1 - 2*out.fhat; cond_number = @(X) arrayfun(@(j)cond(X(:, 1:j+1)), ... 1:size(X, 2)-1); % Bound from [2, Thm. 3.6]. Bound = cumprod((1+Delta)./(1-Delta)); % Analogous bound based on [2, eq. (3.20)]. bound = sqrt(cumprod(delta_u./delta_l)); figure(cntm-1) subplot(3, 1, 1:2) semilogy(Bound, 'bo-'), hold on semilogy(bound, 'bs-') semilogy(cond_number(out.W), 'r-') semilogy(out.Fhat, 'ko--') semilogy(out.fhat, 'ks--') legend('Bound_j', 'bound_j', '\kappa(W_{j+1})', ... 'f_j', 'P_j f_j', 'location', 'NorthWest') xmin = 1; xmax = m; ymin = min([1, min(out.fhat)]); ymax = max(Bound); axis([xmin xmax ymin ymax]) title(['FOM(' num2str(cntm) ')']) W = out.W; for j = 1:m num = norm(W(:, j+1)-V(:, 1:j)*(V(:, 1:j)'*W(:, j+1))); dnm = norm(V(:, 1:j)*(V(:, 1:j)'*W(:, j+1))); % Angle between w_{j+1} and range(V_j). angl(j) = atan(num/dnm); % Corresponding lower bound given by [2, Cor. 3.4]. angl_bound(j) = atan(1/out.Fhat(j)-1); end subplot(3, 1, 3) plot(angl, 'rx-'), hold all plot(angl_bound, 'bx--') axis([xmin xmax pi/4 pi/2]) legend('angle', 'lower bound', 'location', 'SouthEast') xlabel('j') end
Links to other examples
Here is a list of other numerical illustrations of parallelization strategies:
Overview of the parallelization options
TEM example from [1, Sec. 5.1]
Inlet example from [1, Sec. 5.2]
Waveguide example from [1, Sec. 5.3]
References
[1] M. Berljafa and S. Güttel. Generalized rational Krylov decompositions with an application to rational approximation, SIAM J. Matrix Anal. Appl., 36(2):894--916, 2015.
[2] M. Berljafa and S. Güttel. Parallelization of the rational Arnoldi algorithm, SIAM J. Sci. Comput., 39(5):S197--S221, 2017.