簡體   English   中英

共軛梯度模塊中的矩陣函數

[英]Matrix function in conjugate gradient module

我正在使用共軛梯度法簡單地解決線性問題A * x = b 我想找到x個未知數。

需要注意的是conjGrad調用函數大道返回產品大道下面的代碼給出:

輸入:

  • A-稀疏矩陣。 2D陣列
  • 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

有沒有簡單的解決方案來避免出現此消息? 任何答案將不勝感激

您實施的CG方法錯誤。 錯誤消息向您顯示出現問題的行之一。

特別是,您的矩陣不是正方形。

A為SPD時,共軛梯度法求解Ax = b

如果像您的情況那樣A不是SPD,那么您仍然可以使用共軛梯度來找到問題的最小二乘解:

A ^ t A x = A ^ tb

矩陣A ^ t A是SPD,非常適合您的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM