Форум сайта python.su
Дело в том что модуль 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()
Офлайн
Офлайн
испоьзуйтеподстветкусинтаксисаатооченьнеудобночитать
ну как? все понятно)) перезалейте код в норм виде и вставьте перед
v, info = sg1(B, b,tol=1.e-08)
print B, b
Офлайн
Это модуль который должен работать. В другой программе в котором нет разреженной матрицы она работает
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
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
Офлайн