当 poly1d 是非常大的整数时,它们会给出错误的系数
poly1d gives erroneous coefficients when they are very large integers
我在 ubuntu 16.04.2 LTS 和 NumPy 1.12.1 中使用 python 3.5.2。当我使用 poly1d 函数获取系数时,计算出现错误:
>>> from numpy import poly1d
>>> from math import fabs
>>> pol = poly1d([2357888,459987,78123455],True)
>>>[int(x) for x in pol.coeffs]
[1, -80941330, 221226728585581, -84732529566356586496]
如您在此列表中所见,最后一个元素不正确。当我使用 Wolfram Alpha 构建多项式时,我得到:
x^3 - 80941330 x^2 + 221226728585581 x - 84732529566356580480
最后一个系数使用 poly1d 时不同(第一个以 ...496 结尾,另一个以 ...480 结尾)。我必须假设正确的是最后一个计算(由 WolframAlpha 制作) ).
这是一个错误还是我没有考虑到什么?我用绝对值低的根进行了探索;在这种情况下,计算是正确的。但是当我使用 "big roots" 时,差异很明显。
系数存储为 64 位浮点值。这些没有足够的精度来准确表示值 -84732529566356580480。
正如 Warren Weckesser 所说,这是一个精度问题。但它可以通过将根数组声明为对象类型来解决。通过这种方式,您可以利用 Python 的大整数,或 mpmath
对象提供的更高精度。 NumPy 够体贴not to coerce them to double precision。示例:
import numpy as np
roots = np.array([2357888, 459987, 78123455], dtype=object)
pol = np.poly1d(roots, True)
print(pol.coeffs)
输出:[1 -80941330 221226728585581 -84732529566356580480]
我在 ubuntu 16.04.2 LTS 和 NumPy 1.12.1 中使用 python 3.5.2。当我使用 poly1d 函数获取系数时,计算出现错误:
>>> from numpy import poly1d
>>> from math import fabs
>>> pol = poly1d([2357888,459987,78123455],True)
>>>[int(x) for x in pol.coeffs]
[1, -80941330, 221226728585581, -84732529566356586496]
如您在此列表中所见,最后一个元素不正确。当我使用 Wolfram Alpha 构建多项式时,我得到:
x^3 - 80941330 x^2 + 221226728585581 x - 84732529566356580480
最后一个系数使用 poly1d 时不同(第一个以 ...496 结尾,另一个以 ...480 结尾)。我必须假设正确的是最后一个计算(由 WolframAlpha 制作) ).
这是一个错误还是我没有考虑到什么?我用绝对值低的根进行了探索;在这种情况下,计算是正确的。但是当我使用 "big roots" 时,差异很明显。
系数存储为 64 位浮点值。这些没有足够的精度来准确表示值 -84732529566356580480。
正如 Warren Weckesser 所说,这是一个精度问题。但它可以通过将根数组声明为对象类型来解决。通过这种方式,您可以利用 Python 的大整数,或 mpmath
对象提供的更高精度。 NumPy 够体贴not to coerce them to double precision。示例:
import numpy as np
roots = np.array([2357888, 459987, 78123455], dtype=object)
pol = np.poly1d(roots, True)
print(pol.coeffs)
输出:[1 -80941330 221226728585581 -84732529566356580480]