Почему этот кусок кода должен быть там? - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь понять этот код, и я все понял, кроме этих двух строк:

f_grav = gravity * sun.mass * earth.mass * (sun.pos - earth.pos).norm() / (sun.pos - earth.pos).mag2
earth.vel = earth.vel + (f_grav/earth.mass) * dt

Почему это не может быть просто: f_grav = gravity * sun.mass * earth.mass / (sun.pos-earth.pos)**2

Я также не получаю роль .norm() и .mag2

Вот весь фрагмент кода программы (GlowScript):

sunRadius = 10 * realSunRadius   # the size for our solar system
earthRadius = sunRadius * 0.25    # note: real value would be sunRadius * 0.01, a good choice for sim is * 0.25
astronomicalUnit = 212.7 * realSunRadius     # the distance from Sun to Earth - the Sun is about 100 Sun diameters away      
gravity = 6.6e-11   # sets the strength of the gravitational constant to 6.6x10-11 Newton x meters squared per kilograms squared

# create the Sun object
sun = sphere( radius = sunRadius, opacity = 0.7, emissive = True, texture = "http://i.imgur.com/yoEzbtg.jpg" ) 
sun.mass = 2e30   # mass of the Sun in kilograms is 2,000,000,000,000,000,000,000,000,000,000 kg
sun.pos = vec(0,0,0)
sun.vel = vec(0,0,0)

# place a few sources of light at the same position as the Sun to illuminate the Earth and Moon objects
sunlight = local_light( pos = vec(0,0,0), color=color.white )
more_sunlight = local_light( pos = vec(0,0,0), color=color.white )  # I found adding two lights was about right

# create the Earth object
earth = sphere ( radius = earthRadius, texture = "http://i.imgur.com/rhFu01b.jpg",make_trail=True)
earth.mass = 6e24   # mass of Earth in kilograms
earth.pos = vec(astronomicalUnit, 0, 0)
earth.vel = vec(0,0,-30000)   # the Earth is moving around 30000 m/s


dt = 10000


# below is the main loop of the program - everything above is "setup" and now we are in the main "loop" where all the action occurs
while (True):   # this will make it loop forever

    rate(100)   # this limits the animation rate so that it won't depend on computer/browser processor speed

    # calculate the force of gravity on each object
    f_grav = gravity * sun.mass * earth.mass * (sun.pos - earth.pos).norm() / (sun.pos - earth.pos).mag2
    earth.vel = earth.vel + (f_grav/earth.mass) * dt


    # update the position of the Earth and Moon by using simple circle trigonometry
    earth.pos = earth.pos + earth.vel * dt 

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

.norm() возвращает единичный вектор, поэтому результатом является вектор, а не скаляр. Это векторная форма ньютоновской гравитации. (См. Википедия )

.mag2 делает то же самое, что ожидается от **2, однако, в общем, степени векторов не определены, поэтому не имеет смысла определять оператор возведения в степень для векторного класса.

0 голосов
/ 26 июня 2018

(sun.pos-earth.pos) - это вектор. Я не думаю, что вы можете сделать (sun.pos-earth.pos)**2, потому что вы не можете квадратировать вектор. Разве вы не пытаетесь сделать скалярное произведение вектора с самим собой? Но результатом точечного произведения является скаляр, поэтому f_grav будет скаляром. Силы являются векторами, поэтому нет смысла использовать там скалярное произведение.

Для сравнения, f_grav = gravity * sun.mass * earth.mass * (sun.pos - earth.pos).norm() / (sun.pos - earth.pos).mag2 имеет смысл, потому что вы умножаете (sun.pos - earth.pos).norm(), вектор, на три скаляра и делите на один скаляр. Таким образом, результатом является вектор по желанию.

...