我写这段代码是为了计算以下时间的积分:Q=(Q_max*(1-(时间/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编号1.20.3Spyder 4.2.5
我自己研究了这个问题,得到了同样的结果。所以一开始time
是一个int32,但当您执行time / 1
时,它变成float64。它本身不应该带来问题,但time
包含一些大数字,将它们提高到三次方会导致溢出(这是我得到的(,但它不会影响浮点运算,因为它的工作方式不同。
要解决它,只需通过dtype="int64"
time = np.arange(0, 2*t_0, dt, dtype = "int64")
,但对于更大的数字,它不会解决问题。
我怀疑发生的事情是你在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
进行显式处理。如果只是为了获得更可复制的行为。