Bob John
Bob John

Reputation: 3878

Trying to make two masses orbit each other...getting weird error

Basically, I've created the masses, gave them some velocity and momentum, and I'm trying to make them orbit each other (around their center of mass) using the force from gravity.

from visual import *

earth = sphere(radius = 100000000)
newPlanet = sphere(pos = (3.84403*10**8, 0, 0), radius = 10000000)

earth.velocity = vector(0, 100, 0)
newPlanet.velocity = vector(0, 100, 0)

earth.mass = 2*10**30
newPlanet.mass = 1*10**30

earth.p = vector(0, earth.mass*earth.velocity, 0)
newPlanet.p = vector(0, newPlanet.mass*newPlanet.velocity, 0)

dt = 1000
r = newPlanet.pos.x
T = 1.296*10**6
G = 6.673*10**-11

while 1:
    Fnet = G*((earth.mass*newPlanet.mass)/r**2)

    earth.p += Fnet*dt
    newPlanet.p += Fnet*dt

    earth.velocity += (earth.p/earth.mass)*dt
    newPlanet.velocity += (newPlanet.p/newPlanet.mass)*dt

    earth.pos += earth.velocity*dt
    newPlanet.pos += newPlanet.velocity*dt

    t += 1

    rate(100)

This is the error I'm getting:

Traceback (most recent call last):
  File "Untitled", line 12
    earth.p = vector(0, earth.mass*earth.velocity, 0)
Boost.Python.ArgumentError: Python argument types in
    vector.__init__(vector, int, vector, int)
did not match C++ signature:
    __init__(struct _object *, class cvisual::vector)
    __init__(struct _object *)
    __init__(struct _object *, double)
    __init__(struct _object *, double, double)
    __init__(struct _object *, double, double, double)

Upvotes: 3

Views: 1293

Answers (1)

Appleman1234
Appleman1234

Reputation: 16086

vector takes three numbers as arguments as shown by vpython documentation here

In your assignment earth.p = vector(0, earth.mass*earth.velocity, 0), earth.mass*earth.velocity is a vector as typeof(earth.mass*earth.velocity) will indicate and not a number as expected.

Hence the error message, are you sure you didn't mean

earth.p = vector(0, earth.mass*mag(earth.velocity), 0)

or earth.p = vector(0, earth.mass*earth.velocity.y, 0) instead.

Upvotes: 5

Related Questions