2014-06-20 89 views
3

我创建了一个功能,potential(x,K,B,N),其中xKBnumpy阵列和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 *尝试,但似乎并没有帮助。任何建议将不胜感激!

回答

1
from math import sqrt 

是所有的失踪

我一直在使用from math import *尝试,但似乎并没有帮助。

(也许你没有定义函数后,反正fuhgeddaboutit,只需重新加载在一个干净的会话的代码,它会奏效。)

+0

难道我们一直在使用功能前需要{}进口?在R中,即使你不使用其他软件包,你仍然有一些内置的函数可以使用,只需先用{import}输入{sqrt}即可。 – alphabetagamma

+0

@Phdaml:sqrt不是Python中的内建函数,不像R.因此,在Python中,您需要'import math'或'from math import sqrt' – smci

0

只是增加。

from math import sqrt 
+0

我也在发布之前做了这个 – user3758890

1

既然你标签numpy的,

import numpy as np 

然后用np.sqrt代替sqrt。始终有效。

+0

在我发布之前,我这样做了。我很抱歉没有在开头说明这一点。 – user3758890

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) 

对于后者的一部分,我d更喜欢math性能的原因。我做了这个测试在这里:

enter image description here

为什么数学模块更有效率? 数学模块使用平方根

的C语言实现了我的基准代码可以在这里找到:

http://nbviewer.ipython.org/github/rasbt/One-Python-benchmark-per-day/blob/master/ipython_nbs/day8_sqrt_and_exp.ipynb?create=1

相关问题