python - 大/小值 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
我相信粒子距离系统可以处理的距离太近了,如果我错了,请纠正我。如果我是对的,有人知道任何替代实现吗?
解决方案
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.attribute
in表示python
。所以它np
现在是一个float
对象,而不是一个包对象。
np
在您的程序中的某个地方,您有一个已设置为浮点数的变量。在那之后,你就没有numpy
了。也许它只有在粒子足够接近时才会发生,这就是你当时看到它的原因。但这似乎是问题所在。检查源代码BaseEngine.py
推荐阅读
- rxjs - 使用 RXJS combineLatest 和管道 takeUntil 防止泄漏
- r - 使用 grepl 和 paste 匹配非常大数据集的子字符串
- javascript - 如何使用 javascript 使用 Facebook 页面令牌?
- python - 如何将子流程输出保存为字符串列表以供进一步分析?
- r - R:正则表达式捕获给定字符之后的所有实例
- python - Boto3 按组 id 删除安全组
- vue.js - 如何使用 vuex 仅修改存储中的嵌套数组属性
- highcharts - highcharts 导出服务器 - 带有 curl / POST 的变量饼图
- notepad++ - 用记事本++中的增量计数器替换特定单词 - 定义计数器的起点
- matlab - 如何在 symfun 类型的函数上使用 matlab 中的 interp1 函数?