簡體   English   中英

python 圖中的大舍入誤差

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM