Python 共轭梯度模中的矩阵函数

Python 共轭梯度模中的矩阵函数,python,scipy,iteration,sparse-matrix,Python,Scipy,Iteration,Sparse Matrix,我正在用共轭梯度法解决一个简单的线性问题A*x=b。我想找到未知的x 请注意,conjGrad调用函数Av,该函数返回产品Av 代码如下: 输入: A-稀疏矩阵。二维阵列 b-右侧向量。一维阵列 x-初步猜测。在这里,它只是具有零值的一维数组 代码: import numpy as np import math A = np.array([[ 0.56244579, 0. , 0. , 0. , 0.52936075, 0.

我正在用共轭梯度法解决一个简单的线性问题A*x=b。我想找到未知的x

请注意,conjGrad调用函数Av,该函数返回产品Av 代码如下:

输入:

  • A-稀疏矩阵。二维阵列
  • b-右侧向量。一维阵列
  • x-初步猜测。在这里,它只是具有零值的一维数组
代码:

import numpy as np
import math

A = np.array([[ 0.56244579,  0.        ,  0.        ,  0.        ,  0.52936075,
        0.59553084,  0.        ,  0.        ,  0.        ,  1.1248915 ,
        0.        ,  0.        ,  0.        ,  0.46319065,  0.43672262,
        0.        ],
      [ 0.5       ,  1.        ,  1.        ,  0.5       ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ],
      [ 0.        ,  0.        ,  0.        ,  0.58009067,  0.        ,
        0.        ,  0.75411788,  0.40606347,  0.        ,  0.        ,
        0.23203627,  0.        ,  0.        ,  0.        ,  0.        ,
        0.        ]])

x = np.array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
    0.,  0.,  0.])

b = np.array([ 3.99464617,  1.81663614,  1.86413003])

def Av(v):
return np.dot(A,v)

def conjGrad(Av, x, b, tol=1.0e-9):
     n = len(b)
     r = b - Av(x)
     s = r.copy()
     for i in range(n):
           u = Av(s)
           alpha = np.dot(s,r)/np.dot(s,u)
           x = x + aplha*s
           r = b - Av(x)
           if(math.sqrt(np.dot(r,r))) < tol:
                 break
           else:
                 beta = - np.dot(r,u)/np.dot(s,u)
                 s = r + beta * s
     return x,i

if __name__ == '__main__':
    x, iter_number = conjGrad(Av, x, b) 


 Traceback (most recent call last):
   File "C:\Python27\Conjugate_Gradient.py", line 59, in <module>
     x, iter_number = conjGrad(Av, x, b)
   File "C:\Python27\Conjugate_Gradient.py", line 47, in conjGrad
     u = Av(s)
   File "C:\Python27\Conjugate_Gradient.py", line 40, in Av
     return np.dot(A,v)
 ValueError: matrices are not aligned
将numpy导入为np
输入数学
A=np.数组([[0.56244579,0,0,0,0,0.52936075,
0.59553084,  0.        ,  0.        ,  0.        ,  1.1248915 ,
0.        ,  0.        ,  0.        ,  0.46319065,  0.43672262,
0.        ],
[ 0.5       ,  1.        ,  1.        ,  0.5       ,  0.        ,
0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
0.        ,  0.        ,  0.        ,  0.        ,  0.        ,
0.        ],
[ 0.        ,  0.        ,  0.        ,  0.58009067,  0.        ,
0.        ,  0.75411788,  0.40606347,  0.        ,  0.        ,
0.23203627,  0.        ,  0.        ,  0.        ,  0.        ,
0.        ]])
x=np.数组([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,。,
0.,  0.,  0.])
b=np.数组([3.99464617,1.81663614,1.86413003])
def Av(v):
返回np.点(A,v)
def CONGIGRAD(Av、x、b、tol=1.0e-9):
n=len(b)
r=b-Av(x)
s=r.copy()
对于范围(n)中的i:
u=Av(s)
α=np点(s,r)/np点(s,u)
x=x+aplha*s
r=b-Av(x)
如果(数学sqrt(np.dot(r,r))

是否有任何简单的解决方案可以避免此消息?如果您错误地使用了CG方法,我们将不胜感激。错误消息将显示出现问题的行之一


特别是,您的矩阵不是正方形。

您错误地实现了CG方法。错误消息将显示出现问题的行之一


特别是,你的矩阵不是正方形。

A为SPD时,共轭梯度法求解Ax=b

如果A不是SPD(如您的情况),那么您仍然可以使用共轭梯度为您的问题找到最小二乘解:

A^tax=A^tb


矩阵A^t A是SPD,非常适合您的方法

A为SPD时,共轭梯度法求解Ax=b

如果A不是SPD(如您的情况),那么您仍然可以使用共轭梯度为您的问题找到最小二乘解:

A^tax=A^tb


矩阵A^t A是SPD,非常适合您的方法

我认为,方程的数量不一定等于未知数的数量,这意味着未确定(不是方阵)。您认为使用上述CG算法是否有可能用精确的MxN矩阵(A)和M1D阵列(b)找到x解?我怎样才能创建第二个函数Av(v)来消除这个误差呢?我认为,方程的数量不一定等于未知数的数量,这意味着未确定(不是方阵)。您认为使用上述CG算法是否有可能用精确的MxN矩阵(A)和M1D阵列(b)找到x解?如何创建第二个函数Av(v)来消除该错误?