Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ЯНАЧЧКА
Сообщений: n/a
#1

Я астроном, а не программист( - C++

17.04.2012, 19:14. Просмотров 347. Ответов 2
Метки нет (Все метки)

Знаю, с такими просьбами уже задолбали(
Помогите, пожалуйста!
У меня есть программа, в которой я задаю начальные координаты объекта(x, y, z, v_x, v_y, v_z), задаю интервал времени (T), и программа выдает координаты, которые принимает тело спустя заданное время.
(Речь идет о движении звезд в Галактике)
Программа работает правильно. Всё хорошо.
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
178
179
180
181
182
// 
 
 
#include <iostream>
#include <cmath>
using namespace std;
 
void Runge_Kutta (int, double, double *, void (*f));
double dphi_dx(double, double, double);
double dphi_dy (double, double, double);
double dphi_dz (double,double, double);
double dphi_dr (double, double, double);
void diff_equi (int, double*);
void star(double ,double* , double , double , double, double, double, double );
 
int main () {
    int n=6, i;
    double input[6], x, y, z, v_x, v_y, v_z;
    double T=1e7, a;
    x=8.3;
    y=0;
    z=0;    
    v_x=0;
    v_y=2.3e-7;
    v_z=0;
    input[0] = x; 
    input[1] = y; 
    input[2] = z;
    input[3] = v_x; 
    input[4] = v_y; 
    input[5] = v_z;
    star(T, &input[0], x, y, z, v_x, v_y, v_z );
    for (i=0;i<6;i++)
    cout<<input[i]<<endl;
    cin>>a;
return 0; }
 
void Runge_Kutta (int n, double T, double * input, void (*f)(int n, double * in_fun)) {
double result [6], h;
double quant_it;
double frac_quant, step = 1000;
frac_quant = modf (T/step, &quant_it);      //
if (quant_it < 0) {
quant_it *= -1;
h = -step;          }
else
h = step;       
double k_1[n], k_2[n], k_3[n], k_4[n];
double vect_for_sent[n];
double t = 0;
 
    for (int i = 0; i < quant_it; i++)              {
            for (int k = 0; k < n; k++)
                vect_for_sent[k] = input[k];
            f(n, &vect_for_sent[0]);    
            for (int k = 0; k < n; k++)     {           
                k_1[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] + 0.5 * h * k_1[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     {
                k_2[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] + 0.5 * h * k_2[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     {           
                k_3[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] +  h * k_3[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     { 
                k_4[k] = vect_for_sent[k];
                input[k] += 1./6. * h * (k_1[k] + 2*k_2[k] + 2*k_3[k] + k_4[k]);
                            }
                t+=h;
                                    }
 
quant_it = 1;
h = step * frac_quant;
    for (int i = 0; i < quant_it; i++)              {
            for (int k = 0; k < n; k++)
                vect_for_sent[k] = input[k];
            f(n, &vect_for_sent[0]);    
            for (int k = 0; k < n; k++)     {           
                k_1[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] + 0.5 * h * k_1[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     {
                k_2[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] + 0.5 * h * k_2[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     {           
                k_3[k] = vect_for_sent[k];
                vect_for_sent[k] = input[k] +  h * k_3[k];
                            }
            f(n, &vect_for_sent[0]);
            for (int k = 0; k < n; k++)     { 
                k_4[k] = vect_for_sent[k];
                input[k] += 1./6. * h * (k_1[k] + 2*k_2[k] + 2*k_3[k] + k_4[k]);
                            }
                t+=h;
                                    }
 
}
 
 
double G = 2.2608e-57, M_sol = 2e33;
double M_dh = 1.45e+11*M_sol, M_b = 9.3e+9*M_sol, M_n = 1.e+10*M_sol;
double beta_1 = 0.4, beta_2 = 0.5, beta_3 = 0.1;
double h_1 = 0.325, h_2 = 0.090, h_3 = 0.125;
double a_G = 2.4;
double b_dh = 5.5, b_b = 0.25, b_n = 1.5;
 
double dphi_dx (double x, double y, double z) {
double res;
 
res = (M_dh*x*G)/pow(pow(a_G+beta_3*sqrt(z*z+h_3*h_3)+beta_2*sqrt(z*z+h_2*h_2)+beta_1*sqrt(z*z+h_1*h_1),2)+y*y+x*x+b_dh*b_dh, 3./2.) + (M_b*x*G)/pow(y*y+x*x+b_b*b_b, 3./2.)+ (M_n*x*G)/pow(y*y+x*x+b_n*b_n, 3./2.);
return res;
}
 
double dphi_dy (double x, double y, double z) {
double res;
 
res = (M_dh*y*G)/pow(pow(a_G+beta_3*sqrt(z*z+h_3*h_3)+beta_2*sqrt(z*z+h_2*h_2)+beta_1*sqrt(z*z+h_1*h_1),2)+y*y+x*x+b_dh*b_dh, 3./2.) + (M_b*y*G)/pow(y*y+x*x+b_b*b_b, 3./2.)+ (M_n*y*G)/pow(y*y+x*x+b_n*b_n, 3./2.);
return res;
}
 
double dphi_dz (double x, double y, double z) {
double res;
 
res = (M_dh*((beta_3*z)/sqrt(z*z+h_3*h_3)+(beta_2*z)/sqrt(z*z+h_2*h_2)+(beta_1*z)/sqrt(z*z+h_1*h_1))*(a_G+beta_3*sqrt(z*z+h_3*h_3)+beta_2*sqrt(z*z+h_2*h_2)+beta_1*sqrt(z*z+h_1*h_1))*G)/pow(pow(a_G+beta_3*sqrt(z*z+h_3*h_3)+beta_2*sqrt(z*z+h_2*h_2)+beta_1*sqrt(z*z+h_1*h_1),2)+y*y+x*x+b_dh*b_dh, 3./2.);
return res;
}
 
double dphi_dr (double x, double y, double z) {
double res;
double r = sqrt(x*x+y*y);
 
res = (M_dh*r*G)/pow(pow(a_G+beta_3*sqrt(z*z+h_3*h_3)+beta_2*sqrt(z*z+h_2*h_2)+beta_1*sqrt(z*z+h_1*h_1),2)+r*r+b_dh*b_dh, 3./2.) + (M_b*r*G)/pow(r*r+b_b*b_b, 3./2.) + (M_n*r*G)/pow(r*r+b_n*b_n, 3./2.);
return res;
}
 
 
void diff_equi (int n, double * input) {
double result [6];
result[3] = - dphi_dx(input[0], input[1], input[2]);
result[4] = - dphi_dy(input[0], input[1], input[2]);
result[5] = - dphi_dz(input[0], input[1], input[2]);
result[0] = input [3];
result[1] = input [4];
result[2] = input [5];
 
    for (int i = 0; i < n; i++)
        input[i] = result[i];
}
 
 
 
void star(double T,double* input, double x, double y, double z, double v_x, double v_y, double v_z ) {
double result [6];
 
result [0] = x;
result [1] = y;
result [2] = z;
result [3] = v_x;
result [4] = v_y;
result [5] = v_z;   
 
//cout<<"A neutron star is moving to "<<T<<endl;
 
Runge_Kutta (6, T, &input[0], &diff_equi);
 
x   = result [0];
y   = result [1];
z   = result [2];
v_x = result [3];
v_y = result [4];
v_z = result [5];
 
}
Но, увы, задача поменялась. Для моделирования такого движения мне нужно множество точек(где-то 1000)
Мне надо, чтобы программа выдавала координаты через равноотстоящие промежутки времени(каждую 1000 лет), причем выводила их все столбцами (столбец T, столбец x, ..)
Была бы очень признательна за помощь. Астрономию обожаю, а программирование не дается( Как я понимаю, надо внести изменения в main , но что-то у меня не получается
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.04.2012, 19:14     Я астроном, а не программист(
Посмотрите здесь:

Начинающий программист C++
C++ Что должен знать начинающий программист?
C++ Начинающий си/си++ программист
C++ Программист Саша участвует в создании блог-сервиса Jивой Jурнал...
Нужен очень внимательный программист с++ C++
C++ Вакансия программист С++ в Москве
Начинающий программист C++
C++ Мидл-программист с++
C++ программист С++ удалёнка - реально ли?
Начинающий программист: с какой программы начать? C++
C++ что должен знать программист который уверенно знает язык ?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
17.04.2012, 19:26     Я астроном, а не программист( #2
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
int main () {
    int n=6, i,period=1000;
    unsigned long long current_T;
    double input[6], x, y, z, v_x, v_y, v_z;
    double T=period;
    x=8.3;
    y=0;
    z=0;    
    v_x=0;
    v_y=2.3e-7;
    v_z=0;
    input[0] = x; 
    input[1] = y; 
    input[2] = z;
    input[3] = v_x; 
    input[4] = v_y; 
    input[5] = v_z;
    current_T=T;
    for (i=0;i<100;i++)
     {
      star(period, &input[0], x, y, z, v_x, v_y, v_z );
      x=input[0];
      y=input[1];
      z=input[2];
      v_x=input[3];
      v_y=input[4];
      v_z=input[5];
      cout<<current_T<<" "<<x<<" "<<y<<" "<<z<<endl;
      current_T+=period;
     }
     system("pause");
return 0; }

Не по теме:

а если не прикинуться блонди-девочкой, то не помогут?

ЯНАЧЧКА
Сообщений: n/a
17.04.2012, 19:59     Я астроном, а не программист( #3
Это мое фото

Добавлено через 27 минут
Nekto, Спасибо большое!
Yandex
Объявления
17.04.2012, 19:59     Я астроном, а не программист(
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru