GMRES算法及其matlab实现应该用于求解线性方程组,如
%Ax = b
A = rand(4);
b = rand(4,1);
x = gmres(A,b);
还可以使用函数句柄 foo = @(x)A * x + conj(A)* 5 * x; y = gmres(foo,b);
我想要的是解决以下问题
B = rand(4);
H = rand(4);
foo2 = H*B + B*H;
X = gmres(foo2, B) %Will not run!
--Error using gmres (line 94)
--Right hand side must be a column vector of length 30 to match the coefficient matrix.
从数学上讲,我不明白为什么gmres也不适用于这个问题。
注意:我真正想要解决的是PDE dB/dt = B_xx + B_yy
的隐式euler方法,因此H
实际上是使用有限差分的二阶导数矩阵
谢谢 阿米尔
答案 0 :(得分:1)
如果我理解正确,你想用GMRES来解决一个sylvester equation
A*X + X*A = C
表示n-by-n矩阵A
,X
和C
。
(我昨天在related question问了一个SciComp并得到了this great answer。)
要使用GMRES,您可以将此矩阵 - 矩阵方程表示为大小n^2
矩阵向量方程。为方便起见,我们可以使用Kronecker product,在MATLAB中使用kron
实现:
A = randn(5);
X = randi(3,[5 5]);
C = A*X + X*A;
% Use the Kronecker product to form an n^2-by-n^2 matrix
% A*X + X*A
bigA = (kron(eye(5),A) + kron(A.',eye(5)));
% Quick check that we're getting the same answer
norm(bigA*X(:) - C(:))
% Use GMRES to calculate X from A and C.
vec_X_gmres = gmres(bigA,C(:));
X_gmres = reshape(vec_X_gmres,5,5);