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

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

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

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

17.04.2012, 19:14. Просмотров 354. Ответов 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     Я астроном, а не программист(
Посмотрите здесь:

3 вакансии: программист C#, программист actionscript, программист Java в Москве - Предложения работодателей
В Москве открывается крупный проект по разработке приложений на технологии Augmented Reality (расширенная реальность). Требуются...

Горящие вакансии! (Технический писатель UML, WEB программист, Программист под Android) - Предложения работодателей
Добрый день! Меня зовут Елена, ОЧЕНЬ нужны профессиональные сотрудники в молодую развивающуюся компанию! Наша компания существует с...

Отношения и брак: женщина программист + программист мужчина.
Может быть несколько глупо, но меня действительно интересует этот вопрос). Существуют ли пары ITшница+ITшник))))) или &quot;нуууу... это уже...

Ищу удаленную работу Программист/Веб-программист - Предложения работодателей
Ищу удаленную работу программистом или веб-программистом. Также возможен переезж в любой город при обеспечении жилья или высокой з/п,...

Требуется Web-программист и Mangos-программист - Предложения работодателей
Mangos Development: Требуется программист для работы над игровым сервером world of warcraft на базе сервера Mangos. Требования: ...

Программист Delphi, программист VB + C# + MS SQL Server - Предложения работодателей
В крупную инвестиционную компанию требуются программисты: 1) Delphi, обязательно знание Win API. Желательно знание С++ и опыт разработки...

C++ программист / ведущий программист (1200$ - 2500$) - Предложения работодателей
C++ программист / ведущий программист (1200$ - 2500$) Город: Москва Месторасположение:

Инженер-программист или системный программист? - Образование
Здравствуйте! Я заканчиваю 11 класс, собираюсь поступать на высшее на программиста. Наткнулся на 2 ВУЗа, и не могу выбрать из 2х...

C++ программист/ведущий программист (1200$ - 2500$) - Предложения работодателей
Месторасположение: м. Пр.Вернадского(после Нового Года офис переезжает на м. Савеловская /м. Рижская) Работодатель: ...

Вакансии программист С++ и программист микроконтроллеров СПб - Предложения работодателей
В компанию СТЦ (фирма занимается разработкой и производством БПЛА) приглашаются сотрудники Программист С++ Требования -...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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, Спасибо большое!
Ответ Создать тему
Опции темы

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