python - Python根函数的精度
问题描述
我正在尝试使用 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 这是非常大的。
如何在短时间内以高精度计算高次多项式的根?
解决方案
对于多项式的 n 次组合,q
您可以迭代地重建根
q = [1,0,-0.5]
n = 9
def q_preimage(w):
c = q.copy()
c[-1] -= w
return np.roots(c)
rts = [0]
for k in range(n):
rts = np.concatenate([q_preimage(w) for w in rts])
返回
array([ 1.36444432e+00+0.00095319j, -1.36444432e+00-0.00095319j,
1.40104860e-03-0.92828301j, -1.40104860e-03+0.92828301j,
8.82183775e-01-0.52384727j, -8.82183775e-01+0.52384727j,
8.78972436e-01+0.52576116j, -8.78972436e-01-0.52576116j,
1.19545693e+00-0.21647154j, -1.19545693e+00+0.21647154j,
3.61362916e-01+0.71612883j, -3.61362916e-01-0.71612883j,
1.19225541e+00+0.21925381j, -1.19225541e+00-0.21925381j,
3.66786415e-01-0.71269419j, -3.66786415e-01+0.71269419j,
...
或绘制
plt.plot(rts.real, rts.imag,'ob', ms=2); plt.grid(); plt.show()
推荐阅读
- ruby-on-rails - 无法在同一 VPC 上将 aws redis 与 ec2 连接
- cumulocity - Cumulocity beginner's question: How to do a realtime analytics
- php - 在 html5 脚本中使用变量作为数组键的问题
- .net - 基于国家的网络翻译
- c# - 使用 SaveFileDialog 备份 SQLite 数据库?
- python - TypeError:参数“字典”有多个值
- r - 使用 for 循环更改每行中最近列的值。寻求其他“更安全”的解决方案
- r - 如何传播或整理网络?
- macos - 上传使用 Electron 开发并使用 electron-builder 构建的 macOS 应用程序时发生 CFBundleIdentifier 冲突
- html - 在 CSS 中将框定位在 X 和 Y 坐标处