如何使用GMRES到矩阵而不是向量?

时间:2016-02-17 12:26:41

标签: matlab matrix numerical-methods

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实际上是使用有限差分的二阶导数矩阵

谢谢 阿米尔

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想用GMRES来解决一个sylvester equation

A*X + X*A = C

表示n-by-n矩阵AXC。 (我昨天在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);