我创建了一个功能potential(x,K,B,N)
,其中x
,K
,B
为numpy
数组,N
为整数。我试图在iPython
中测试该功能,但我一直收到错误"global name 'sqrt' not defined"
。
在这里查看我的代码:
def potential(x,K,B,N):
x = x.reshape((3,N),order='F')
U_b = 0.0
for i in xrange(0,N-1):
for j in xrange(i+1,N):
if K[i,j] == 1.0:
U_b += sum((x[:,i]-x[:,j])**2)
U_b = 0.5*U_b
U_a = 0.0
for i in xrange(0,N-2):
for j in xrange(i+1,N-1):
for l in xrange(j+1,N):
if B[i,j,l] == 1.0:
U_a += B[i,j,l]*sum((x[:,i]-x[:,j])*(x[:,j]-x[:,l]))/(sqrt(sum((x[:,i]-x[:,j])**2))*sqrt(sum((x[:,j]-x[:,l])**2)))
U_a = -U_a
U_r = 0.0
d = 0.0
for i in xrange(0,N-1):
for j in xrange(i+1,N):
d = sqrt(sum((x[:,i]-x[:,j])**2))
if d > sqrt(0.2):
U_r += (1.0/6.0)*(1/(d**6))
else:
U_r += -0.2**(-7.0/2.0)*d + (7.0/6.0)*(0.2)**(-3)
return U_b + U_a + U_r
我已尝试使用from math import *
,但似乎没有帮助。任何建议将不胜感激!
答案 0 :(得分:6)
from math import sqrt
缺少所有
我尝试过使用
from math import *
,但似乎没有帮助。
(可能你在定义函数后就这样做了。无论如何,fuhgeddaboutit,只需在干净的会话中重新加载代码,它就可以工作。)
更新:严格地说,在Python中你应该import package
而不是from package import identifier1 [,identifier2, identifier3...]
而永远不会 from package import *
。但是from package import identifier1
在明智地使用时,如果你没有过度使用,并且在函数内部,则可以。如果它是明确的,并且你将会做很多,它会缩短代码,例如sqrt()
代替math.sqrt()
,log
代替math.log10()
答案 1 :(得分:1)
因为你标记了numpy,
import numpy as np
然后使用np.sqrt
代替sqrt
。永远有效。
答案 2 :(得分:0)
只需添加。
from math import sqrt
答案 3 :(得分:0)
你有几个选择:
其他图书馆:例如,NumPy
import numpy as np
然后使用np.sqrt(9)
或
from numpy import sqrt
sqrt(9)
或标准库和内置解决方案:
1) 9**0.5
2)
import math
math.sqrt(9)
或
from math import sqrt
sqrt(9)
对于后一部分,出于性能原因,我更喜欢math
函数。我在这里做了这个基准:
为什么数学模块更有效? math模块使用平方根
的C实现我的基准测试代码可以在这里找到: