He publicado una pregunta similar antes, sin embargo, creo que he malinterpretado mi pregunta, así que puedo publicar mi código de origen aquí, y buscar a alguien puede ayudarme, estoy realmente atrapado ahora ... muchas gracias.

from numpy import *
import math as M

#initial condition  All in SI unit
G=6.673*10**-11   #Gravitational constant
ms=1.9889*10**30 #mass of the sun
me=5.9742*10**24 #mass of the earth
dt=10           #time step
#Creat arrays
vs=array([[0,0,0]])     #1st element stand for x component of V of earth
ve=array([[29770,0,0]])
rs=array([[0,0,0]])           
re=array([[0,1.4960*10**11,0]])

#First update velocity in order to start leapfrog approximation
fs=-G*ms*me*((rs-re)/(M.sqrt((rs-re)[0][0]**2+(rs-re)[0][1]**2+(rs-re)[0][2]**2))**3)
fe=-fs
vs=vs+fs*dt/ms 
ve=ve+fe*dt/me

n=input('please enter the number of timestep you want it evolve:')
#update force
def force(n,ms,me,rs,re,G):
    rs,re=update_r(rs,re,n,dt)
    fs=-G*ms*me*((rs-re)/(M.sqrt((rs-re)[0][0]**2+(rs-re)[0][1]**2+(rs-re)[0][2]**2))**3)
    fe=-fs
    return fs,fe

#update velocities
def update_v(n,vs,ve,ms,me,dt,fs,fe):
    fs,fe=force(n,ms,me,rs,re,G)
    i=arange(n)
    vs=vs+fs[:]*i[:,newaxis]*dt/ms
    ve=ve+fe[:]*i[:,newaxis]*dt/me
    return vs,ve

#update position
def update_r(rs,re,n,dt):
    vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)
    i=arange(n)
    rs=rs+vs[:]*i[:,newaxis]*dt
    re=re+ve[:]*i[:,newaxis]*dt
    return rs,re
#there is start position,v,r,f all have initial arrays(when n=0).
#then it should calculate f(n=1) then use this to update v(n=0)
#to v(n=1),then use v(n=1) update r(n=0) to r(n=1),then use r(n=1)
#update f(n=1) to f(n=2)....and so on until finish n.but this code seems doesnt do this,,how can I make it? – 

Cuando llamo force python da:

please enter the number of timestep you want it evolve:4Traceback (most recent call last):
  File "<pyshell#391>", line 1, in <module>
    force(n,ms,me,rs,re,G)
  File "/Users/Code.py", line 24, in force
    rs,re=update_r(rs,re,n,dt)
  File "/Users/Code.py", line 39, in update_r
    vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)
UnboundLocalError: local variable 'vs' referenced before assignment

¿Alguien puede darme algunos consejos? Gracias ......

2
user211037 14 nov. 2009 a las 22:13

4 respuestas

La mejor respuesta

En la primera línea de update_r, tienes vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe). Mire la función que está llamando. Estás llamando a update_v con un montón de parámetros. Uno de estos parámetros es vs. Sin embargo, esa es la primera vez en esa función que aparece vs. La variable vs todavía no tiene un valor asociado. Intente inicializarlo primero y su error debería desaparecer

5
inspectorG4dget 31 dic. 2012 a las 19:13

En la línea 39 lo haces

vs,ve=update_v(n,vs,ve,ms,me,dt,fs,fe)

Mientras estás dentro de una función. Como definió una variable global llamada vs , esperaría que esto funcione. Hubiera funcionado si tuvieras:

vs_new,ve_new = update_v(n,vs,ve,ms,me,dt,fs,fe)

Porque el intérprete sabe que vs en los argumentos de la función es el global. Pero como tenía vs en el lado izquierdo, creó una variable local no inicializada.

Pero amigo, tienes un problema mucho mayor en tu código : update_r llama a update_v, update_v llama a force, y fuerza a llamadas update_r: obtendrá un desbordamiento de pila :)

0
Ofri Raviv 14 nov. 2009 a las 19:41

Ponga una declaración global adicional que contenga todos sus globales después de cada declaración def. De lo contrario, todos los globales se transforman en locales dentro de su definición sin ella.

def update_v(n,vs,ve,ms,me,dt,fs,fe):
    global vs, ve, ...  
1
Eugene Yarmash 22 abr. 2013 a las 06:52

¿Dónde llamas a la fuerza en este código?

En cualquier caso, el problema está en update_r. Hace referencia a vs en la primera línea de update_r aunque vs no está definido en esta función. Python no está mirando el vs definido anteriormente. Intenta agregar

global vs

Como la primera línea de update_r o agregando vs a la lista de parámetros para update_r

9
foosion 14 nov. 2009 a las 19:25