我在C ++中有这个代码,它假设在xy平面中模拟身体(body2)围绕另一个(body1)的旋转,并将body2的x和y位置保存在文件中:
#include<iostream>
#include <vector>
#include<math.h>
#include <fstream>
using namespace std;
class Body{
private:
double G= 1;
double rx;
double ry;
double rz;
double vx;
double vy;
double vz;
double mass;
double fx;
double fy;
double fz;
double dt=0.01;
public:
Body(double rx, double ry, double rz, double vx, double vy, double vz, double mass){
this->rx=rx;
this->ry=ry;
this->rz=rz;
this->vx=vx;
this->vy=vy;
this->vz=vz;
this->mass=mass;
}
void update(){
vx=vx+dt*fx/mass;
vy=vy+dt*fy/mass;
vz=vz+dt*fz/mass;
rx=rx+vx*dt;
ry=ry+vy*dt;
rz=rz+vz*dt;
}
double get_x(){
return rx;
}
double get_y(){
return ry;
}
double get_z(){
return rz;
}
double get_fx(){
return fx;
}
void resetForce(){
fx=0.0;
fy=0.0;
fx=0.0;
}
void addForce(Body b){
double dx=b.rx-rx;
double dy=b.ry-ry;
double dz=b.rz-rz;
double dist = sqrt(dx*dx+dy*dy+dz*dz);
double F=G*mass*b.mass/dist*dist;
fx=fx+F*dx/dist;
fy=fy+F*dy/dist;
fz=fz+F*dz/dist;
}
};
int main(){
Body body1(0,0,0,0,0,0,1000), body2(100,0,0,0,10,0,10);
ofstream pos;
pos.open ("Position.txt");
int N=10000;
for(int i; i<N;i++){
body2.resetForce();
body2.addForce(body1);
body2.update();
pos<<body2.get_x()<<" "<<body2.get_y()<<endl;
}
pos.close();
}
我预计情节看起来像原点周围的圆圈(body1所在的位置),但它看起来像这样:
我认为我在每一步更新速度和力量的方式有问题,但我找不到错误,所以我感谢任何帮助。
谢谢!
答案 0 :(得分:1)
第一个错误在于
double F=G*mass*b.mass/dist*dist;
此行将被解释为double F=(G*mass*b.mass/dist)*dist;
,因此您会看到我们的结果不正确,您需要这一行
double F=G*mass*b.mass/(dist*dist);
其次,你要在这一行的每个模拟步骤中增加力量
fx=fx+F*dx/dist;
fy=fy+F*dy/dist;
fz=fz+F*dz/dist;
但我想你不应该这样做,你需要这样改变
fx=F*dx/dist;
fy=F*dy/dist;
fz=F*dz/dist;
第三,我还假设你的身体在初始配置中实际上彼此相距很远,你可以像这样减少初始距离:
Body body1(0,0,0,0,0,0,1000), body2(10,0,0,0,10,0,10);
实际上你也应该考虑到body2对body1的影响力,但是你可以说它太小了。