Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lennard-Jones系统中的Python力图给出了TypeError_Python_Matplotlib_Typeerror - Fatal编程技术网

Lennard-Jones系统中的Python力图给出了TypeError

Lennard-Jones系统中的Python力图给出了TypeError,python,matplotlib,typeerror,Python,Matplotlib,Typeerror,我试图在Lennard-Jones系统中绘制第I个粒子上的力,作为其与第j个粒子(即xi xj)距离的函数。力由下式给出

我试图在Lennard-Jones系统中绘制第I个粒子上的力,作为其与第j个粒子(即xi xj)距离的函数。力由下式给出

<σ和ε是两个参数,席是已知的量,XJ是可变的。力从第i个粒子指向第j个粒子

下面给出了我为此编写的代码

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
函数。谢谢你的建议。