【发布时间】:2019-08-07 09:38:11
【问题描述】:
我目前正在尝试为我的硕士论文重新创建一篇论文 (https://www.researchgate.net/publication/309723672_Evidence_for_wave_resonance_as_a_key_mechanism_for_generating_high-amplitude_quasi-stationary_waves_in_boreal_summer) 的发现。 我计算了罗斯比波(大气中的某种流动)的经向波数平方的经向(北度数)分布数天。该值仅取决于平均纬向(西和东度数)风及其一阶和二阶经向导数,以及 2D 罗斯贝波的纬向波数。例如,这种波可以被认为是鼓上的波,仅在球形环境中,即大气中。 我使用的是 python 3.6.5,我怀疑问题出在数值精度上,但我不确定。
我已经阅读了有关数值精度的其他线程,并遇到了这个问题,例如:python sine and cosine precision。 但是,我还没有尝试过,因为我试图避免编写自己的三角函数。此外,由于我必须处理大量数据,因此我尽量不减慢我的代码速度。从实验中我发现数学库在三角函数方面并不比 numpy 库更精确。
这是我关心的代码的 sn-p:
Lat = np.linspace(0,90,37)
MeridWN = np.zeros((29,36), dtype='float64')
######################################################
#define Meridional wavenumber, l^2
for i in range(5,28,10):
for j in range(36):
MeridWN[i,j] = (((2*EarthRot*np.cos(Lat[j]*np.pi/180.0)**3.0)/(EarthRad*ZonMeanZonWiNH[j]))-
((np.cos(Lat[j]*np.pi/180.)**2.)/(EarthRad**2.0*ZonMeanZonWiNH[j]))*
ZonMeanZonWiMeridGradGrad[j]+
((np.sin(Lat[j]*np.pi/180.)*np.cos(Lat[j]*np.pi/180.))/(EarthRad**2.0*ZonMeanZonWiNH[j]))*
ZonMeanZonWiMeridGrad[j]+(1./(EarthRad**2.0))-(ZonWN[i]/EarthRad)**2.0)
MeridWNMerge[i,x,j] = MeridWN[i,j]
索引 i 是一系列纬向波数,x 是天(这个 sn-p 来自一个更大的循环,在天上运行),j 是纬度位置。 为了计算导数,我使用这样的 numpy 梯度函数:
ZonMeanZonWiMeridGrad = np.gradient(ZonMeanZonWiNH,np.linspace(0,90,37))
ZonMeanZonWiMeridGradGrad = np.gradient(ZonMeanZonWiMeridGrad,np.linspace(0,90,37))
This是子午波数(l)平方的计算公式,其中Omega是地球自转,Phi是纬度位置,a是地球半径,U是纬向平均,纬向平均和k 是带状波数,在我的例子中是一个范围从 5.5 到 8.5 的数组。
This 是我 6 月至 8 月的纬向平均纬向风场(下)和论文上的(上)的比较,表明我们有相同的数据,这不是问题。色阶略有不同,但风廓线最突出的特征非常相似,微小的差异不应该产生如此不同的profile of the meridional wavenumber (for k = 7),纸上的数字又在上面,我在下面.这里的色阶再次不同,但仍应捕捉到大的结构相似性。如您所见,我处理的数字非常小,这导致我怀疑代码的数字不精确。
如果你愿意,我可以上传我的整个代码,但是我认为对于关于精度的讨论来说这已经足够了。
我试图解决这个问题大约 2 周,尝试在我的代码中进行所有不同的更改,其中一些是很好的更改,但是没有一个提供所需的输出。
提前谢谢你,
托马斯
【问题讨论】:
标签: python numpy precision calculation