Trong chủ đề trước , cách nhân số sau đây để kết hợp các điều kiện tiên quyết đối xứng và P 2 cho hệ thống đối xứng A x = b đã được đề xuất: P - 1 combo : = P - 1 1 + P - 1 2 ( I - A P - 1 1 ) = P - 1 1 + P - 1 2 - P -
Điều kiện tiên quyết kết hợp này không đối xứng. Tuy nhiên, tôi đã thử sử dụng nó trong mọi cách liên kết gradient trong một số bối cảnh khác nhau và phương thức này dường như luôn hội tụ tốt. Tại sao lại thế này?
Ví dụ 1: Ma trận ngẫu nhiên.
% Testing multiplicative combination of preconditioners
n = 500;
[U,S,~] = svd(randn(n,n)); A = U*S*U';
[W1,S1,~] = svd(randn(n,n)); noise1 = W1*S1*W1';
[W2,S2,~] = svd(randn(n,n)); noise2 = W2*S2*W2';
P1 = A + 0.5 * noise1;
P2 = A + 0.5 * noise2;
solve_P = @(x) P1\x + P2\x - P2\(A*(P1\x));
b = randn(n,1);
x_true = A\b;
pcg(A,b,1e-6,n);
pcg(A,b,1e-6,n,P1);
x = pcg(A,b,1e-6,n,solve_P);
norm(x_true - x)/norm(x_true)
Đây là đầu ra tôi nhận được:
pcg converged at iteration 127 to a solution with relative residual 9.9e-07.
pcg converged at iteration 62 to a solution with relative residual 6.8e-07.
pcg converged at iteration 51 to a solution with relative residual 8.1e-07.
relative error= 4.23e-07
Ví dụ 2: Kết hợp multigrid với cholesky không hoàn chỉnh để giải phương trình Poisson.
n = 50; N = n^2;
A = gallery('poisson',n); %Laplacian on n-by-n grid, zero dirichlet BC
L = ichol(A);
solve_P1 = @(x) L'\(L\x);
% Combinatorial multigrid: http://www.cs.cmu.edu/~jkoutis/cmg.html
solve_P2 = cmg_sdd(A);
solve_P = @(x) solve_P1(x) + solve_P2(x) - solve_P1(A*solve_P2(x));
b = randn(N,1);
x_true = A\b;
pcg(A,b,1e-6,N);
pcg(A,b,1e-6,N,solve_P1);
pcg(A,b,1e-6,N,solve_P2);
x = pcg(A,b,1e-6,N,solve_P);
disp(['relative error= ', num2str(norm(x_true - x)/norm(x_true),3)])
Đối với điều này, tôi nhận được kết quả:
pcg converged at iteration 131 to a solution with relative residual 8.4e-07.
pcg converged at iteration 44 to a solution with relative residual 6e-07.
pcg converged at iteration 19 to a solution with relative residual 7e-07.
pcg converged at iteration 12 to a solution with relative residual 4.7e-07.
relative error= 5.2e-07
Ghi chú:
- Tôi cũng đã thấy hành vi định tính tương tự trên ma trận phát sinh trong các tình huống phức tạp / thực tế hơn.