Write a program to simluate multi object

  • Thread starter Thread starter YauS
  • Start date Start date
  • Tags Tags
    Program
Click For Summary

Homework Help Overview

The original poster seeks to simulate multiple objects in space using C++. They mention issues with total energy increasing and objects not following the correct trajectories. The gravitational force and velocity calculations are provided, but the poster is unsure about the correctness of their implementation.

Discussion Character

  • Exploratory, Assumption checking, Problem interpretation

Approaches and Questions Raised

  • Participants inquire about the number of objects involved and the necessity to consider all pairs for gravitational interactions. They suggest that the original poster may be using the Euler method for integration, which is noted to yield poor results, and recommend exploring better integration methods such as Verlet or Runge-Kutta.

Discussion Status

Some participants have provided guidance on integration methods and have requested more details about the original poster's implementation. There is an ongoing exploration of the issues faced, with no clear consensus reached on the best approach yet.

Contextual Notes

The original poster has expressed difficulty in applying suggested methods to their program and has shared snippets of their code for review. There are concerns raised about the use of certain coding practices, such as memory allocation methods and operator overloading.

YauS
Messages
5
Reaction score
0

Homework Statement


i want to simulate the object in space with c++


Homework Equations


i use a very small time interval to calculate the force and velocity.
i get wrong answer that the total energy in the system are increased.
And the objects are on the wrong locus.

Obj.Force = -g*m_1*m_2/(r*r);
Obj.Velocity += Obj.Force/mass *time;

The Attempt at a Solution

 
Physics news on Phys.org
You didn't give details on what you did, so I am guessing a bit here.
  • How many objects do you have?
    You need to address all pairs of objects.
  • The gravitational force exerted on object 1 by object 2 is better written as
    [tex]\mathbf F = -\,\frac {G m_1 m_2}{||\mathbf r_{2\to1}||^3||} \mathbf r_{2\to1}[/tex]
  • Object 1 exerts an equal but opposite force on object 2.
    Do you have all masses moving in your simulation?
  • If you simply compute the position and velocity at some time [itex]t+\Delta t[/itex] as [itex]\mathbf r(t+\Delta t) = \mathbf r(t) + \Delta t \mathbf v(t)[/itex] and [itex]\mathbf v(t+\Delta t) = \mathbf v(t) + \Delta t \mathbf a(t)[/itex] where [itex]a(t)[/itex] is the acceleration per Newton's laws you will get bad results. This is called the Euler method for propagating a differential equation.
    Euler integration typically yields lousy results. You need to use a better integrator. Look into the verlet method, the velocity verlet (or Heun's method), and Runge-Kutta integration.
 
D H said:
You didn't give details on what you did, so I am guessing a bit here.
  • How many objects do you have?
    You need to address all pairs of objects.
  • The gravitational force exerted on object 1 by object 2 is better written as
    [tex]\mathbf F = -\,\frac {G m_1 m_2}{||\mathbf r_{2\to1}||^3||} \mathbf r_{2\to1}[/tex]
  • Object 1 exerts an equal but opposite force on object 2.
    Do you have all masses moving in your simulation?
  • If you simply compute the position and velocity at some time [itex]t+\Delta t[/itex] as [itex]\mathbf r(t+\Delta t) = \mathbf r(t) + \Delta t \mathbf v(t)[/itex] and [itex]\mathbf v(t+\Delta t) = \mathbf v(t) + \Delta t \mathbf a(t)[/itex] where [itex]a(t)[/itex] is the acceleration per Newton's laws you will get bad results. This is called the Euler method for propagating a differential equation.
    Euler integration typically yields lousy results. You need to use a better integrator. Look into the verlet method, the velocity verlet (or Heun's method), and Runge-Kutta integration.
Think you.
I found those methods in web.
i can't apply those method into my program
Can anyone help me?
 
You need to supply information on what you have done yourself before we can help you any further. And why to you claim you can't apply those methods to your program? Did you try?
 
D H said:
You need to supply information on what you have done yourself before we can help you any further. And why to you claim you can't apply those methods to your program? Did you try?

int i,j,k;
long double temp = duration,t;
Object * oTemp = (Object *)malloc(sizeof(Object)*this->numObj);
Vector3D Temp,* a = (Vector3D *)malloc(sizeof(Vector3D)*this->numObj);
for(i = 0; i<this->numObj;i++)
{
oTemp.copy(this->objList);
a = this->objList->force/this->objList->mass;
}
while(temp > 0)
{
for(i = 0; i<this->numObj-1;i++)
{
for(j = i+1;j<this->numObj;j++)
{
Temp = this->objList->gForce(*this->objList[j]);
oTemp.force = oTemp.force + Temp;
oTemp[j].force = oTemp[j].force - Temp;
}
}

for(i = 0;i<this->numObj;i++)
{
Temp = oTemp.force/oTemp.mass;
oTemp.position = oTemp.position + oTemp.velocity *this->timeInt + gTemp*0.5*this->timeInt*this->timeInt +(Temp- a)*1/12*this->timeInt*this->timeInt*this->timeInt;
oTemp.velocity = oTemp.velocity + (oTemp.force + this->objList->force)/oTemp.mass/2* this->timeInt;
*this->objList = oTemp;
}
temp -= this->timeInt;
}

This is my program that corrected.
i change the highlighted code. it is correct?

Physic::Vector3D Physic::Object::gForce(const Physic::Object & param)
{
long double r;
Vector3D temp = this->delta(param);
r = !temp;
return temp.toNV()*gravityCon*this->mass*param.mass/(r*r*r);
}
temp.toNv() is return -(temp)
 
Last edited:
What kind of results do you get?

Some comments:
  • As a general rule, it is a bad idea to use malloc in C++. Use new() instead.
  • Your code is hard to read. Use spaces.
  • What are you doing here: "r = !temp;"
 
D H said:
What kind of results do you get?

Some comments:
  • As a general rule, it is a bad idea to use malloc in C++. Use new() instead.
  • Your code is hard to read. Use spaces.
  • What are you doing here: "r = !temp;"
! = return sqrt(x*x+y*y+ z*z)
malloc is not good but i only found this method for undetemined size of array
 
YauS said:
! = return sqrt(x*x+y*y+ z*z)
Yikes. Operator overloading run amok! I assume that Vector3D is a class handed to you, rather than written by you. Overzealous use of operator overloading is widely viewed as a bad practice. Some view any use of operator overloading as a bad practice; the use of operator overloading is banned in many programming shops and requires a waiver in many more.

malloc is not good but i only found this method for undetemined size of array
Read up on new. Which of the two lines below is clearer?
Code:
Object * oTemp = (Object *)malloc(sizeof(Object)*this->numObj);
Object * oTemp = new Object[this->num_Obj)];
There is another big advantage of new over malloc. malloc merely allocates memory. The allocated memory will contain random garbage. new on the other hand invokes constructors for the object.
 

Similar threads

  • · Replies 19 ·
Replies
19
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 9 ·
Replies
9
Views
2K
Replies
13
Views
4K
  • · Replies 4 ·
Replies
4
Views
2K
Replies
1
Views
1K
  • · Replies 30 ·
2
Replies
30
Views
3K
  • · Replies 22 ·
Replies
22
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 3 ·
Replies
3
Views
3K