Python 共轭梯度模中的矩阵函数
我正在用共轭梯度法解决一个简单的线性问题A*x=b。我想找到未知的x 请注意,conjGrad调用函数Av,该函数返回产品Av 代码如下: 输入: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-稀疏矩阵。二维阵列李>
- 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)来消除该错误?