diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2012-01-30 20:10:52 -0700 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2012-02-05 17:03:27 -0700 |
commit | ef767a54fae8977cb15d7e0849a8cb626c4b0f2c (patch) | |
tree | ef00849723a251b4a485de182c7b316a7cf9facb /numpy/polynomial/chebyshev.py | |
parent | 13010c7f1b338a6286a4b4bb7376a1f3df833d24 (diff) | |
download | numpy-ef767a54fae8977cb15d7e0849a8cb626c4b0f2c.tar.gz |
ENH: Improve the computation of polynomials from roots.
The original method was overly sensitive to roundoff. Of the two
approaches considered, gauss integration or binary subdivision of
the roots, the latter is more compatible with using other number
representations such as mpmath. No method is going to be suitable
for large numbers of arbitrary zeros but the current method is a
significant improvement.
Diffstat (limited to 'numpy/polynomial/chebyshev.py')
-rw-r--r-- | numpy/polynomial/chebyshev.py | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/numpy/polynomial/chebyshev.py b/numpy/polynomial/chebyshev.py index 022dccfa7..ab4c96a54 100644 --- a/numpy/polynomial/chebyshev.py +++ b/numpy/polynomial/chebyshev.py @@ -540,10 +540,17 @@ def chebfromroots(roots) : return np.ones(1) else : [roots] = pu.as_series([roots], trim=False) - prd = np.array([1], dtype=roots.dtype) - for r in roots: - prd = chebsub(chebmulx(prd), r*prd) - return prd + roots.sort() + n = len(roots) + p = [chebline(-r, 1) for r in roots] + while n > 1: + m = n//2 + tmp = [chebmul(p[i], p[i+m]) for i in range(m)] + if n%2: + tmp[0] = chebmul(tmp[0], p[-1]) + p = tmp + n = m + return p[0] def chebadd(c1, c2): |