为什么在我的代码中,np.array**3会导致与(np.array/1)**3不同的解决方案



我写这段代码是为了计算以下时间的积分: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进行显式处理。如果只是为了获得更可复制的行为。

最新更新