我撰寫了這段代碼來計算時間積分: Q = (Q_max*(1 - (time/t_0 - 1)**2)) 我分析得出的。
import numpy as np
Q_max = 400 # W m-2
t_0 = 6*3600 # seconds
dt = 60 # seconds
time = np.arange(0,2*t_0,dt)
Q_integral_A = Q_max*((time)**2/(t_0) - (time)**3/(3*(t_0)**2))
但是,我發現 Q_integral_A 給出了錯誤的解決方案。在嘗試了很多東西之后,我發現執行以下操作會導致正確的解決方案(將第二個“時間”除以 1):
Q_integral_B = Q_max*((time)**2/(t_0) - (time/1)**3/(3*(t_0)**2))
這里發生了什么?為什么 Q_integral_A 和 Q_integral_B 有區別?
輸出截圖
使用的版本:Python 3.8.5 Numpy 1.20.3 Spyder 4.2.5
uj5u.com熱心網友回復:
我自己研究了問題,得到了相同的結果。所以起初time是一個int32,但是當你這樣做時time / 1它變成了float64。它本身不應該帶來問題,但time包含一些大數字,并將它們提高到 3 次方會導致溢位(這就是我得到的),但它不會影響浮動,因為它以不同的方式作業。
解決它只是通過dtype="int64" time = np.arange(0, 2*t_0, dt, dtype = "int64"),但它不會解決更大的數字的問題。
uj5u.com熱心網友回復:
我懷疑發生了什么是你在 Windows 上,所以:
time = np.arange(0,2*t_0,dt)
默認為dtype=np.int32,則/運算子導致提升為np.float64。
如果我使用,我可以重現您的錯誤
time = np.arange(0,2*t_0,dt, dtype=np.int32)
我敢打賭,如果您使用它,它將為您修復:
time = np.arange(0,2*t_0,dt, dtype=np.int64)
一般來說,你應該明確地使用dtypes. 如果只是為了獲得更多可重復的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519634.html
標籤:Python麻木的
