如何在matlab中用共轭梯度算法解决这个系统

计算科学 共轭梯度
2021-12-18 09:36:41

CG算法 https://skydrive.live.com/redir?resid=E0ED7271C68BE47C!386&v=3

方程组、问题和示例 https://skydrive.live.com/redir?resid=E0ED7271C68BE47C!387&v=3

% below result is only accurate at decimal 0.1, but not the tolerate, why? 
% is the conjugate gradient algorithm only for square matrix A's system?
% about the lambda1 + lambda2 = 1, how embedded this in algorithm?
% below is Matlab Code

w = CGResult(1);
lambda1 = CGResult(2);
lambda2 = CGResult(3);
(w+13/35*lambda1+47/140*lambda2) >= 2/5
(w+57/140*lambda1+61/140*lambda2) >= 2/5
(w+31/140*lambda1+8/35*lambda2) >= 1/5


A = [1, 13/35, 47/140; 
1, 57/140, 61/140;
1, 31/140, 8/35;];
b = [2/5;2/5;1/5;];
tol = 0.0000000000001;
Max = 10000;
x2 = [0.5;0.5;0.5];
n2 = 3;
MartinCG(x2, A, b, Max, tol, n2);

% Why only for Square Matrix, How about Non Square Matrix A

function CGResult = MartinCG(x2, A, b, Max, tol, n3)
r = zeros(n3);
x = zeros(n3,Max-1);
x(:,1) = x2;
r = zeros(n3,Max-1);
v = zeros(n3,Max-1);
t = zeros(n3,Max-1);
dum = zeros(n,n);
r(:,1) = b - A*x(:,1);
v(:,1) = r(:,1);
for k=1:1:Max-3
    k
    testnorm = norm(v(:,k))
    if (norm(v(:,k)) == 0)
        break;
    end 
    t(:,k) = (r(:,k).*r(:,k))./(v(:,k).*(A*v(:,k)));
    x(:,k+1) = x(:,k) + (t(:,k).*v(:,k));
    r(:,k+1) = r(:,k) - t(:,k).*(A*v(:,k));
    testnorm2 = norm(r(:,k+1))
    if (norm(r(:,k+1)) < tol)
        break;
    end
    v(:,k+1) = r(:,k+1) + (r(:,k+1).*r(:,k+1))./(r(:,k).*r(:,k)).*v(:,k);
end
CGResult = x(:,k+1);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%

当真正计算示例时,我的代码不适用于 6*3 Matrix A

A = [1, 13/35, 47/140; 
1, -13/35, -47/140;
1, 57/140, 61/140;
-2/5, -57/140, -61/140;
1/5, 31/140, 8/35;
-1/5, -31/140, -8/35;];
b = [2/5;-2/5;2/5;-2/5;1/5;-1/5;];
2个回答

粗略浏览一下共轭梯度 (CG) 方法的 Wikipedia 页面将说明为什么 CG 不适用于您的特定线性方程组:CG 旨在解决系统其中对称和正定的Ax=bA

这两个条件自然也要求是正方形。由于您的线性系统不满足任何这些条件,因此共轭梯度没有理由收敛到具有任意右手边的任意非方阵的有效解。A

你的问题没有包含足够的细节来理解你在做什么以及你想做什么。但是,如果我理解您的权利,那么您正在尝试将共轭梯度法应用于矩阵不是正方形这是行不通的——CG 只能处理方阵。此外,如果不是正方形的,那么当您要求这样一个系统的“解决方案”时,您需要考虑它到底是什么意思,因为一般来说,要么有无限多(欠定),要么没有(超定)。Ax=bAA