Библиотека Python для итеративного решателя Гаусса-Зайделя? - PullRequest
4 голосов
/ 11 апреля 2011

Существует ли библиотека линейной алгебры, которая реализует итеративный метод Гаусса-Зейделя для решения линейных систем?Или, может быть, предопределенное решение для градиента?

Спасибо

РЕДАКТИРОВАТЬ: В конце концов я использовал какой-то грубый, но правильный способ ее решения.Так как я все равно должен был создать матрицу A (для Ax = b), я разделил матрицу как

A = M - N

с

 M = (D + L) and N = -U

, где D - диагональ, L - нижняятреугольное сечение, а U верхнее треугольное сечение.Затем

Pinv = scipy.linalg.inv(M)
x_k_1 = np.dot(Pinv,np.dot(N,x_k)) + np.dot(Pinv,b)

Также были проведены некоторые тесты сходимости.Это работает.

Ответы [ 2 ]

3 голосов
/ 11 апреля 2011

Вот пример реализации, где они проходят различные реализации здесь:

http://www.scipy.org/PerformancePython

другой пример здесь:

http://www.dur.ac.uk/physics.astrolab/py_source/kiusalaas/v1_with_numpy/gaussSeidel.py

Вы также можете проверить привязки Python для petsc:

http://code.google.com/p/petsc4py/

0 голосов
/ 23 мая 2011
from sage.all import *

a=matrix(QQ,[[12,3,-5],[1,5,3],[3,7,13]])

b=matrix(QQ,[[1],[28],[76]])


x=[]
r=len(a[0])
i=0
while(i<r):
    li=raw_input('give approximate solution :')
    h=eval(li)
    x.append(h)
    i=i+1


def gausseidel():
    tol=0.00001;l=0;itern=10
    fnd=0

    while(l<itern and fnd==0):
        j=0
        while(j<r):
            temp=b[j,0]
            k=0
            while(k<r):
                if (j!=k):
                    temp-=a[j,k]*x[k]
                k=k+1
            c=temp/a[j,j]

            if (abs(x[j]-c)<=tol):
                fnd=1
                break
            x[j]=c
            j=j+1
        l=l+1
        if l==itern:
            print "Iterations are over"

    for p in range(r):
        print 'x',p,'=',float(x[p])


gausseidel()
...