import numpy as np nx=3 nz=4 flux2 = np.empty((nx+1, nz+1)) flux2[:] = np.random.normal(size=(nx+1, nz+1)) flux3 = flux2.copy() bz = np.random.normal(size=(nx+1, nz+1)) bx = np.random.normal(size=(nx+1, nz+1)) dz = 0.112344 dx = 0.015543 for i in np.arange(1,nx+1): for j in np.arange(1,nz+1): flux2[i,j] = 0.5*(flux2[i-1,j] + bz[i-1,j]*dx) + 0.5*(flux2[i,j-1] - bx[i,j-1]*dz) a = 0.5 aexp = np.arange(nz).reshape(nz, 1) - np.arange(nz).reshape(1, nz) abcoeff = 0.5**aexp abcoeff[aexp<0] = 0 for i in np.arange(1,nx+1): b = 0.5*flux3[i-1, 1:] + 0.5*bz[i-1, 1:]*dx - 0.5*bx[i,:-1]*dz bvals = (abcoeff * b.reshape(1, nz)).sum(axis=1) n = np.arange(1, nz+1) x0 = flux3[i, 0] #ab = b * np.cumsum(a**(n-1)) flux3[i, 1:] = a**n * x0 + bvals print np.abs(flux2-flux3) < 1e-15