드래그 앤 드롭으로 즐겨찾기 아이콘 위치 수정이 가능합니다.
게시물ID : science_1223 짧은주소 복사하기
작성자 : Tarmix ★
추천 : 1
조회수 : 945회
댓글수 : 3개
등록시간 : 2010/05/15 01:19:16
제한된 3체 문제(restricted three-body problem)를 풀고 있습니다. 한 질량은 좌표의 원점에 정지해있고, 다른 한 질량은 원점을 중심으로 원운동을 하구요. 궤적을 살펴보고자 하는 질량의 초기 위치와 초기 속도를 대입하게 되면 궤적을 구할 수 있게 프로그램을 짰는데요... 원래 제한된 3체 문제에서는 타겟이 되는 질량의 역학적 에너지가 보존이 안되는 건지 궁금하네요.. .. 고민하다가 소스 코드를 올려드립니다. 초기 값을 150 150 0 0 그리고 140 160 0 0 을 넣어보세요..;; 파일은 엑셀로 출력되구요. A열부터 차례로 시간, x, y, x방향 속도, y방향 속도, 원운동하는 두 번째 질량의 x, y, 타겟의 역학적 에너지의 합입니다.. #include <stdio.h> #include <math.h> #define c 20.0 #define m1 40.0 #define m2 20.0 #define R 100.0 #define h 0.01 double fwx(double t, double x, double y) { double res; double wr=sqrt(c*m1/pow(R,3)); res=c*m1/(pow(x,2)+pow(y,2))*(-x)/sqrt(pow(x,2)+pow(y,2))+c*m2/(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2))*(-x+R*cos(wr*t))/sqrt(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2)); return res; } double fwy(double t, double x, double y) { double res; double wr=sqrt(c*m1/pow(R,3)); res=c*m1/(pow(x,2)+pow(y,2))*(-y)/sqrt(pow(x,2)+pow(y,2))+c*m2/(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2))*(-y+R*sin(wr*t))/sqrt(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2)); return res; } double fenergy(double t, double x, double y, double wx, double wy) { double res; double wr=sqrt(c*m1/pow(R,3)); res=-c*m1/sqrt(pow(x,2)+pow(y,2))-c*m2/sqrt(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2))+(pow(wx,2)+pow(wy,2))/2.0; return res; } int fimp1(double x, double y) { int res; if(sqrt(pow(x,2)+pow(y,2))<=pow(10,1)) res=0; else res=1; return res; } int fimp2(double t, double x, double y) { int res; double wr=sqrt(c*m1/pow(R,3)); if(sqrt(pow(x-R*cos(wr*t),2)+pow(y-R*sin(wr*t),2))<=pow(10,1)) res=0; else res=1; return res; } int fimp(int fimp1, int fimp2) { int res; res=fimp1*fimp2; return res; } int main(void) { double t, x, y, wx, wy; double kx[4], kwx[4], ky[4], kwy[4]; double wr=sqrt(c*m1/pow(R,3)); char fname[]= "test 001.xls"; FILE *f; f=fopen(fname, "w"); printf("input the initial values of x, y, dx/dt, dy/dt in order\n"); scanf("%lf %lf %lf %lf", &x, &y, &wx, &wy); fprintf(f, "c=%.2lf m1=%.2lf m2=%.2lf R=%.2lf h=%.2lf\n", c, m1, m2, R, h); fprintf(f, "x0=%.2lf y0=%.2lf vx0=%.2lf vy0=%.2lf\n\n", x, y, wx, wy); for(t=0;fimp(fimp1(x,y),fimp2(t,x,y));t=t+h) { fprintf(f,"%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",t,x,y,wx,wy,R*cos(wr*t),R*sin(wr*t),fenergy(t,x,y,wx,wy)); kx[0]=wx; ky[0]=wy; kwx[0]=fwx(t,x,y); kwy[0]=fwy(t,x,y); kx[1]=wx+0.5*kwx[0]*h; ky[1]=wy+0.5*kwy[0]*h; kwx[1]=fwx(t+0.5*h,x+0.5*kx[0]*h,y+0.5*ky[0]*h); kwy[1]=fwy(t+0.5*h,x+0.5*kx[0]*h,y+0.5*ky[0]*h); kx[2]=wx+0.5*kwx[1]*h; ky[2]=wy+0.5*kwy[1]*h; kwx[2]=fwx(t+0.5*h,x+0.5*kx[1]*h,y+0.5*ky[1]*h); kwy[2]=fwy(t+0.5*h,x+0.5*kx[1]*h,y+0.5*ky[1]*h); kx[3]=wx+kwx[2]*h; ky[3]=wy+kwy[2]*h; kwx[3]=fwx(t+h,x+kx[2]*h,y+ky[2]*h); kwy[3]=fwy(t+h,x+kx[2]*h,y+ky[2]*h); x=x+(kx[0]+2*kx[1]+2*kx[2]+kx[3])*h/6.0; y=y+(ky[0]+2*ky[1]+2*ky[2]+ky[3])*h/6.0; wx=wx+(kwx[0]+2*kwx[1]+2*kwx[2]+kwx[3])*h/6.0; wy=wy+(kwy[0]+2*kwy[1]+2*kwy[2]+kwy[3])*h/6.0; } fclose(f); } 초기값 140 160 0 0 에서.. 이놈이 중심으로부터 되게 멀리 떨어지는 걸 확인할 수 있는데요. 이게 정상인건지 아니면 수치해석하다가 나타난 오류인건지 그것도 잘 모르겠네요;; 역학적 에너지가 보존되는지부터가 궁금함..
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.
새로운 댓글이 없습니다.