首页 > 解决方案 > 大/小值 numpy 的可能数字错误

问题描述

当 2 个粒子靠得太近时,我试图模仿无穷大的力。

这开始的距离取决于粒子总半径的距离。

def dist(a,b):#working and tested for normal values
    d_sq = 0
    if len(a) == len(b):
        for i in range(len(a)):
            d_sq = d_sq + (a[i] - b[i])**2
        return (d_sq)**(1/2)


D = float((dist(prtc.rs[i], prtc.rs[j]))/(prtc.rads[i] + prtc.rads[j]))
if D <1 + 10**(-10):
                    #f[i,j] is force on i by j repulsive and poining from j to i
                    #we want the force to blow up at such a distance
                    fs[i, j] = (1/(D-1))*unit(prtc.rs[i] - prtc.rs[j])
                    fs[j, i] = - fs[i, j]
                    f[i] = f[i] + fs[i,j]

当粒子足够接近时,即 dist(prtc.rs[i], prtc.rs[j]) < 1,D 的类型从 float 转换为 np.ndarray 的 2 个元素,我收到此错误消息。



  File "C:/Users/karth/Desktop/code/kphys/BaseEngine.py", line 114, in timestep
    prtc.vs = prtc.vs + np.divide(interaction(), prtc.ms)

  File "C:/Users/karth/Desktop/code/kphys/BaseEngine.py", line 86, in interaction
    /(prtc.rads[i] + prtc.rads[j]))

TypeError: only size-1 arrays can be converted to Python scalars

我相信粒子距离系统可以处理的距离太近了,如果我错了,请纠正我。如果我是对的,有人知道任何替代实现吗?

标签: pythonnumpyphysics

解决方案


File "C:/Users/karth/Desktop/code/kphys/BaseEngine.py", line 55, in dist
    return np.sqrt(d_sq)

AttributeError: 'float' object has no attribute 'sqrt'

也就是说AttributeError一个float对象没有属性sqrt。属性由object.attributein表示python。所以它np现在是一个float对象,而不是一个包对象。

np在您的程序中的某个地方,您有一个已设置为浮点数的变量。在那之后,你就没有numpy了。也许它只有在粒子足够接近时才会发生,这就是你当时看到它的原因。但这似乎是问题所在。检查源代码BaseEngine.py


推荐阅读