0 / 0 / 0
Регистрация: 04.11.2015
Сообщений: 1
1

Движение планеты в системе двойной звезды или движение трех тел

09.06.2016, 18:41. Показов 2141. Ответов 1
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
программа должна выводить координаты движения звезд и планеты в файл (рисую в gnuplot).
во-первых, не понимаю, почему выходит, что все три объекта движутся прямолинейно (в численном методе Верле я не до конца разобралась, похоже что ошибка там, потому что формула как для прямолинейного движения, хотя препод говорил, что "вроде верно"), во-вторых, не очень понимаю какие начальные условия задавать, в каком отношении друг к другу (ну например скорость и координаты и масса, в каком отношении они должны быть?). Еще препод сказал, что начальные векторы скорости должны быть по касательной к траектории, то есть насколько я понимаю, перпендикулярно к прямой, соединяющей две звезды, я вроде так и сделала, но все равно все неправильно выводит, может неправильно я и сделала. В общем, не понимаю, что делать(

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
#include <fstream>
#include <iomanip>
#include <math.h>
#include <ctime>
#include<time.h>
#include<stdlib.h>
using namespace std;
 
 
double const G = 6;
 
class TWOSTARS
{
public:
 
    double F1x, F2x, F1y, F2y, F1z, F2z, ex1, ex2, ey1, ey2, ez1, ez2, exs, eys, ezs, FSy, FSz, FSx;
    double rast1, rast2, rasts;
 
    double star1_x,star1_y,star1_z; //координаты первой звезды
    double vstar1_x,vstar1_y,vstar1_z;//координаты скорости первой звезды
    double star2_x,star2_y,star2_z;//координаты второй звезды
    double planet_x,planet_y,planet_z;//координаты планеты
    double vstar2_x,vstar2_y,vstar2_z;//координаты скорости второй звезды
    double vplanet_x,vplanet_y,vplanet_z;//координаты скороти планеты звезды
    double m1,m2,M;//массы звезд и планеты
 
 
    TWOSTARS ()//начальные координаты
    {
        star1_x=15 ;
        star1_y=15 ;
        star1_z= 15;
 
        star2_x=20;
        star2_y= 20 ;
        star2_z= 20 ;
 
        vstar1_x=1 ;
        vstar1_y=1 ;
        vstar1_z=-2 ;
 
 
        vstar2_x= -2;
        vstar2_y= -2;
        vstar2_z= 4;
 
 
 
 
        planet_x= 500;
        planet_y= 500;
        planet_z= 500;
 
        vplanet_x= 1;
        vplanet_y=1 ;
        vplanet_z= 1;
        m1= 20;
        m2= 20;
        M= 5;
    }
 
 
    void changeforce(double planet_x,double planet_y,double planet_z,double star1_x,double star1_y, double star1_z,double star2_x, double star2_y,double star2_z) //сила гравитационного взаимодействия между объектами
    {
 
        rast1 = sqrt( (planet_x-star1_x)*(planet_x-star1_x)+(planet_y-star1_y)*(planet_y-star1_y)+(planet_z-star1_z)*(planet_z-star1_z));// расстояние между планетой и первой звездой
        rast2 = sqrt( (planet_x-star2_x)*(planet_x-star2_x)+(planet_y-star2_y)*(planet_y-star2_y)+(planet_z-star2_z)*(planet_z-star2_z));// расстояние между планетой и второй звездой
        rasts =  sqrt( (star1_x-star2_x)*(star1_x-star2_x)+(star1_y-star2_y)*(star1_y-star2_y)+(star1_z-star2_z)*(star1_z-star2_z));// расстояние между звездами
 
        ex1=(planet_x-star1_x)/rast1;//проекция вектора соединяющего положение планеты и звезды 1 на ось x, нужна чтоб у проекций сил гравитации было направление
        ey1=(planet_y-star1_y)/rast1;//проекция вектора соединяющего положение планеты и звезды 1 на ось y
        ez1=(planet_z-star1_z)/rast1;//проекция вектора соединяющего положение планеты и звезды 1 на ось z
 
        ex2=(planet_x-star2_x)/rast2;//проекция вектора соединяющего положение планеты и звезды 2 на ось x
        ey2=(planet_y-star2_y)/rast2;//проекция вектора соединяющего положение планеты и звезды 2 на ось y
        ez2=(planet_z-star2_z)/rast2;//проекция вектора соединяющего положение планеты и звезды 2 на ось z
 
        exs=(star1_x-star2_x)/rasts;//проекция вектора соединяющего положение звезд на ось x
        eys=(star1_y-star2_y)/rasts;//проекция вектора соединяющего положение звезд  на ось y
        ezs=(star1_z-star2_z)/rasts;//проекция вектора соединяющего положение звезд на ось z
 
        F1x=(G*m1*M*ex1)/((planet_x-star1_x)*(planet_x-star1_x));//проекция силы гравитации между платнетой и звездой 1 на ось х
        F1y=(G*m1*M*ey1)/((planet_y-star1_y)*(planet_y-star1_y));//проекция на ось y
        F1z=(G*m1*M*ez1)/((planet_z-star1_z)*(planet_z-star1_z));//проекция на ось z
 
        F2x=(G*m2*M*ex2)/((planet_x-star2_x)*(planet_x-star2_x));//проекция силы гравитации между платнетой и звездой 2 на ось х
        F2y=(G*m2*M*ey2)/((planet_y-star2_y)*(planet_y-star2_y));//проекция  на ось y
        F2z=(G*m2*M*ez2)/((planet_z-star2_z)*(planet_z-star2_z));//проекция  на ось z
 
        FSx=(G*m1*m2*exs)/((star1_x-star2_x)*(star1_x-star2_x));//проекция силы гравитации между звездами  на ось х
        FSy=(G*m1*m2*eys)/((star1_y-star2_y)*(star1_y-star2_y));//проекция  на ось y
        FSz=(G*m1*m2*ezs)/((star1_z-star2_z)*(star1_z-star2_z));//проекция  на ось z
 
    }
 
    void SaveFileStar1(char filename[])//сохранение в файл координат
    {
        ofstream fout(filename, ios::app);
        fout<< setw(20) << star1_x << setw(20) << star1_y << setw(20) << star1_z << "\n";
    }
 
    void SaveFileStar2(char filename[])
    {
        ofstream fout(filename, ios::app);
        fout<< setw(20) << star2_x << setw(20) << star2_y << setw(20) << star2_z << "\n";
    }
 
    void SaveFilePlanet(char filename[])
    {
        ofstream fout(filename, ios::app);
        fout<< setw(20) << planet_x << setw(20) << planet_y << setw(20) << planet_z << "\n";
    }
 
 
    void Verle()//метод интегрирования Верле
    {
        double const step=1;//шаг по времени
 
        int time = 1000;//все время в течение которого рассматриваем движение
        int amount = (time/step);//сколько шагов нужно сделать в цикле
 
        for (int t=0; t<amount; t++)
        {
            changeforce(planet_x, planet_y, planet_z, star1_x, star1_y, star1_z, star2_x, star2_y, star2_z);//изменяем скорость
 
            vstar1_x=vstar1_x+(F1x-FSx)*step/m1;//здесь и есть сам метод Верле, FSx*step/m1 это формула для скорости после изменения силы
            vstar1_y=vstar1_y+(F1y-FSy)*step/m1;// знак минус потому что вектор F направлен в противоположную сторону
            vstar1_z=vstar1_z+(F1z-FSz)*step/m1;
 
            vstar2_x=vstar2_x+(F2x+FSx)*step/m2;//то же самое для второй звезды
            vstar2_y=vstar2_y+(F2x+FSy)*step/m2;
            vstar2_z=vstar2_z+(F2x+FSz)*step/m2;
 
            vplanet_x+=(-F1x-F2x)/M;//и для планеты
            vplanet_y+=(-F1y-F2y)/M;
            vplanet_z+=(-F1z-F2z)/M;
 
 
            star1_x=star1_x+vstar1_x*step+0.5*FSx*step*step/m1;//тот же метод для координат, тут для звезды 1
            star1_y=star1_y+vstar1_y*step+0.5*FSy*step*step/m1;
            star1_z=star1_z+vstar1_z*step+0.5*FSz*step*step/m1;
 
            star2_x=star2_x+vstar2_x*step+0.5*FSx*step*step/m2;//координаты звезды 2
            star2_y=star2_y+vstar2_y*step+0.5*FSy*step*step/m2;
            star2_z=star2_z+vstar2_z*step+0.5*FSz*step*step/m2;
 
            planet_x+=vplanet_x*step;//координаты планеты
            planet_y+=vplanet_y*step;
            planet_z+=vplanet_z*step;
 
            SaveFileStar1("Star1"); //сохранение в файл координат
            SaveFileStar2("Star2");
            SaveFilePlanet("Planet");
 
        }
    }
};
 
 
 
 
 
int main()
{
    ofstream Star1("Star1", ios::trunc); //чистим файл если там что-то есть
    Star1.close(); //закрываем его
    ofstream Star2("Star2", ios::trunc);
    Star2.close();
    ofstream Planet("Planet", ios::trunc);
    Planet.close();
 
    TWOSTARS planet;//используем наш класс
    planet.Verle();//вызываем в классе функцию которая просчитывает координаты
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.06.2016, 18:41
Ответы с готовыми решениями:

Движение планеты вокруг солнца
Доброго времени суток, нужна помощь... то ли с Матлабом, то ли с физикой :) (скорее второе) Не...

Вращение и движение по синусоиде звезды
Нужно нарисовать такую фигурку. что бы она двигалась по синусоиде и вращалась вокруг центра(((...

Программа движение Shape по орбитам, как планеты
Нужна помощь в том чтобы два Shape двигалось за разными радиусами вокруг 3-го Shape как планеты...

Изобразить движение планеты вокруг солнца по эллипсу
изобразить движение планеты вокруг солнца по эллипсу.

1
Модератор
3371 / 2143 / 352
Регистрация: 13.01.2012
Сообщений: 8,331
10.06.2016, 11:01 2
Цитата Сообщение от anpolol Посмотреть сообщение
changeforce
может я просто не совсем понял метод но... сила вроде обратно пропорциональна квадрату расстояния между телами а у вас она обратно пропорциональна квадрату разностей координат по выбранной оси и еще умножается на какую-то проекцию... зачем? просто посчитать суперпозицию сил и спроектировать результирующий вектор на ось разве нельзя?
начальные данные можете задавать какие угодно модель их все равно должна переварить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.06.2016, 11:01
Помогаю со студенческими работами здесь

Графический режим: движение цветной звезды
В паскале,в графическом режиме написать программу,которая демонстрирует движение цветной звезды по...

Движение 3х планет методом итераций (планеты не правильно летят)
Пытаюсь смоделировать движение 3х материальных точек методом итераций, а у меня они летят вверх...

Движение двух тел
Под мостом моторная лодка обогнала плот. Плот, пройдя 10 км, не меняя работы двигателя, развернулся...

Движение небесных тел
Здравствуйте. Я хочу создать проект движение небесных тел (в 3D). Я новичок. До этого разработки в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru