В настоящее время я пытаюсь выполнить задание, где мне нужно написать симуляцию для ограниченной гравитационной задачи с тремя телами, с двумя фиксированными массами и одной тестовой массой. Информация, которую я получил по этой проблеме: Проверьте эту ссылку и вот моя программа на данный момент:
#include<stdlib.h>
#include<stdio.h>
#include <math.h>
int main (int argc, char* argv[])
{
double dt=0.005, x[20000],y[20000],xv,yv,ax,ay,mneg,mpos,time,radius=0.01;
int n,validation=0;
FILE* output=fopen("proj1.out", "w");
printf("\n");
if((argv[1]==NULL) || (argv[2]==NULL) || (argv[3]==NULL) || (argv[4]==NULL) || (argv[5]==NULL) || (argv[6]==NULL))
{
printf("************************ ERROR! ***********************\n");
printf("** Not enough comand line arguments input. **\n");
printf("** Please run again with the correct amount (6). **\n");
printf("*******************************************************\n");
validation=1;
goto VALIDATIONFAIL;
}
if((sscanf(argv[1], "%lf", &mneg)==NULL) || (sscanf(argv[2], "%lf", &mpos)==NULL) || (sscanf(argv[3], "%lf", &x[0])==NULL) ||
(sscanf(argv[4], "%lf", &y[0])==NULL) || (sscanf(argv[5], "%lf", &xv)==NULL) || (sscanf(argv[6], "%lf", &yv)==NULL) )
{
printf("************************* ERROR! ************************\n");
printf("** Input values must be numbers. Please run again with **\n");
printf("** with numerical inputs (6). **\n");
printf("*********************************************************\n");
validation=1;
goto VALIDATIONFAIL;
}
sscanf(argv[1], "%lf", &mneg);
sscanf(argv[2], "%lf", &mpos);
sscanf(argv[3], "%lf", &x[0]);
sscanf(argv[4], "%lf", &y[0]);
sscanf(argv[5], "%lf", &xv);
sscanf(argv[6], "%lf", &yv);
x[1]=x[0]+(xv*dt);
y[1]=y[0]+(yv*dt);
for(n=1;n<10000;n++)
{
if(x[n-1]>=(1-radius) && x[n-1]<=(1+radius) && y[n-1]>=(0-radius) && y[n-1]<=(0+radius))
{
printf("Test mass has collided with M+ at (1,0), Exiting...\n");
goto EXIT;
}
else if(x[n-1]>=(-1-radius) && x[n-1]<=(-1+radius) && y[n-1]>=(0-radius) && y[n-1]<=(0+radius))
{
printf("Test mass has collided with M- at (-1,0), Exiting...\n");
goto EXIT;
}
else
{
double dxn = x[n] + 1;
double dxp = x[n] - 1;
double mnegdist = pow((dxn*dxn + (y[n]*y[n])), -1.5);
double mposdist = pow((dxp*dxp + (y[n]*y[n])), -1.5);
ax = -(mpos*dxp*mposdist+mneg*dxn*mnegdist);
ay = -(mpos*y[n]*mposdist+mneg*y[n]*mnegdist);
x[n+1]=((2*x[n])-x[n-1] +(dt*dt*ax));
y[n+1]=((2*y[n])-y[n-1]+(dt*dt*ay));
fprintf(output, "%lf %lf\n",x[n-1], y[n-1]);
}
}
VALIDATIONFAIL:
printf("\n");
return(EXIT_FAILURE);
EXIT:
return(EXIT_SUCCESS);
}
Моя программа работает в определенной степени, но у меня возникают странные проблемы, с которыми, я надеюсь, кто-то может мне помочь.
Основная проблема заключается в том, что когда тестовая масса достигает точки на своей траектории, когда она должна оторваться и начать вращаться вокруг другой массы, вместо этого она просто улетает по прямой линии в бесконечность! Сначала я подумал, что массы сталкиваются, поэтому я включил проверку радиуса, но в некоторых случаях это работает, в некоторых нет, а в некоторых случаях массы сталкиваются раньше, прежде чем траектория все равно пойдет не так. так что дело явно не в этом. Я не уверен, что объяснил это слишком хорошо, поэтому вот картинка, чтобы показать вам, что я имею в виду. (моделирование справа взято из здесь)
Однако это не всегда так, иногда вместо того, чтобы идти по прямой, траектория просто сходит с ума, когда она должна перейти к другой массе, вот так:
Я действительно абсолютно не знаю, что происходит, я потратил дни, пытаясь понять это, но просто не могу никуда добраться, поэтому любая помощь в определении моей проблемы будет очень признательна.
argv[x]
сNULL
, вместо этого проверьтеargc
. Кроме того,sscanf
возвращает целое число, а не указатель, поэтому технически вы должны сравнивать с0
, а не сNULL
. Вам также не нужно дважды вызыватьsscanf
для преобразования числа. И вместо использованияsscanf
для преобразования аргументов в значения с плавающей запятой проверьтеstrtod
< /а> функция. - person Some programmer dude   schedule 19.12.2012goto
s. Возможно, ранниеreturn
могут быть плохими или запутанными, ноgoto
уже давно ушли по пути Додо. - person   schedule 19.12.2012