我想实现Gauss-Seidel算法。 下面的代码不正确,因为U [i,j]的计算必须使用当前迭代中已经计算的U [h,k]。
for k in xrange(s):
U[1:nx, 1:ny] = (1 - 4*gamma)*U[1:nx, 1:ny] + gamma*(
U[:nx-1, 1:ny]
+ U[2:, 1:ny]
+ U[1:nx, :ny-1]
+ U[1:nx, 2:])
是否可以修改就地U [1:nx,1:ny]?
例如,假设我们有ufunc:
f = lambda u, a, b, c, d: (1 - 4*gamma)*u + gamma*(a+b+c+d)
然后,可能会写出类似的东西:
for k in xrange(1):
f(U[1:nx, 1:ny], U[:nx-1, 1:ny], U[2:, 1:ny], U[1:nx, :ny-1], U[1:nx, 2:],
out=U[1:nx, 1:ny])