Уведомления

Группа в Telegram: @pythonsu

#1 Июль 16, 2014 12:09:19

Urung
Зарегистрирован: 2014-07-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь в программировании

Дело в том что модуль sg1 не работает можно ли сделать так чтобы он заработал и как помогите.
/usr/bin/python /home/kardashevskiy/PycharmProjects/tests/qwe1.py
Traceback (most recent call last):
File “/home/kardashevskiy/PycharmProjects/tests/qwe1.py”, line 51, in <module>
v, info = sg1(B, b,tol=1.e-08)
File “/home/kardashevskiy/PycharmProjects/tests/sg1.py”, line 13, in sg1
r=np.dot(B,x)-b
File “/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py”, line 193, in __sub__
raise NotImplementedError('adding a scalar to a sparse ‘
NotImplementedError: adding a scalar to a sparse matrix is not supported

Process finished with exit code 1

import numpy as np
from scipy import sparse

def sg1(B,b,tol=1.0e-8):
“”“
Solve the linear system Ax=b by conjugate gradient method
”“”
n=len(b)
x=np.zeros((n),’float')
r=np.copy(b)
for i in range(n):
r=np.dot(B,x)-b
s=np.copy(r)
As=np.zeros((n),'float')
for k in range(n):
for i in range(n):
As=np.dot(B,s)
alpha=np.dot(r,r)/np.dot(s,As)
x=x-alpha*s
for i in range(n):
r=np.dot(B,x)-b
if np.dot(r,r)<tol**2:
break
else:
beta=-np.dot(r,As)/np.dot(s,As)
s=r+beta*s
return x,k


#Hyperbolic equation
import numpy as np
from scipy import sparse
from scipy.sparse import linalg
from sg1 import sg1
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
def f(x, y, r):
return 2*c*(y-y**2+r*(x**2-x))
def poisson(n, h, r):
V =
I =
J =
b =
for j in range(n):
for i in range(n):
k = i+n*j
b.append(h**2*f(i*h+h, j*h+h, r))
V.append(2.-2*r)
I.append(k)
J.append(k)
if i>0:
V.append(-1.)
I.append(k)
J.append(k-1)
if i<n-1:
V.append(-1.)
I.append(k)
J.append(k+1)
if j>0:
V.append(r)
I.append(k)
J.append(k-n)
if j<n-1:
V.append(r)
I.append(k)
J.append(k+n)
# return ((V, (I,J))), b
return sparse.coo_matrix((V, (I,J))), b
# return()
N =100
h = 1./N
c = 4.
r = 0.4
tst = time.clock()
A, b = poisson(N-1, h, r)
B = A.tocsr()
v, info = sg1(B, b,tol=1.e-08)
dt = time.clock() - tst

if iter == 0:
print “N = %i, time solution = %1.3e” % (N, dt)

fig = plt.figure()
ax = Axes3D(fig)
x = np.linspace(h/2, 1.-h/2, N-1)
y = np.linspace(h/2, 1.-h/2, N-1)
X,Y = np.meshgrid(x, y)
Z = np.reshape(v, (N-1, N-1))
ax.plot_surface(X, Y, Z, rstride=2, cstride=2, cmap='spectral')
plt.show()




Офлайн

#2 Июль 16, 2014 12:22:17

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

Нужна помощь в программировании

Офлайн

#3 Июль 16, 2014 18:02:48

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Нужна помощь в программировании

испоьзуйтеподстветкусинтаксисаатооченьнеудобночитать
ну как? все понятно)) перезалейте код в норм виде и вставьте перед

v, info = sg1(B, b,tol=1.e-08)
print B, b
и покажите что оно выдаст



————————————————
-*- Simple is better than complex -*-

Офлайн

#4 Июль 17, 2014 02:49:38

Urung
Зарегистрирован: 2014-07-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь в программировании

Это модуль который должен работать. В другой программе в котором нет разреженной матрицы она работает

import numpy as np
from scipy import sparse
def sg1(B,b,tol=1.0e-8):
    """
    Solve the linear system Ax=b by conjugate gradient method
    """
    n=len(b)
    x=np.zeros((n),'float')
    r=np.copy(b)
    for i in range(n):
        r[i]=np.dot(B[i,0:n],x[0:n])-b[i]
    s=np.copy(r)
    As=np.zeros((n),'float')
    for k in range(n):
        for i in range(n):
            As[i]=np.dot(B[i,0:n],s[0:n])
        alpha=np.dot(r,r)/np.dot(s,As)
        x=x-alpha*s
        for i in range(n):
            r[i]=np.dot(B[i,0:n],x[0:n])-b[i]
        if np.dot(r,r)<tol**2:
            break
        else:
            beta=-np.dot(r,As)/np.dot(s,As)
            s=r+beta*s
    return x,k
А вот основная программа в которой этот модуль должен работать но не хочет вроде dot не поддерживает разреженные матрицы как сделать так чтобы заработала помогите
import numpy as np
from scipy import sparse
from scipy.sparse import linalg
from sg1 import sg1
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import time
def f(x, y, r):
    return 2*c*(y-y**2+r*(x**2-x))
def poisson(n, h, r):
    V = []
    I = []
    J = []
    b = []
    for j in range(n):
        for i in range(n):
            k = i+n*j
            b.append(h**2*f(i*h+h, j*h+h, r))
            V.append(2.-2*r)
            I.append(k)
            J.append(k)
            if i>0:
                V.append(-1.)
                I.append(k)
                J.append(k-1)
            if i<n-1:
                V.append(-1.)
                I.append(k)
                J.append(k+1)
            if j>0:
                V.append(r)
                I.append(k)
                J.append(k-n)
            if j<n-1:
                V.append(r)
                I.append(k)
                J.append(k+n)
    return sparse.coo_matrix((V, (I,J))), b
N =100
h = 1./N
c = 4.
r = 0.4
tst = time.clock()
A, b = poisson(N-1, h, r)
B = A.tocsr()
v, info = sg1(B, b,tol=1.e-08)
dt = time.clock() - tst
if iter == 0:
    print "N = %i, time solution = %1.3e" % (N, dt)
fig = plt.figure()
ax = Axes3D(fig)
x = np.linspace(h/2, 1.-h/2, N-1)
y = np.linspace(h/2, 1.-h/2, N-1)
X,Y = np.meshgrid(x, y)
Z = np.reshape(v, (N-1, N-1))
ax.plot_surface(X, Y, Z, rstride=2, cstride=2, cmap='spectral')
plt.show()
выдает вот такую ошибку
Traceback (most recent call last):
  File "/home/kardashevskiy/PycharmProjects/tests/qwe1.py", line 47, in <module>
    v, info = sg1(B, b,tol=1.e-08)
  File "/home/kardashevskiy/PycharmProjects/tests/sg1.py", line 13, in sg1
    r[i]=np.dot(B[i,0:n],x[0:n])-b[i]
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 193, in __sub__
    raise NotImplementedError('adding a scalar to a sparse '
NotImplementedError: adding a scalar to a sparse matrix is not supported
Process finished with exit code 1

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version