【发布时间】:2014-07-14 21:23:02
【问题描述】:
我想在一个封闭的盒子里模拟一个点质量。没有摩擦,点质量服从冲击定律。所以只有与盒子壁的弹性碰撞。程序的输出是时间、位置 (rx,ry ,rz) 和速度 (vx,vy,vz)。我使用 GNUplot 绘制轨迹。
我现在遇到的问题是,点质量从某个地方获取能量。所以他们的跳跃每次都变得更加激烈。
有人可以检查我的代码吗?
/* Start of the code */
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
struct pointmass
{
double m; // mass
double r[3]; // coordinates
double v[3]; // velocity
};
// Grav.constant
const double G[3] = {0, -9.81, 0};
int main()
{
int Time = 0; // Duration
double Dt = 0; // Time steps
pointmass p0;
cerr << "Duration: ";
cin >> Time;
cerr << "Time steps: ";
cin >> Dt;
cerr << "Velocity of the point mass (vx,vy,vz)? ";
cin >> p0.v[0];
cin >> p0.v[1];
cin >> p0.v[2];
cerr << "Initial position of the point mass (x,y,z)? ";
cin >> p0.r[0];
cin >> p0.r[1];
cin >> p0.r[2];
for (double i = 0; i<Time; i+=Dt)
{
cout << i << setw(10);
for (int j = 0; j<=2; j++)
{
////////////position and velocity///////////
p0.r[j] = p0.r[j] + p0.v[j]*i + 0.5*G[j]*i*i;
p0.v[j] = p0.v[j] + G[j]*i;
///////////////////reflection/////////////////
if(p0.r[j] >= 250)
{
p0.r[j] = 500 - p0.r[j];
p0.v[j] = -p0.v[j];
}
else if(p0.r[j] <= 0)
{
p0.r[j] = -p0.r[j];
p0.v[j] = -p0.v[j];
}
//////////////////////////////////////////////
}
/////////////////////Output//////////////////
for(int j = 0; j<=2; j++)
{
cout << p0.r[j] << setw(10);
}
for(int j = 0; j<=2; j++)
{
cout << p0.v[j] << setw(10);
}
///////////////////////////////////////////////
cout << endl;
}
}
【问题讨论】:
-
也许是这一行?p0.v[j] = p0.v[j] + G[j]*i;
-
看起来你的速度可能会因为“*i”部分而变得越来越大。无论如何,我不确定我是否理解您的最后一个问题“我怎样才能使整个代码看起来像最后一部分?” - 也许它更适合stackoverflow?
-
最后一个问题(我已删除)“我怎样才能让整个代码看起来像最后一部分?”只是关于我的代码的表示。但现在我认为人们看到了问题的哪一部分是 c++ 代码
-
@J Trana:你有什么建议? “*i”代表时间。所以我需要它来做方程。我不是吗?你觉得我可以做得更好吗?
标签: c++ graph simulation