– | the number of the current Arnoldi iteration; |
– | the number of converged eigenvalues at this point; |
– | the real and imaginary parts of the converged eigenvalues; |
– | the error bounds on the converged eigenvalues. |
None.
Open in the MATLAB editor: f12ae_example
function f12ae_example fprintf('f12ae example results\n\n'); n = int64(100); nev = int64(4); ncv = int64(20); sigmar = 0.4; sigmai = 0.6; sigma = sigmar + i*sigmai; % A diagonals dd = 2; dl = -2; du = 3; irevcm = int64(0); resid = zeros(n,1); v = zeros(n, ncv); x = zeros(n, 1); mx = zeros(n); y = zeros(n,1); [icomm, comm, ifail] = f12aa( ... n, nev, ncv); [icomm, comm, ifail] = f12ad( ... 'Regular Inverse', icomm, comm); [icomm, comm, ifail] = f12ad( ... 'Generalized', icomm, comm); % Form factorise complex tridiagonal C = A - sigma*B cl(1:n-1,1) = complex(dl) - sigma; cd(1:n,1) = complex(dd) - 4*sigma; cu(1:n-1,1) = complex(du) - sigma; [cl, cd, cu, cu2, ipiv, info] = f07cr( ... cl, cd, cu); while (irevcm ~= 5) [irevcm, resid, v, x, mx, nshift, comm, icomm, ifail] = ... f12ab( ... irevcm, resid, v, x, mx, comm, icomm); if (irevcm == -1) % Solve (A-sigB)y = Bx, Bx not stored x = f12ae_Bx(n,x); z = reshape(complex(x),[n,1]); [z, info] = f07cs( ... 'N', cl, cd, cu, cu2, ipiv, z); x = real(z); elseif (irevcm == 1) % Solve (A-sigB)y = Bx, Bx stored in mx z = complex(mx); [z, info] = f07cs( ... 'N', cl, cd, cu, cu2, ipiv, z); x = real(z); elseif (irevcm == 2) % y = Bx x = f12ae_Bx(n,x); elseif (irevcm == 4) [niter, nconv, ritzr, ritzi, rzest] = f12ae(icomm, comm); if (niter == 1) fprintf('\n'); end fprintf('Iteration %2d No. converged = %d Norm of estimates = %10.2e\n', ... niter, nconv, norm(rzest)); end end [nconv, dr, di, z, v, comm, icomm, ifail] = ... f12ac( ... sigmar, sigmai, resid, v, comm, icomm); % Recover eigenvalues of original problem eig = f12ae_recover(n,nconv,di,v); fprintf('\nThe %4d Ritz values closest to %7.2f%+7.2fi are:\n\n', ... nconv, sigmar, sigmai); disp(eig'); function [y] = f12ae_Bx(n,x) y(1) = 4*x(1) + x(2); for j=2:n-1 y(j) = x(j-1) + 4*x(j) + x(j+1); end y(n) = x(n-1) + 4*x(n); function [y] = f12ae_Ax(n,x) y(1) = 2*x(1) + 3*x(2); for j=2:n-1 y(j) = -2*x(j-1) + 2*x(j) + 3*x(j+1); end y(n) = -2*x(n-1) + 2*x(n); function [eig] = f12ae_recover(n,nconv,di,v) first = true; for j = 1:nconv % Use Rayleigh Quotient to recover eigenvalues of the original problem if di(j)==0 % Ritz value is real. x = v(:,j); eig = x'Ax/x'Bx. x = v(:,j); ax = f12ae_Ax(n,x); bx = f12ae_Bx(n,x); eig(j) = dot(x,ax)/dot(x,bx) + 0i; elseif (first) % Ritz value is complex: x = v(:,j) - i v(:,j+1). xr = v(:,j); xi = v(:,j+1); z = xr + i*xi; % Compute x'(Ax): az = f12ae_Ax(n,xr) + i*f12ae_Ax(n,xi); num = dot(z,az); % Compute x'(Bx): az = f12ae_Bx(n,xr) + i*f12ae_Bx(n,xi); den = dot(z,az); eig(j) = num/den; first = false; else % Second of complex conjugate pair. eig(j) = conj(eig(j-1)); first = true; end end
f12ae example results Iteration 1 No. converged = 0 Norm of estimates = 3.05e+00 Iteration 2 No. converged = 0 Norm of estimates = 2.89e+00 Iteration 3 No. converged = 0 Norm of estimates = 3.74e+00 Iteration 4 No. converged = 0 Norm of estimates = 3.11e+00 Iteration 5 No. converged = 0 Norm of estimates = 3.93e+00 Iteration 6 No. converged = 0 Norm of estimates = 3.21e+00 The 4 Ritz values closest to 0.40 +0.60i are: 0.5000 - 0.5958i 0.5000 + 0.5958i 0.5000 - 0.6331i 0.5000 + 0.6331i