我正在尝试在Jupyter Notebook中实现GMRES,这是(以防您不知道):

python - 我的GMRES实现有什么问题?-LMLPHP

这是我的代码:

import numpy as np

def GMRes(A, b, x0, e, nmax_iter, restart=None):
    r = b - np.asarray(np.dot(A, x0)).reshape(-1)

    x = []
    q = [0] * (nmax_iter)

    x.append(r)

    q[0] = r / np.linalg.norm(r)

    h = np.zeros((nmax_iter + 1, nmax_iter))

    for k in range(nmax_iter):
        y = np.asarray(np.dot(A, q[k])).reshape(-1)

        for j in range(k):
            h[j, k] = np.dot(q[j], y)
            y = y - h[j, k] * q[j]
        h[k + 1, k] = np.linalg.norm(y)
        if (h[k + 1, k] != 0 and k != nmax_iter - 1):
            q[k + 1] = y / h[k + 1, k]

        b = np.zeros(nmax_iter + 1)
        b[0] = np.linalg.norm(r)

        result = np.linalg.lstsq(h, b)[0]

        x.append(np.dot(np.asarray(q).transpose(), result) + x0)

    return x

据我说这应该是正确的,但是当我执行时:
A = np.matrix('1 1; 3 -4')
b = np.array([3, 2])
x0 = np.array([1, 2])

e = 0
nmax_iter = 5

x = GMRes(A, b, x0, e, nmax_iter)

print(x)

注意:目前e没有执行任何操作。

我得到这个:
[array([0, 7]), array([ 1.,  2.]), array([ 1.35945946,  0.56216216]), array([ 1.73194463,  0.80759216]), array([ 2.01712479,  0.96133459]), array([ 2.01621042,  0.95180204])]
x[k]应该接近(32/7, -11/7),因为这是结果,但是相反,它接近(2, 1),我在做什么错?

最佳答案

我认为该算法给出了正确的结果。

您正在尝试求解Ax = b,其中:

如果尝试手动查找解决方案,则要解决的矩阵运算等效于可以使用替换来求解的系统。

如果您尝试解决它,您将看到解决方案是:

这是您的算法提供的相同解决方案。

您可以使用scipy中已经存在的GMRES实现再次检查:

import scipy.sparse.linalg as spla
import numpy as np

A = np.matrix('1 1; 3 -4')
b = np.array([3, 2])
x0 = np.array([1, 2])
spla.gmres(A,b,x0)

哪个输出
array([ 2.,  1.])

关于python - 我的GMRES实现有什么问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37962271/

10-11 13:26