Lennard-Jones系统中的Python力图给出了TypeError
我试图在Lennard-Jones系统中绘制第I个粒子上的力,作为其与第j个粒子(即xi xj)距离的函数。力由下式给出 <σ和ε是两个参数,席是已知的量,XJ是可变的。力从第i个粒子指向第j个粒子 下面给出了我为此编写的代码Lennard-Jones系统中的Python力图给出了TypeError,python,matplotlib,typeerror,Python,Matplotlib,Typeerror,我试图在Lennard-Jones系统中绘制第I个粒子上的力,作为其与第j个粒子(即xi xj)距离的函数。力由下式给出
from pylab import*
from numpy import*
#~~~ ARGON VALUES ~~~~~~~~(in natural units)~~~~~~~~~~~~~~~~
epsilon=0.0122 # depth of potential well
sigma=0.335 # dist of closest approach
xi=0.00
xj=linspace(0.1,1.0,300)
f = 48.0*epsilon*( ((sigma**12.0)/((xi-xj)**13.0)) - ((sigma**6.0)/2.0/((xi-xj)**7.0)) ) * float(xj-xi)/abs(xi-xj)
plot(xj,f,label='force')
legend()
show()
但它给了我以下的错误
f = 48.0*epsilon*( ((sigma**12.0)/((xi-xj)**11.0)) - ((sigma**6.0)/2.0/((xi-xj)**5.0)) ) * float(xj-xi)/abs(xi-xj)
TypeError: only length-1 arrays can be converted to Python scalars
有人能帮我解决这个问题吗。提前感谢。错误在于表达式的这一部分:
float(xj-xi)
看一个相关问题的答案。这似乎是Python内置函数和Numpy函数之间的冲突
如果取出“浮动”,它至少会返回。它给出了正确的数字吗
f = 48.0*epsilon*( ((sigma**12.0)/((xi-xj)**11.0)) - ((sigma**6.0)/2.0/((xi-xj)**5.0)) ) * (xj-xi)/abs(xi-xj)
TypeError
是由float(xi xj)
引起的float()
无法将iterable转换为单个标量值。相反,迭代xj
并将xi xj
中的每个值转换为float
。这可以很容易地用
x = [float(j - xi) for j in xj)]
您应该使用
float(xj-xi)/abs(xi-xj)
而不是术语
sign(xj-xi)
如果您真的想进行除法,因为
xi
和xj
已经是浮点数,您可以执行以下操作:
(xj-xi)/abs(xi-xj)
更一般地说,如果需要将整数的numpy数组转换为浮点,可以使用以下任一方法:
1.0*(xj-xi)
(xj-xi).astype(float)
更一般地说,在调试中不使用横跨整个页面的公式是有帮助的,因为使用较小的术语,您可以更容易地识别错误的位置。它也经常跑得更快。例如,这里您计算了四次xixj
,而实际上只需要计算一次。这样更容易阅读:
x = xi -xj
f = 48*epsilon*(s**12/x**13 - s**6/2/x**7)
f *= sign(-x)
问题在于浮动项。但解决办法并不清楚,因为这个术语没有意义:1)这个术语不在你的等式中;2)你必须知道席和XJ已经在你上一行创建了浮动;那么,你想做什么?而且,这看起来只是一个
符号
函数。如果这就是你想要的,你应该使用,numpy.sign(xj-xi)
。是的@tom10它是唯一一个包含力方向的符号函数。但是我不知道这个numpy.sign
函数。谢谢你的建议。