VPython

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Re: VPython

Mensagempor jap em Terça Fev 21, 2012 8:56 pm

Não sei qual é o problema, mas desde já recomendaria fortemente que reescrevesses o teu programa usando unidades astronómicas! :yes
Procura aqui no fórum que encontras (penso que sim!) informação sobre este tópico - creio que possivelmente até nalguma simulação semelhante à tua (muito fixe, parabéns! :hands: ).
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: VPython

Mensagempor ruifm em Terça Fev 21, 2012 9:32 pm

jap Escreveu:Não sei qual é o problema, mas desde já recomendaria fortemente que reescrevesses o teu programa usando unidades astronómicas! :yes

hmmm também teria de recalcular o valor de G, certo?
EDIT: já dei uma vista de olhos ao codigo do Tharis que foi o unico que encontrei no forum, com objectivo minimamente semelhante. mas lá não se encontram interações graviticas, apenas corpos a descreverem elipses de acordo com as leis destas. o meu objectivo era ensinar ao python o que é a gravidade, e atribuir a cada corpo uma posiçao e velocidade inicial, e a partir dai, ver se se verificam as tais elipses, ou por exemplo, a 'estranha' orbita da Lua em torno do Sol
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Re: VPython

Mensagempor jap em Quinta Fev 23, 2012 9:36 pm

Sim, é preciso calcular o valor de G nestas unidades! :lol:

BTW, acho que vou utilizar o teu programa como exemplo numa das próximas sessões pitónicas, pode ser? :wink:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: VPython

Mensagempor ruifm em Quinta Fev 23, 2012 10:49 pm

jap Escreveu:Sim, é preciso calcular o valor de G nestas unidades! :lol:

BTW, acho que vou utilizar o teu programa como exemplo numa das próximas sessões pitónicas, pode ser? :wink:

sure :D
mas se for mostrado ja agora queria fazer um update, uma simplificaçao.
pus a gravidade numa funçao:
Código: Seleccionar Todos
def distance(a,b):
    return math.sqrt((a.pos.x-b.pos.x)**2 + (a.pos.y-b.pos.y)**2 + (a.pos.z-b.pos.z)**2) #distancia entre 2 corpos

def gravidade(a,b):
    F=(G*a.mass*b.mass)/((distance(a,b))**2) #lei da gravitacao universal
    a.modulo=(F/a.mass) # 2a lei de newton
    b.modulo=(F/b.mass) # para o sol
    a.accelaration=vector(b.pos.x-a.pos.x,b.pos.y-a.pos.y,b.pos.z-a.pos.z) #vector direcional da normal
    a.k=a.modulo/math.sqrt((a.accelaration.x**2)+(a.accelaration.y**2)+(a.accelaration.z**2)) # k que ajusta o modulo da aceleracao
    a.centripeta=vector(a.accelaration.x*a.k,a.accelaration.y*a.k,a.accelaration.z*a.k) # ajuste do modulo para ter a verdadeira aceleracao centripeta
    a.vel+=a.centripeta
    a.pos+=a.vel
    b.accelaration=vector(a.pos.x-b.pos.x,a.pos.y-b.pos.y,a.pos.z-b.pos.z) # repetir tudo para o 2o corpo
    b.k=b.modulo/math.sqrt((b.accelaration.x**2)+(b.accelaration.y**2)+(b.accelaration.z**2))
    b.centripeta=vector(b.accelaration.x*b.k,b.accelaration.y*b.k,b.accelaration.z*b.k)
    b.vel+=b.centripeta
    b.pos+=b.vel
e aqui está uma forma mais pratica de obter o vector da velocidade inicial orbital no plano y=0, em vez de eu estar a fazer calculos:
Código: Seleccionar Todos
def orbital(a,b):
    a.speed=float(math.sqrt((G*b.mass)/distance(a,b))) #velocidade orbital
    a.perpendicular=vector(a.pos.x-b.pos.x,0,a.pos.z-b.pos.z) #vector direccional centripeta
    a.correcto=vector(1,0,(-a.perpendicular.x)/a.perpendicular.z) #vector perpendicular a trajectoria (pretendido), com uma primeira coordenada aleatoria
    a.factor=a.speed/mag(a.certo) #factor de acerto do modulo
    return vector(a.correcto.x*a.factor,0,a.correcto.z*a.factor)

e arranjei uma forma de ele fazer todas as interaçoes graviticas possiveis, de todos os corpos existentes (para caso haja mais de 2)
Código: Seleccionar Todos
def todas_interacoes():
    objectos=[]
    for corpo in scene.objects:
        if corpo.__class__ == sphere:
            objectos.append(corpo)
    for obj in objectos[:-1]:
        for i in range(objectos.index(obj)+1,len(objectos)):
            gravidade(obj,objectos[i])

depois é so aplicar:
Código: Seleccionar Todos
while True:
    rate(100)
    scene.center=sun.pos
    todas_interacoes()
    t+=0.01
espero que assim fique mais interessante.
para alem disto, ainda tentei adicionar a lua, só que o 3 body problem da mecanica newtoniana, não me permitiu conseguir arranjar a posiçao e velocidade inicial da lua que permitisse que esta orbitasse o sol e a terra. a gravitacao universal nao foi suficiente...(quando temos 3 corpos)
"Everything is determined, the beginning as well as the end, by forces over which we have no control." - Albert Einstein
Avatar do utilizador
ruifm
down-Quark!
down-Quark!
 
Mensagens: 205
Registado: Segunda Jan 16, 2012 12:04 am
Localização: Lisboa - IST

Anterior

Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante