|
|
@ -991,20 +991,20 @@ class _Gaussq(object):
|
|
|
|
args = np.broadcast_arrays(*np.atleast_1d(a, b, *args))
|
|
|
|
args = np.broadcast_arrays(*np.atleast_1d(a, b, *args))
|
|
|
|
a_shape = args[0].shape
|
|
|
|
a_shape = args[0].shape
|
|
|
|
args = [np.reshape(x, (-1, 1)) for x in args]
|
|
|
|
args = [np.reshape(x, (-1, 1)) for x in args]
|
|
|
|
A, B = args[:2]
|
|
|
|
a_out, b_out = args[:2]
|
|
|
|
args = args[2:]
|
|
|
|
args = args[2:]
|
|
|
|
if wfun in [2, 3]:
|
|
|
|
if wfun in [2, 3]:
|
|
|
|
A = zeros((A.size, 1))
|
|
|
|
a_out = zeros((a_out.size, 1))
|
|
|
|
return A, B, args, a_shape
|
|
|
|
return a_out, b_out, args, a_shape
|
|
|
|
|
|
|
|
|
|
|
|
def __call__(self, fun, a, b, releps=1e-3, abseps=1e-3, alpha=0, beta=0,
|
|
|
|
def __call__(self, fun, a, b, releps=1e-3, abseps=1e-3, alpha=0, beta=0,
|
|
|
|
wfun=1, trace=False, args=(), max_iter=11):
|
|
|
|
wfun=1, trace=False, args=(), max_iter=11):
|
|
|
|
self.trace = trace
|
|
|
|
self.trace = trace
|
|
|
|
gn = 2
|
|
|
|
gn = 2
|
|
|
|
|
|
|
|
|
|
|
|
A, B, args, a_shape = self._initialize(wfun, a, b, args)
|
|
|
|
aa, bb, args, a_shape = self._initialize(wfun, a, b, args)
|
|
|
|
|
|
|
|
|
|
|
|
jacob = self._get_jacob(wfun, A, B)
|
|
|
|
jacob = self._get_jacob(wfun, aa, bb)
|
|
|
|
shift = int(wfun in [1, 4, 5, 6])
|
|
|
|
shift = int(wfun in [1, 4, 5, 6])
|
|
|
|
dx = self._get_dx(wfun, jacob, alpha, beta)
|
|
|
|
dx = self._get_dx(wfun, jacob, alpha, beta)
|
|
|
|
|
|
|
|
|
|
|
@ -1013,14 +1013,14 @@ class _Gaussq(object):
|
|
|
|
# Break out of the iteration loop for three reasons:
|
|
|
|
# Break out of the iteration loop for three reasons:
|
|
|
|
# 1) the last update is very small (compared to int and to releps)
|
|
|
|
# 1) the last update is very small (compared to int and to releps)
|
|
|
|
# 2) There are more than 11 iterations. This should NEVER happen.
|
|
|
|
# 2) There are more than 11 iterations. This should NEVER happen.
|
|
|
|
dtype = np.result_type(fun((A+B)*0.5, *args))
|
|
|
|
dtype = np.result_type(fun((aa+bb)*0.5, *args))
|
|
|
|
nk = np.prod(a_shape) # # of integrals we have to compute
|
|
|
|
nk = np.prod(a_shape) # # of integrals we have to compute
|
|
|
|
k = np.arange(nk)
|
|
|
|
k = np.arange(nk)
|
|
|
|
opts = (nk, dtype)
|
|
|
|
opts = (nk, dtype)
|
|
|
|
val, val_old, abserr = zeros(*opts), ones(*opts), zeros(*opts)
|
|
|
|
val, val_old, abserr = zeros(*opts), ones(*opts), zeros(*opts)
|
|
|
|
for i in range(max_iter):
|
|
|
|
for i in range(max_iter):
|
|
|
|
xn, w = self._points_and_weights(gn, wfun, alpha, beta)
|
|
|
|
xn, w = self._points_and_weights(gn, wfun, alpha, beta)
|
|
|
|
x = (xn + shift) * jacob[k, :] + A[k, :]
|
|
|
|
x = (xn + shift) * jacob[k, :] + aa[k, :]
|
|
|
|
|
|
|
|
|
|
|
|
pari = [xi[k, :] for xi in args]
|
|
|
|
pari = [xi[k, :] for xi in args]
|
|
|
|
y = fun(x, *pari)
|
|
|
|
y = fun(x, *pari)
|
|
|
|