2013-08-28 23 views
3

У меня есть несколько циклов for-loop внутри цикла while в моем коде Python. Для первой итерации все работает нормально. На второй итерации While-цикл, я получаю следующее сообщение об ошибке:float-объект не является вызываемым

File ".\simulated_annealing.py", line 209, in <module> 
for ii in range(0, 8, 1) : 
TypeError: 'float' object is not callable 

Ниже приводится соответствующая часть моего кода:

в то время как numpy.absolute (FcostOld)> = 0,001 и л < = L:

Fx = [] 
Fy = [] 
Fz = [] 
V = [] 
ii = 0 

for ii in range(0, 8, 1) :   # ... LINE 209 
    Fx.append([]) 
    Fy.append([]) 
    Fz.append([]) 
    for j in range(0, 13, 1) : 
     Fx[ii].append(0) 
     Fy[ii].append(0) 
     Fz[ii].append(0) 
    V.append(0.0) 

print "\n l = ", l 
j = 0 
print "j = ", j 
i = 0 
for i in range(0, 8) : 
    print "i = ", i 
    """ 
    V[i] = 0.0 
    for j in range(0, 13, 1) : 
     Fx[i][j] = 0.0 
     Fy[i][j] = 0.0 
     Fz[i][j] = 0.0 
    """ 

    for j in range(0, 6, 1) : 
     for k in range(0, Natoms, 1) : 
      dxxC = x[i][j] - Layer15[k][0] 
      dyyC = y[i][j] - Layer15[k][1] 
      dzzC = zC - Layer15[k][2] 
      rrC = numpy.sqrt(dxxC*dxxC + dyyC*dyyC + dzzC*dzzC) 

      if rrC <= rcut : 
       V[i] = V[i] + VrealC(rrC, DeC, alphaC, rC, s6) 
       Fx[i][j] = Fx[i][j] + frealC(rrC, DeC, alphaC, rC, dxxC, s6) 
       Fy[i][j] = Fy[i][j] + frealC(rrC, DeC, alphaC, rC, dyyC, s6) 
       Fz[i][j] = Fz[i][j] + frealC(rrC, DeC, alphaC, rC, dzzC, s6) 

    for j in range(6, 12, 1) : 
     for k in range(0, Natoms, 1) : 
      dxxH = x[i][j] - Layer15[k][0] 
      dyyH = y[i][j] - Layer15[k][1] 
      dzzH = zH - Layer15[k][2] 
      rrH = numpy.sqrt(dxxH*dxxH + dyyH*dyyH +dzzH*dzzH) 

      if rrH <= rcut : 
       V[i] = V[i] + VrealH(rrH, DeH, alphaH, rH, s6) 
       Fx[i][j] = Fx[i][j] + frealH(rrH, DeH, alphaH, rH, dxxH, s6) 
       Fy[i][j] = Fy[i][j] + frealH(rrH, DeH, alphaH, rH, dyyH, s6) 
       Fz[i][j] = Fz[i][j] + frealH(rrH, DeH, alphaH, rH, dzzH, s6) 

    j = 12 
    for k in range(0, Natoms, 1) : 
     dxxX = x[i][j] - Layer15[k][0] 
     dyyX = y[i][j] - Layer15[k][1] 
     dzzX = zX - Layer15[k][2] 
     rrX = numpy.sqrt(dxxX*dxxX + dyyX*dyyX +dzzX*dzzX) 

     if rrX <= rcutX : 
      V[i] = V[i] + VrealX(rrH, DeH, alphaH, rH, s6) 
      Fx[i][j] = Fx[i][j] + frealX(rrX, DeX, alphaX, rX, dxxX, s6) 
      Fy[i][j] = Fy[i][j] + frealX(rrX, DeX, alphaX, rX, dyyX, s6) 
      Fz[i][j] = Fz[i][j] + frealX(rrX, DeX, alphaX, rX, dzzX, s6)   

    print "i = ", i 

if flag == False : 
    FcostOld_V = 0 * numpy.sqrt(sum(numpy.power(V[n]-VTarget[n], 2) for n in range(0,8)))/numpy.sqrt(sum((V[n]*V[n]) for n in range(0,8))) 
    FcostOld_F = numpy.absolute(sum(Fz[n][m] for n in range(0,8) for m in range(0,13)))/8 
    FcostOld = FcostOld_V + FcostOld_F 

if flag == True : 
    FcostNew_V = 0 * numpy.sqrt(sum(numpy.power(V[n]-VTarget[n], 2) for n in range(0,8)))/numpy.sqrt(sum((V[n]*V[n]) for n in range(0,8))) 
    FcostNew_F = numpy.absolute(sum(Fz[n][m] for n in range(0,8) for m in range(0,13)))/8 
    FcostNew = FcostNew_V + FcostNew_F  

    if (FcostNew - FcostOld) < 0: 
     s6Old = s6 
     FcostOld = FcostNew 
     DeCOld = DeC 
     alphaCOld = alphaC 
     rCOld = rC 
     DeHOld = DeH 
     alphaHOld = alphaH 
     rHOld = rH 
     DeXOld = DeX 
     alphaXOld = alphaX 
     rXOld = rX 

    if (FcostNew - FcostOld) >= 0 : 
     P = numpy.exp(-(FcostNew-FcostOld)/kT) 
     r0 = numpy.random.rand() 
     if r0 < P : 
      s6Old = s6 
      FcostOld = FcostNew 
      DeCOld = DeC 
      alphaCOld = alphaC 
      rCOld = rC 
      DeHOld = DeH 
      alphaHOld = alphaH 
      rHOld = rH 
      DeXOld = DeX 
      alphaXOld = alphaX 
      rXOld = rX 

flag = True 


range = 0.1 

DeC = NewParameter(DeCOld, range)  
alphaC = NewParameter(alphaCOld, 2*range)  
rC = NewParameter(rC, range/2) 

DeH = NewParameter(DeHOld, 5*range)  
alphaH = NewParameter(alphaHOld, 2*range)  
rH = NewParameter(rH, range/3) 

DeX = NewParameter(DeXOld, range)  
alphaX = NewParameter(alphaXOld, 2*range)  
rX = NewParameter(rX, range/2) 

s6 = NewParameter(s6Old, range) 

if numpy.mod(l,1) == 0 : 
    print "\nFcost = ", FcostOld 
    print Fx[7] 

print " l = ", l 
l = l + 1 
+0

'range (0, 8, 1)' эквивалентно 'range (8)'. Вы можете опустить 0 и 1. –

+0

Пожалуйста, для вашего собственного здравомыслия - используйте описательные имена переменных. –

ответ

10

Не используйте range в качестве имени переменной. Это тень встроенной функции range:

>>> range = 0.1 
>>> range(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'float' object is not callable 
4

range является встроенным, которая возвращает список значений для перебора. В строке 317 у вас есть range = 0.1, который заменяет встроенную функцию range значением float.

Таким образом, во второй раз, вместо обычной функции range, ваша программа вместо этого увидит поплавок, это будет как сказать for ii in 0.1(0, 8, 1):, что, очевидно, не имеет смысла.

Чтобы исправить это, просто используйте другое имя переменной, чем range, например interval = 0.1.

Сообщение об ошибке, которое вы получаете, приходит от вас, пытающегося до позвонить поплавок.

>>> x = 1.1 
>>> x() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'float' object is not callable 

() используются для вызовов функций. Так как x - это float в приведенном выше примере, он терпит неудачу, потому что вы не можете позвонить float.

Смежные вопросы