【发布时间】:2020-11-29 21:01:31
【问题描述】:
我正在尝试使用 Python 中的多项式根来近似 Julia 集。特别是我想找到多项式 q(z) = z^2-0.5 的第 n 次迭代的根。换句话说,我想找到组成 n 次的 q(q(q(..))) 的根。为了获得许多样本点,我需要计算 >1000 次多项式的根。
我尝试使用具有根函数的 numpy 内置多项式类和 sympy 的函数求解器来解决这个问题。在第一种情况下,当我选择大于 100 的度数时精度会丢失。sympy 计算只需要很长时间。这是我的代码:
p = P([-0.5,0,1])
for k in range(9):
p = p**2-0.5
roots = p.roots()
plt.plot([np.real(r) for r in roots], [np.imag(r) for r in roots],'x')
plt.show()
abs_vector = [np.abs(p(r)) for r in roots]
max = 0
for a in abs_vector:
if a > max:
max = a
print(max)
上面的最大值给出了假定根处 p 的最大值。但是运行这段代码给了我 7.881370400084486e+296 这是非常大的。
如何在短时间内以高精度计算高次多项式的根?
【问题讨论】:
-
您对多项式系数的了解程度如何?数值稳定性绝对是一个问题。
-
可能类似于:Cython 或 numba.pydata.org
-
作为第一次尝试,我建议查看mpmath,它提供了专为它们工作的任意精度数据类型和函数。 (Python 的 stdlib
decimal.Decimal也是任意精度的,但没有那么多用于高级数学工作的支持例程。) -
我支持user2357112的comment。如果您的系数源于测量或浮点计算,则计算根可能没有用。
标签: python