list index out of range - From Fortran to Python

0

I wrote a program in Fortran and now I'm trying to write it in Python. However, it is giving an error:

  (i + 1) = - u_med [i + 1] / (delta_r [i] * delta_r [i + 1])

     

IndexError: list index out of range

I'm a beginner in Python, what can go wrong? Here is the code:

D = []
u_med = []
delta_r = []
for i in range(2,n):
  for j in range(2,n):
    if i == j:
      D[i][j+1] = - u_med[i+1]/(delta_r[i]*delta_r[i+1])
      t1 = u_med[i+1]/(delta_r[i]*delta_r[i])
      t2 = u_med[i]/(delta_r[i]*delta_r[i])
      D[i][j]= t1 + t2 + V[i]
      D[i+1][j]= - u_med[i+1]/(delta_r[i]*delta_r[i+1])

t1 = u_med[2]/(delta_r[1]*delta_r[1])
t2 = 0
D[1][1]= t1 + t2 + V[1]
D[1][2]= - u_med[2]/(delta_r[1]*delta_r[2])
D[2,1]= - u_med[2]/(delta_r[2]*delta_r[1])
t1 = 0
t2 = u_med[n]/(delta_r[n]*delta_r[n])

D[n][n]= t1 + t2 + V[n]

Edit: I'm working with the one-dimensional Schrödinger equation on a variable grid ... Anyway, I'm writing it in matrix form, with a symmetric tridiagonal N x N matrix.

Same code in Fortran:

do i=2,n-1
do j=2,n-1

if (i.eq.j) then

D(i,j+1)=-u_med(i+1)/(delta_r(i)*delta_r(i+1))
t1 =u_med(i+1)/(delta_r(i)*delta_r(i))
t2 = u_med(i)/(delta_r(i)*delta_r(i))
D(i,j)= t1 + t2 + V(i)
D(i+1,j)=-u_med(i+1)/(delta_r(i)*delta_r(i+1))

end if

end do
end do

t1 =u_med(2)/(delta_r(1)*delta_r(1))
t2 = 0.d0

D(1,1)= t1 + t2 + V(1)
D(1,2)= -u_med(2)/(delta_r(1)*delta_r(2))
D(2,1)= -u_med(2)/(delta_r(2)*delta_r(1))

t1 =0.d0
t2 = u_med(n)/(delta_r(n)*delta_r(n))

D(n,n)= t1 + t2 + V(n)
    
asked by anonymous 23.04.2018 / 04:26

1 answer

1

See a snippet of your code with some comments:

  1 D = []                                                                                                                                                                                                                       
  2 #    ↳ Aqui você definiu D como uma lista vazia                                                                                                                                                                              
  3                                                                                                                                                                                                                              
  4 u_med = []                                                                                                                                                                                                                   
  5 #        ↳ Aqui você definiu u_med como uma lista vazia                                                                                                                                                                      
  6                                                                                                                                                                                                                              
  7 delta_r = []                                                                                                                                                                                                                 
  8 #          ↳ Aqui você definiu delta_r como uma lista vazia                                                                                                                                                                  
  9                                                                                                                                                                                                                              
 10 #                  ↱ Aqui você utilizou n que não está definido                                                                                                                                                              
 11 for i in range(2, n):                                                                                                                                                                                                        
 12     for j in range(2, n):                                                                                                                                                                                                    
 13     ┆   if i == j:                                                                                                                                                                                                           
 14     ┆   ┆   D[i][j+1] = - u_med[i+1]/(delta_r[i]*delta_r[i+1])                                                                                                                                                               
 15     ┆   ┆   #   |             |            |         ↳ Aqui você está acessando a posição i+1 de uma lista vazia                                                                                                             
 16     ┆   ┆   #   |             |            ↳ Aqui você está acessando a posição i de uma lista vazia                                                                                                                         
 17     ┆   ┆   #   |             ↳ Aqui você está acessando a posição i+1 de uma lista vazia                                                                                                                                    
 18     ┆   ┆   #   ↳ Aqui você está tentando definir o valor da posição i, j+1 de uma lista vazia                                                                                                                               
 19     ┆   ┆   t1 = u_med[i+1]/(delta_r[i]*delta_r[i])                                                                                                                                                                          
 20     ┆   ┆   t2 = u_med[i]/(delta_r[i]*delta_r[i])                                                                                                                                                                            
 21     ┆   ┆   D[i][j]= t1 + t2 + V[i]                                                                                                                                                                                          
 22     ┆   ┆   D[i+1][j]= - u_med[i+1]/(delta_r[i]*delta_r[i+1])   

The error happens on line 14 just because it tries to access values in empty lists, considering that the n object is properly defined in your code and just did not post the question.

Since it does not make sense to access empty list values, there's no way to infer what you want to do, so I've asked comment that describes, in words, what the purpose of the code is. Without the description, there is no way to help you further.

    
24.04.2018 / 13:45