[英]Large rounding errors in python plots
我嘗試 plot 下面的簡單序列
a_n=\frac{3^n+1}{7^n+8}
它應該趨於 0,但是 plot 對接近 20 的 $n$ 值顯示出奇怪的效果....
我用代碼
import numpy as np
import matplotlib.pyplot as plt
def f(n):
return (3**n+1)/(7**n+8)
n=np.arange(0,25, 1)
plt.plot(n,f(n),'bo-')
另一方面,對上述序列進行數值計算並沒有找到這么大的值
for i in range(0,25):
print([i,f(i)])
[0, 0.2222222222222222]
[1, 0.26666666666666666]
[2, 0.17543859649122806]
[3, 0.07977207977207977]
[4, 0.034039020340390205]
[5, 0.014510853404698185]
[6, 0.0062044757218015075]
[7, 0.0026567874970706124]
[8, 0.0011382857610720493]
[9, 0.00048778777316480816]
[10, 0.00020904485804220367]
[11, 8.958964415487241e-05]
[12, 3.8395417418579486e-05]
[13, 1.6455158259653074e-05]
[14, 7.05220773432529e-06]
[15, 3.022374322043928e-06]
[16, 1.295303220696569e-06]
[17, 5.551299431298911e-07]
[18, 2.3791283154177113e-07]
[19, 1.0196264191387531e-07]
[20, 4.3698275080881505e-08]
[21, 1.872783217393992e-08]
[22, 8.026213788319863e-09]
[23, 3.439805909206865e-09]
[24, 1.4742025325067883e-09]
為什么會這樣?
問題不matplotlib
,而在於arange
生成的數字的數據類型。 您沒有指定dtype
,因為在arange
的文檔中,它聲明是從輸入中推斷出來的。 你的輸入是整數,所以它必須假設它們是 32 位整數,因為dtype
是未修改的,所以當我檢查類型時:
print(type(n[0]))
<class 'numpy.int32'>
如果我將 dtype 更改為單精度浮點數,我們會得到您期望的行為:
n = np.arange(0,25,1, dtype=np.float32)
print(type(n[0]))
<class 'numpy.float32'>
plt.plot(n,f(n),'bo-')
或者,您可以在1
-> 1.
后面放一個句點來暗示您需要雙精度浮點數(即使結果數組包含整數式數字 [0., 1., 2., ...])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.