2013-09-18 6 views
1

Я решаю просто линейную задачу A * x = b с использованием метода сопряженных градиентов. Я хочу найти x неизвестным.Матричная функция в модуле сопряженного градиента

Обратите внимание, что conjGrad вызывает функцию Av, которая возвращает Av по продукту код приведен ниже:

входы:

  • A - разреженная матрица. 2D-массив;
  • b - правая сторона вектора. 1D массив;
  • x - первоначальная догадка. Здесь это всего лишь 1D массив с нулевыми значениями.

Код:

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 

Есть ли простое решение, чтобы избежать этого сообщения? Любые ответы будут оценены

ответ

1

Вы внедрили метод CG неправильно. Сообщение об ошибке показывает одну из строк, где есть проблема.

В частности, ваша матрица не квадратная.

+0

Я думаю, что число уравнений не обязательно должно быть равно числу неизвестных, что означает недоопределенную (не квадратную матрицу). Как вы думаете, можно ли найти решение x с точными матрицами MxN (A) и M 1D (b) с использованием вышеупомянутого алгоритма CG? Как я могу создать вторую функцию ** Av (v) **, чтобы удалить эту ошибку? – Spider

0

Метод сопряженных градиентов решает для Ax = Ь, когда является СПД.

Если А не СПД, как в вашем случае, то вы можете использовать сопряженные градиенты, чтобы найти решение по методу наименьших квадратов для вашей проблемы:

А^т А х = А^ТБ

Матрица A^t A SPD и хорошо подходит для вашего метода.

Смежные вопросы