2个C ++旋转体

时间:2016-03-04 17:42:57

标签: c++

我在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所在的位置),但它看起来像这样: enter image description here

我认为我在每一步更新速度和力量的方式有问题,但我找不到错误,所以我感谢任何帮助。

谢谢!

1 个答案:

答案 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的影响力,但是你可以说它太小了。