xy 평면에서 다른 하나 (body1)를 중심으로 바디 (body2)의 회전을 시뮬레이션하고 body2의 x 및 y 위치를 파일에 저장하는 C ++ 코드가 있습니다.
#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이있는 곳) 주변의 원처럼 보일 것으로 예상했지만 다음과 같습니다.
각 단계에서 속도와 힘을 업데이트하는 방식에 문제가 있다고 생각하지만 실수를 찾을 수 없으므로 도움을 주셔서 감사합니다.
감사합니다!
첫 번째 실수는 줄에 있습니다
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에 영향을 미치는 힘도 고려해야하지만 그렇다고 너무 작다고 말할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다