def make_banded_jacobian(self):
'''returns a banded jacobian list (in odeint's format), along with mu and ml parameters'''
assert not self.sparse
if self.dense_a_matrix is None:
self.dense_a_matrix = self.sparse_a_matrix.toarray()
matrix = self.dense_a_matrix
# first find the values of mu and ml
dims = matrix.shape[0]
assert dims == matrix.shape[1]
mu = 0
ml = 0
for row in xrange(dims):
for col in xrange(dims):
if matrix[row][col] != 0:
if col > row:
dif = col - row
mu = max(mu, dif)
else:
dif = row - col
ml = max(ml, dif)
banded = []
for yoffset in xrange(-mu, ml+1):
row = []
for diag in xrange(dims):
x_index = diag
y_index = diag + yoffset
if y_index < 0 or y_index >= dims:
row.append(0.0)
else:
row.append(matrix[y_index][x_index])
banded.append(row)
return (banded, mu, ml)
评论列表
文章目录