Python numpy poly()和roots()不是';不可逆?

Python numpy poly()和roots()不是';不可逆?,python,numpy,Python,Numpy,我希望poly()和root()函数是彼此的逆函数。然而,事实并非如此: # Polys coeffs pol_c = np.poly([-1, 1, 1, 10]) # Get Polynomial coeffs for eqt with stated roots # Roots from the poly equation root_val = np.roots(pol_c) # Roots from the poly equation, manually entered as intege

我希望poly()和root()函数是彼此的逆函数。然而,事实并非如此:

# Polys coeffs
pol_c = np.poly([-1, 1, 1, 10]) # Get Polynomial coeffs for eqt with stated roots
# Roots from the poly equation
root_val = np.roots(pol_c)
# Roots from the poly equation, manually entered as integers
roots_v2 = np.roots([1,-11,9,11,-10])

print(pol_c)
print(root_val)
print(roots_v2)
给予

[1.-11.9.11.-10]

[10.+0.0000000e+00j-1.+0.0000000e+00j 1.+9.6357437e-09j 1.-9.6357437e-09j]

[10.+0.0000000e+00j-1.+0.0000000e+00j 1.+9.6357437e-09j 1.-9.6357437e-09j]

也就是说,第三和第四根(稍微)是虚构的,而不是真实的


我的第一个想法是浮点错误,但考虑到root()输出的浮点和int输入的答案似乎与此不同。另外,如果浮点精度限制了求解,我希望poly()会给出非整数的答案。

这些函数是彼此相反的,在某些计算错误(可能很复杂)范围内,直到根的重新排序

pol_c = np.poly([-1, 1, 1, 10]) 
root_val = np.roots(pol_c)
print(np.real_if_close(np.around(root_val, 6)))
打印
[10.-1.1.1.]
,与我们开始时相同,顺序不同


当然,顺序不一定是相同的:当
pol_c
形成时,根的原始顺序会丢失,而且多项式(通常是复杂的)的根也没有标准顺序

我不确定你在“1对10”问题上的用意,我觉得这些都是对的。所有的根查找都是在复杂的空间中进行的,所以我们得到复杂的结果,或者输出中有一点错误,这并不奇怪。你是对的。当我提交时分心了,我想“哦,我错过了一个数量级的错误,奇怪”。然后很快把它添加到问题中。编辑以确定您的问题是什么?为什么结果不一样?为什么会有一个复杂的组件?两者是否是各自的反比?是的,我的问题是这些。显然,多边形和根是理论上的反比,但它们不是。为什么?谢谢!所以这是根()中底层解算器的一个限制?在一个有精确解的玩具例子中,我期望收敛性比10e-9好。这里有一个双根。请注意,
(x-1.+9.6357437e-09j)(x-1.-9.6357437e-09j)
的系数与
(x-1)^2
的系数在双精度下无法区分,因此从数值角度来看,这些根同样可信。解算器无法判断
1
1
是“正确”的根:多项式系数中不再存在这些信息。hm?对不起,我不明白--双精度包含16个sig的信息。为什么解算器仅限于e-9精度?我可以理解解算器的终止精度是否低于浮点精度,但如果必要,可以进一步细化,对吗?@Mark_Anderson数字x=1e-9满足双精度方程
1-x**2=1
。没有什么需要改进的,只要解算器能告诉你,方程就可以完美地解出来。需要注意的是,多重根比简单的一次根更复杂