def _gauss_from_coefficients_sympy(alpha, beta):
assert isinstance(alpha[0], sympy.Rational)
# Construct the triadiagonal matrix [sqrt(beta), alpha, sqrt(beta)]
A = _sympy_tridiag(alpha, [sympy.sqrt(bta) for bta in beta])
# Extract points and weights from eigenproblem
x = []
w = []
for item in A.eigenvects():
val, multiplicity, vec = item
assert multiplicity == 1
assert len(vec) == 1
vec = vec[0]
x.append(val)
norm2 = sum([v**2 for v in vec])
# simplifiction takes really long
# w.append(sympy.simplify(beta[0] * vec[0]**2 / norm2))
w.append(beta[0] * vec[0]**2 / norm2)
# sort by x
order = sorted(range(len(x)), key=lambda i: x[i])
x = [x[i] for i in order]
w = [w[i] for i in order]
return x, w
评论列表
文章目录