Página 4 de 4

Re: VPython

MensagemEnviado: Terça Fev 21, 2012 8:56 pm
por jap
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: ).

Re: VPython

MensagemEnviado: Terça Fev 21, 2012 9:32 pm
por ruifm
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

Re: VPython

MensagemEnviado: Quinta Fev 23, 2012 9:36 pm
por jap
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:

Re: VPython

MensagemEnviado: Quinta Fev 23, 2012 10:49 pm
por ruifm
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)