Реферат: Планирование разработки программного продукта
Определяется объем ПС ВТ (в тыс. условных команд) [9]. Он равен примерно 5. Рассчитывается общий объем разрабатываемого ПО ВТ (V0) по формуле:
[sms]V0 = е Vi (1)
где Vi - объем функций ПС ВТ;
N - общее количество функций ПС ВТ.
Определяется группа сложности разрабатываемого ПО. Так как разработанная программа имеет мощный интеллектуальный языковый интерфейс высокого уровня с пользователем и режим работы в реальном времени, то она относится к 1 группе сложности.
Определяется значение коэффициента, учитывающего уровень повышения сложности ПС ВТ (Ki). Он равен 0,12, так как у ПС ВТ имеется одновременно несколько характеристик.
Определяется дополнительный коэффициент сложности ПС ВТ (Kсл) по формуле:
Kсл = 1 + е Ki (2)
где n - количество дополнительно учитываемых характеристик ПС ВТ.
Kсл = 1 + 2 * 0,12 = 1,24.
Определяются затраты труда на разработку ПС ВТ (Tр). Для 1-ой группы сложности и объема в 5 тыс. команд они равны 1015 чел.-дней.
Рассчитывается общая трудоемкость (T0) разработки ПС ВТ по формуле:
Т0 = Kсл*Tp (3)
Т0 = 1258,6 чел.-дней.
Определяется удельный вес трудоемкости i-ой стадии разработки (Li):
ТЗ = 0,1
ЭП = 0,08
ТП = 0,09
РП = 0,58
ВН = 0,15
Определяется значение поправочного коэффициента (Kн) - он равен 0,7.
Определяется значение коэффициента (Kт) - он равен 0,7.
Рассчитывается трудоемкость каждой операции ( Т ) разработки ПС ВТ по формулам:
T1 = L1 Kн Т0 = 0,1*0,7*1258,6 = 88,102 чел.-дней.
T2 = L2 Kн Т0 = 0,08*0,7*1258,6 = 70,48 чел.-дней.
T3 = L3 Kн Т0 = 0,09*0,7*1258,6 = 79,29 чел.-дней.
T4 = L4 Kн Kт Т0 = 0,58*0,7*0,7*1258,6 = 357,69 чел.-дней.
T5 = L5 Kн Т0 = 0,1*0,15*1258,6 = 18,88 чел.-дней.
Определение трудоемкости на изготовление и сопровождение ПС ВТ.
При разработке ИАС, как правило, пользуются услугами сторонних организаций. Поэтому при планировании стадий разработки ИАС необходимо определить продолжительность следующих работ, выполняемых организациями-изготовителями ПС ВТ:
формирование и ведение фонда ПС ВТ (приемка и освоение опытного образца ПС ВТ (ОПС ВТ); ведение фонда программ, документации, методических материалов).
постановка ПС ВТ на производство (проверка и оценка ОПС ВТ; корректировка ПС ВТ; подготовка ПС ВТ к сопровождению; формирование эталона ПС ВТ; включение эталона ПС ВТ в фонд).
изготовление ПС ВТ (изготовление программ и контроль комплекта поставки программной части ПС ВТ; изготовление технической документации).
сопровождение ПС ВТ у пользователя.
оказание научно-технических услуг по ПС ВТ на контрольных задачах пользователей; ввод поставленных ПС ВТ в эксплуатацию на реальных задачах пользователя: настройка поставленных ПС ВТ на параметры задач пользователя без внесения изменений; генерация корректных вариантов ПС из дистрибутива под параметры системы обработки информации (СОИ) или ЭВМ; комплексирование ПС ВТ с другими, входящими в СОИ без внесения изменений в ПС ВТ; доработка ПС ВТ без создания дополнительных модулей и значительных изменений функциональных возможностей ПС ВТ; разработка дополнительных модулей к ПС ВТ; разработка новых тестов, позволяющих моделировать ситуации возникновения ошибок в условиях пользователя; тестирование поставленных ПС ВТ, устранение ошибок; сопровождение поставленных ПС ВТ в послегарантийный период; передача ПС ВТ в аренду.
оказание научно-технических услуг по объектам внедрения ПС ВТ (выбор ПС ВТ, позволяющих реализовать необходимые функции, определение возможностей применения ПС ВТ в конкретных условиях; разработка рекомендаций по доработке ПС ВТ и развитию СОИ; организационно-техническое проектирование технологических процессов обработки информации и процессов разработки сопровождения ПС ВТ ).
Определение нормы времени на приемку и освоение ОПС ВТ (Нвр.ос.). Объем документации составляет около 3 - 4 тыс. строк, поэтому она равна 38.
Определение коэффициента, учитывающего уровень повышения сложности (Ксл); он равен для 1 расширения - 0,18; для второго - 0,20.
Рассчитываем коэффициент, учитывающий сложность ПС ВТ по формуле:
Kсл = 1 + е Kслi (4)
где m - количество показателей повышения сложности для конкретного ПС ВТ.
Kсл = 1 + 0,18 + 0,20 = 1,28.
Определим поправочный коэффициент, учитывающий наличие в фонде аналогов ПС ВТ (Kан). Если есть, то он равен 1, иначе - 1,25. Kан=1.
Определим трудоемкость приемки и освоения ОПС ВТ (Тос) по формуле:
Тос = Kсл Kан Нвр.ос. (5)
Тос = 1,28*1*38 = 48,64 .
Определим норму времени на ведение фонда на одно ПС ВТ в год Нвр.вф. по формуле:
Нвр.вф. = 0,51 Нвр.ос. (6)
Нвр.вф. = 19,38.
Определим трудоемкость ведения фонда на одно ПС ВТ по формуле:
Твф = 0,8 Kсл Нвр.вф. (7)
где 0,8 - коэффициент, понижающий влияние сложности ПС ВТ на трудоемкость ведения фонда.
Твф = 19,84 чел.-дней.
Определим трудоемкость ведения фонда программы ПС ВТ на одно пакетовнедрение Твф по формуле:
Твф = Твф /n (8)
где n - среднее количество пакетовнедрений в год для одного ПС ВТ (среднее n = 4).
Твф = Твф /4 = 4,96 чел.-дней.
Определим норму времени на проверку и оценку ОПС ВТ Нвр.пр. по формуле:
Нвр.пр. = Нвр.ос. (9)
Нвр.пр. = 38
Трудоемкость включения эталона ПС в фонд Твк (аттестация ПС ВТ, принятие решения о поставке) можно принять равным 5 чел.-дням.
Трудоемкость изготовления и контроля комплекта поставки программной части ПС ВТ на магнитном носителе можно принять равным 1 чел.-день.
Определим норму времени на изготовление технической документации полиграфическим способом Нвр.ид.. Она равна 3,1. Трудоемкость изготовления технической документации Тид = Нвр.ид..
Определим норму времени на формирование эталона ПС ВТ Нвр.фэ. по формуле:
Нвр.фэ. = 0,5 Нвр.ос. (10)
Нвр.пс. = 19
Определим трудоемкость формирования эталона ОПС ВТ Тфэ по формуле:
Тфэ = Kсл Нвр.фэ. (11)
Тфэ = 1,28*19 = 24,32 чел.-дней.
Трудоемкость ввода поставленных ПС ВТ в эксплуатацию Твв на реальных задачах пользователя рассчитывается по формуле:
Твв = Кхв Ксл Нвр.вв. (12)
где Нвр.вв. - норма времени на ввод поставленных ПС ВТ в эксплуатацию на реальных задачах пользователя; Нвр.вв. = 42-67,2 в зависимости от изменения объема программы от 1 до 190 ТУМ.
Твв = 69,88 чел.-дней.
Трудоемкость комплексирования ПС ВТ (оценка соответствия функциональных характеристик ПС ВТ требованиям к обработке данных, рекомендации по созданию программных средств сопряжения) определяют по формуле:
Ткм = Кхв Нвр.км. (13)
где Нвр.км. - норма времени на комплексирование ПС ВТ с другими программными средствами; Нвр.км. = 45-72 в зависимости от изменения объема программы от 1 до 190 ТУМ.
Ткм = 58,5 чел.-дней.
Определяем норму времени на доработку программных средств без создания дополнительных модулей Нвр.др. . Она равна 20. Трудоемкость доработок определяем по формуле:
Тдр = Ксл Нвр.др. (14)
Тдр = 25,6 чел.-дней.
Трудоемкость изготовления технической документации на МН определяется по формуле:
Тдм = 2,17 Тид (15)
Тдм = 6,727 чел.-дней.
Трудоемкость изменения эталона ПС ВТ Тиэ определяется по формуле:
Тиэ = 0,4 Ксл Тфэ (17)
Тиэ = 0,4*1,28*24,32 = 12,45 чел.-дней.
Трудоемкость поставки ПС ВТ Топ можно принять в пределах от 2 до 10.
Трудоемкость проверки функционирования поставленных ПС ВТ на контрольных задачах пользователя Тпф рассчитывается по формуле:
Тпф = Кхв Нвр.пф. (18)
где Кхв - коэффициент, учитывающий характер внедрения ПС ВТ. Для комплекса взаимосвязанных ПС ВТ он равен 1,3.
Пвр.пф. - норма времени на проверку функционирования поставленных ПС ВТ на контрольных задачах пользователя. Пвр.пф. = 8 - 13 при изменении объема программы от 1 до 190 ТУМ.
Тпф = 10,4 чел.-дней.
Трудоемкость настройки поставленных ПС ВТ на параметры задач пользователя Тнп рассчитывается по формуле:
Тнп = Кхв Ксл Нвр.нп. (19)
где Нвр.нп. - норма времени на настройку поставленных ПС ВТ на параметры задач пользователя; Нвр.нп. = 25-40 в зависимости от изменения объема программы от 1 до 190 ТУМ.
Тнп = 1,3*1,28*25 = 41,6 чел.-дней.
Трудоемкость генерации конкретных вариантов ПС ВТ Тгв рассчитывается по формуле:
Тгв = Кхв Ксл Нвр.гв. (20)
где Нвр.гв. - норма времени на генерацию конкретных вариантов ПС ВТ; Нвр.гв. = 36,4-58,24 в зависимости от изменения объема программы от 1 до 190 ТУМ.
Тгв = 60,57 чел.-дней.
Нвр.пр = 0,16*Нвр.ос
Нвр.пр = 6,08
Определим трудоемкость проверки и оценки ОПС ВТ Тпр по формуле:
Тпр = Kсл Нвр.пр. (21)
Тпр = 7,78 чел.-дней.
Определим норму времени на анализ ОПС ВТ Нвр.ан. по формуле:
Нвр.ан. = 0,58 Нвр.ос. (22)
Нвр.пр. = 22,04
Определим трудоемкость анализа ОПС ВТ Тан по формуле:
Тан = Kсл Нвр.ан. (23)
Тан = 28,21 чел.-дней.
Определим норму времени на подготовку ПС ВТ Нвр.пс. к сопровождению по формуле:
Нвр.пс. = Kсл Kан Нвр.ос. (24)
Нвр.пс. = 1,28*1*38 = 48,64
Определим трудоемкость анализа ОПС ВТ Тос по формуле:
Тос = Нвр.ос. (25)
Трудоемкость разработки дополнительных модулей ПС ВТ рассчитывается по формуле:
Трд = Нвр.рд. (26)
где Нвр.рд. - норма времени на разработку дополнительных модулей; Нвр.рд. = 45.
Определяем коэффициент, учитывающий полноту тестирования Кте; он равен 1,0.
Определяем норму времени на разработку новых тестов для условий пользователя по формуле:
Нвр.тс.= Ксл Нвр.ан. (27)
Нвр.тс.= 1,28*22,04 = 28,21.
Рассчитаем трудоемкость разработки новых тестов для условий пользователя по формуле:
Ттс = Кхв Кте Нвр.тс. (28)
Ттс = 19,55 чел.-дней.
Трудоемкость сопровождения поставленных ПС ВТ в послегарантийный период Тпг рассчитывается по формуле:
Тпг = 0,2(Тан +Ткр)+ Тп +Тиэ (29)
Тпг = 22,137 чел.-дней.
Трудоемкость передачи ПС ВТ в аренду Тпа равняется Нвр.па. , которая рассчитывается по формуле:
Нвр.па. = 0,3 Кхв Нвр.пф. (30)
Нвр.па. = 3,12.
Трудоемкость выбора программных средств, позволяющих реализовать необходимые пользователю функции Тпв рассчитывается по формуле:
Твп = Кхв Нвр.вп. (31)
где Нвр.вп. - норма времени выбора программных средств, позволяющих реализовать необходимые пользователю функции; Нвр.вп. = 2 чел.-дня.
Твп = 2,6 чел.-дней.
Трудоемкость разработки рекомендаций по доработке ПС ВТ Трр равняется норме времени на разработку рекомендаций по доработке, которая рассчитывается по формуле:
Нвр.рр. = Ксл Нвр.ан. (32)
Нвр.рр. = 28,21.
Трудоемкость оргтехпроектирования технологических процессов (анализ характеристик и производственных условий разработки, изготовления и сопровождения ПС ВТ у пользователя; анализ уровня подготовки специалистов; оценка необходимости проведения обучения работе по утвержденной технологии) рассчитывают по формуле:
Тот = Кхт Нвр.от. (33)
где Кхт - коэффициент, учитывающий количество поставляемых техпроцессов; он равен 1.
Нвр.от. - норма времени на оргтехпроектирование технологических процессов; равна 60.
Тот = 60 чел.-дней.
Определение количества специалистов или сроков, необходимых для реализации стадий разработки ПС ВТ.
Исходя из трудоемкости стадий разработки ПС ВТ надо оценить количество специалистов или сроки, необходимые для реализации стадий разработки ПС ВТ. Данная оценка производиться в условиях одного из двух ограничений:
- задано (ограниченно) число разработчиков на каждой стадии ПС ВТ;
- заданы сроки реализации стадий разработки ПС ВТ.
(34)
где t - время, необходимое для реализации ПС ВТ, год;
Ni - количество разработчиков, принимающих участие в разработке ПС ВТ на i-ой стадии;
Ф - фонд времени одного разработчика в течении года, дней;
Ti - трудоемкость разработки i-ой стадии, чел.-дни.
суммарная трудоемкость составила 614,44 чел.-дней. Значит, срок разработки составляет 2,4 года, если фонд времени одного разработчика в течении года составит 255 дней.
Определение затрат на разработку ПС ВТ.
Затраты (в руб.) на непосредственную разработку ПС можно определить по формуле:
(35)
где З - среднедневная заработная плата, руб;
W - количество разработчиков, чел;
t - время, необходимое для разработки, дней.
Так как стипендия у студентов на сегодняшний день составляет примерно 140 руб. в месяц, то в день студент получает в среднем 6,3 руб. Тогда
С = 6,3 * 1* 2,4*255 = 3855,6 руб.
План-график
Рис. 1.
51. ПОДПРОГРАММА РАСЧЕТА ВОЗМУЩАЮЩИХ УСКОРЕНИЙ, ПАРАМЕТРОВ ОРБИТЫ И КОРРЕКЦИИ SFUN.CPP
#include "sfun.h"
const real p = 4.64e-6;
const real sm_s = 8.;
const real A = 1.496e11;
const real Cx = 2.;
const real sm_a = 2.5;
const real ro = 5.098e-13;
void korr (real& t, real *f, real *dery);
void fct(real& t, real *f, real *dery)
{
real x = f[0];
real y = f[1];
real z = f[2];
real Vx = f[3];
real Vy = f[4];
real Vz = f[5];
real Tet_s = (28.1+60*g_r)+w_s*t;
real e_0 = 23.45*g_r;
xs = A*cos(Tet_s);
ys = A*sin(Tet_s)*cos(e_0);
zs = A*sin(Tet_s)*sin(e_0);
real Tet_l = 0+w_l*t;
real Om_l = 0-ww_l*t;
real i_l = acos(cos(e_0)*cos(5.15*g_r)-sin(e_0)*sin(5.15*g_r)*cos(Om_l));
real rsr_l = 3.8448e8;
xl = rsr_l*(cos(Tet_l)*cos(Om_l)-cos(i_l)*sin(Tet_l)*sin(Om_l));
yl = rsr_l*(cos(Tet_l)*sin(Om_l)+cos(i_l)*sin(Tet_l)*cos(Om_l));
zl = rsr_l*sin(i_l)*sin(Tet_l);
real R_ka = sqrt(x*x+y*y+z*z);
real Fz_x = -mu_z*x/pow(R_ka,3.);
real Fz_y = -mu_z*y/pow(R_ka,3.);
real Fz_z = -mu_z*z/pow(R_ka,3.);
real mu_sd = p*sm_s*A*A/m;
real R_s = sqrt((x-xs)*(x-xs)+(y-ys)*(y-ys)+(z-zs)*(z-zs));
real Fs_x = -(mu_s-mu_sd)*x/pow(R_s,3.);
real Fs_y = -(mu_s-mu_sd)*y/pow(R_s,3.);
real Fs_z = -(mu_s-mu_sd)*z/pow(R_s,3.);
real R_l = sqrt((x-xl)*(x-xl)+(y-yl)*(y-yl)+(z-zl)*(z-zl));
real Fl_x = -mu_l*x/pow(R_l,3.);
real Fl_y = -mu_l*y/pow(R_l,3.);
real Fl_z = -mu_l*z/pow(R_l,3.);
real V_ka = sqrt(Vx*Vx+Vy*Vy+Vz*Vz);
real Fa_x = (-Cx*sm_a/(2*m))*ro*V_ka*Vx;
real Fa_y = (-Cx*sm_a/(2*m))*ro*V_ka*Vy;
real Fa_z = (-Cx*sm_a/(2*m))*ro*V_ka*Vz;
const real c20 = -1.09808e-3;
const real c22 = 5.74e-6;
const real d22 = -1.58e-6;
const real r_e = 6378137.;
real cr = mu_z*r_e*r_e/pow(R_ka,5);
real lr = 2*atan(y/x);
real mr = 3*(c22*cos(lr)+d22*sin(lr));
real U20_x = cr*x*(c20*(1.5-7.5*z*z/pow(R_ka,2))+mr*(5*z*z/pow(R_ka,2)-3));
real U20_y = cr*y*(c20*(1.5-7.5*z*z/pow(R_ka,2))+mr*(5*z*z/pow(R_ka,2)-3));
real U20_z = cr*z*(c20*(4.5-7.5*z*z/pow(R_ka,2))+5*mr*(z*z/pow(R_ka,2)-1));
dery[0] = Vx;
dery[1] = Vy;
dery[2] = Vz;
dery[3] = (Fz_x+U20_x+Fs_x+Fl_x+Fa_x+akor[0]);
dery[4] = (Fz_y+U20_y+Fs_y+Fl_y+Fa_y+akor[1]);
dery[5] = (Fz_z+U20_z+Fs_z+Fl_z+Fa_z+akor[2]);
Fz = sqrt(Fz_x*Fz_x+Fz_y*Fz_y+Fz_z*Fz_z);
Fs = sqrt(Fs_x*Fs_x+Fs_y*Fs_y+Fs_z*Fs_z);
Fl = sqrt(Fl_x*Fl_x+Fl_y*Fl_y+Fl_z*Fl_z);
Fa = sqrt(Fa_x*Fa_x+Fa_y*Fa_y+Fa_z*Fa_z);
U20 = sqrt(U20_x*U20_x+U20_y*U20_y+U20_z*U20_z);
parn[3] = parn[3]+w_s*t;
par_or(f,par);
korr(t,f,dery);
if ((u_last-par[7]) > 300*g_r)
Fl_u = 1;
u_last = par[7];
}
void korr(real& t, real *f, real *)
{
if (t > (Tkor+172800.))
{
if ((fabs(dl) > 0.1*g_r) && (!Fl_ka) && (!Fl_kp) && (!Fl_ki))
{
Fl_kp = 1;
Fl_ka = 0;
Fl_ki = 0;
cout << "Результат измерений накоплен" << 'n';
cout << "Необходима коррекция периода. dl=" << dl*r_g << "град." << 'n';
cout << "Период ном.=" << parn [6] << "Период тек.=" << par[6] << 'n';
cout << "Параметры орбиты" << 'n';
cout << " Rp = " << par[2]*(1-par[1]) << 'n';
cout << " Ra = " << par[2]*(1+par[1]) << 'n';
cout << " p = " << par[0] << 'n';
cout << " a = " << par[2] << " e = " << par[1] << "n T = "
<< par[6] << " w = " << par[5]*r_g << " u = " << par[7]*r_g
<< 'n';
clrscr();
}
}
Fl_a = 0;
Fl_p = 0;
Fl_lu = 0;
real da;
if (par[5] > par[7])
da = fabs(par[5]-par[7]-M_PI);
else
da = fabs(par[5]-par[7]+M_PI);
if (da < .1*g_r)
{
Fl_a = 1;
}
if (fabs(par[5] - par[7]) < .1*g_r)
{
Fl_p = 1;
}
if (par[7] < .1*g_r )
{
Fl_lu = 1;
}
real Vk;
if (T_vd)
if (t >= (T_vd +20))
{
T_vd = 0;
akor[0] = 0;
akor[1] = 0;
akor[2] = 0;
cout << "Выкл.дв. n t = " << t;
}
if (((Fl_kp && Fl_a) || (Fl_ka && Fl_p) || (Fl_ki && Fl_lu)) && (!T_vd))
{
cout << " n Коррекция n";
cout << "n Начало t=" << t << "сек n";
int sim;
if ((t-Tkor) < 2500)
{
cout << "Не корректировать!";
return;
}
Tkor = t;
real R_t = sqrt(f[0]*f[0]+f[1]*f[1]+f[2]*f[2]);
real V_t = sqrt(f[3]*f[3]+f[4]*f[4]+f[5]*f[5]);
real R_n = parn[0];
if (Fl_a)
{
dRa = R_t-R_n;
dRp = par[2]*(1-par[1])-R_n;
cout << "Апоцентр dRp:" << dRp << "м n";
cout << "dRa:" << dRa << "м n";
cout << "w=" << par[5]*r_g << "u=" << par[7]*r_g << 'n';
real l,ln;
l = -(w_z-w_s)*par[6];
ln = -(w_z-w_s)*parn[6];
dl = -(w_z-w_s)*(par[6]-parn[6]);
cout << "T=" << par[6] << "Тном=" << parn[6] << " T-Tном="
<< par[6]-parn[6] << 'n' << "l=" << l*r_g << "lном="
<< ln*r_g << "l-lном=" << (l-ln)*r_g << "dl=" << dl
<< 'n';
if (dRp > 0)
Sig_a = -1;
else
Sig_a = 1;
cout << "Знак ускорения:" << Sig_a << 'n';
clrscr();
real Rp = par[2]*(1-par[1]);
real Ra_p = par[2]*(1+par[1]);
real Rp_p2 = Rp;
real Ra_p2 = R_t;
cout << "Rp=" << Rp_p2 << "Ra=" << Ra_p2 << 'n';
cout << "Ra_p=" << Ra_p << "n Rt=" << R_t << 'n';
if (fabs(Rp - R_n) < 500)
{
Fl_kp = 0;
Fl_ka = 1;
cout << "Закончить коррекцию в апоцентре n" << "dRp=" << Rp-R_n
<< "dRa=" << dRa << "t=" << t << 'n';
cout << "Параметры орбиты: n" << "Rp=" << par[2]*(1-par[1])
<< "Ra=" << par[2]*(1+par[1]) << "n p=" << par[0]
<< "a=" << par[2] << "e=" << par[1] << "n T="
<< par[6] << "w=" << par[5]*r_g << "u=" << par[7]*r_g
<< 'n';
cout << "Суммарный импульс для коррекции перицентра=" << dV_ps << 'n';
clrscr();
}
else
{
if (R_t > R_n)
{
Rp_p = R_n;
Ra_p = R_t;
a_p = (Ra_p+Rp_p)/2.;
e_p = 1-Rp_p/a_p;
p_p = a_p*(1-e_p*e_p);
Vk = sqrt(mu_z/p_p)*(1-e_p);
}
else
{
Rp_p = R_t;
Ra_p = R_n;
a_p = (Ra_p+Rp_p)/2.;
e_p = 1-Rp_p/a_p;
p_p = a_p*(1-e_p*e_p);
Vk = sqrt(mu_z/p_p)*(1+e_p);
}
real dV = Vk-V_t;
real dVmax = 20*25./m;
cout << "n dVтреб=" << dV << "dVmax за 20 сек=" << dVmax;
if (fabs(dV) > dVmax)
{
akor[0] = Sig_a*(25./m)*f[3]/V_t;
akor[1] = Sig_a*(25./m)*f[4]/V_t;
akor[2] = Sig_a*(25./m)*f[5]/V_t;
cout << "n dV=" << dV << "dVmax=" << dVmax;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1]
<< 't' << akor[2] << 't' <<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_ps = dV_ps+dVmax;
cout << "Суммарный импульс=" << dV_ps << 'n';
}
else
{
akor[0] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[3]/V_t;
akor[1] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[4]/V_t;
akor[2] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[5]/V_t;
cout << "n dV=" << dV << "dVmax=" << dVmax;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1]
<< 't' << akor[2] << 't' <<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_ps = dV_ps+fabs(dV);
cout << "Суммарный импульс=" << dV_ps << 'n';
}
if (dVmax > fabs(dV))
{
dVmax = fabs(dV);
real Vk_r = Sig_a*dVmax+V_t;
real Ra_r = R_t;
real e_r = -(Vk_r*Vk_r*Ra_r/mu_z)+1;
real a_r = Ra_r/(1+e_r);
real p_r = a_r*(1-e_r*e_r);
real Rp_r = a_r*(1-e_r);
cout << "Параметры орбиты: n" << " Rp_r = " << Rp_r
<< " Ra_r = " << Ra_r << "n p_r = " << p_r << " a_r = "
<< a_r << " e_r = " << e_r << 'n';
}
else
{
real Vk_r = Sig_a*dVmax+V_t;
real Ra_r = R_t;
real e_r = -(Vk_r*Vk_r*Ra_r/mu_z)+1;
real a_r = Ra_r/(1+e_r);
real p_r = a_r*(1-e_r*e_r);
real Rp_r = a_r*(1-e_r);
cout << "Параметры орбиты: n" << " Rp_r = " << Rp_r
<< " Ra_r = " << Ra_r << "n p_r = " << p_r << " a_r = "
<< a_r << " e_r = " << e_r << 'n';
}
T_vd = t;
cout << "Вкл.дв. t=" << T_vd << 'n';
}
}
if (Fl_p)
{
dRp = R_t-R_n;
dRa = par[2]*(1+par[1])-R_n;
cout << " Перицентра - dRp:" << dRp << "м n";
cout << "dRa:" << dRa << "м. n";
cout << "w=" << par[5]*r_g << "u=" << par[7]*r_g << 'n';
real l,ln;
l = -(w_z-w_s)*par[6];
ln = -(w_z-w_s)*parn[6];
dl = -(w_z-w_s)*(par[6]-parn[6]);
cout << "T=" << par[6] << "Tном=" << parn[6] << "T-Tном="
<< par[6]-parn[6] << 'n' << "l=" << l*r_g << "lном="
<< ln*r_g << "l-lном=" << (l-ln)*r_g << "dl=" << dl << 'n';
if (dRa > 0)
Sig_a = -1;
else
Sig_a = 1;
cout << "Знак ускорения:" << Sig_a << 'n';
clrscr();
real Ra = par[2]*(1+par[1]);
real Rp_p1 = R_t;
real Ra_p1 = Ra;
cout << "Rp=" << Rp_p1 << "Ra=" << Ra_p1 << 'n';
if ((fabs(Ra-R_n) < 500) || (fabs(dl*r_g) < .0001))
{
cout << "Закончить коррекцию в перицентре n" << "dRa="
<< Ra-R_n << "dRp=" << dRp << "t=" << t << 'n';
cout << "Параметры орбиты: n " << "Rp="
<< par[2]*(1-par[1]) << "Ra=" << par[2]*(1+par[1])
<< " n p=" << par[0] << "a=" << par[2] << "e="
<< par[1] << " n T=" << par[6] << "w=" << par[5]*r_g
<< "u=" << par[7]*r_g << 'n';
cout << "Суммарный импульс для коррекции перицентра=" << dV_as << 'n';
clrscr();
Fl_ka = 0;
Fl_ki = 1;
}
else
{
if (R_t > R_n)
{
Rp_p = R_n;
Ra_p = R_t;
a_p = (Ra_p+Rp_p)/2.;
e_p = 1-Rp_p/a_p;
p_p = a_p*(1-e_p*e_p);
Vk = sqrt(mu_z/p_p)*(1-e_p);
}
else
{
Rp_p = R_t;
Ra_p = R_n;
a_p = (Ra_p+Rp_p)/2.;
e_p = 1-Rp_p/a_p;
p_p = a_p*(1-e_p*e_p);
Vk = sqrt(mu_z/p_p)*(1+e_p);
}
real dV = Vk-V_t;
real dVmax = 20*25./m;
cout << "n dVнадо=" << dV << " dVmax за 20 сек=" << dVmax;
if (fabs(dV) > dVmax)
{
akor[0] = Sig_a*(25./m)*f[3]/V_t;
akor[1] = Sig_a*(25./m)*f[4]/V_t;
akor[2] = Sig_a*(25./m)*f[5]/V_t;
cout << "n dV=" << dV << "dVmax=" << dVmax;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1]
<< 't' << akor[2] << 't' <<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_as = dV_as+dVmax;
cout << "Суммарный импульс=" << dV_as << 'n';
}
else
{
akor[0] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[3]/V_t;
akor[1] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[4]/V_t;
akor[2] = Sig_a*(fabs(dV)/dVmax)*(25./m)*f[5]/V_t;
cout << "n dV=" << dV << " dVmax=" << dVmax;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1]
<< 't' << akor[2] << 't' <<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_as = dV_as+fabs(dV);
cout << "Суммарный импульс=" << dV_as << 'n';
}
if (dVmax > fabs(dV))
{
dVmax = fabs(dV);
real Vk_r = Sig_a*dVmax+V_t;
real Ra_r = R_t;
real e_r = -(Vk_r*Vk_r*Ra_r/mu_z)+1;
real a_r = Ra_r/(1+e_r);
real p_r = a_r*(1-e_r*e_r);
real Rp_r = a_r*(1-e_r);
cout << "Параметры орбиты: n" << "Rp_r=" << Rp_r
<< "Ra_r=" << Ra_r << "n p_r=" << p_r << "a_r="
<< a_r << "e_r=" << e_r << 'n';
}
else
{
real Vk_r = Sig_a*dVmax+V_t;
real Ra_r = R_t;
real e_r = -(Vk_r*Vk_r*Ra_r/mu_z)+1;
real a_r = Ra_r/(1+e_r);
real p_r = a_r*(1-e_r*e_r);
real Rp_r = a_r*(1-e_r);
cout << "Параметры орбиты: n" << "Rp_r=" << Rp_r
<< "Ra_r=" << Ra_r << "n p_r=" << p_r << "a_r="
<< a_r << "e_r=" << e_r << 'n';
}
T_vd = t;
cout << "Вкл.дв. t=" << T_vd << 'n';
}
}
if (Fl_lu)
{
real di = par[4]-parn[4];
cout << "Линия узлов - di: " << di*r_g << "град n";
cout << "w=" << par[5]*r_g << "u=" << par[7]*r_g << 'n';
real l,ln;
l = -(w_z-w_s)*par[6];
ln = -(w_z-w_s)*parn[6];
dl = -(w_z-w_s)*(par[6]-parn[6]);
cout << "T=" << par[6] << "Tном=" << parn[6] << "T-Tном="
<< par[6]-parn[6] << 'n' << "l=" << l*r_g << "lном="
<< ln*r_g << "l-lном=" << (l-ln)*r_g << "dl=" << dl
<< "n i=" << par[4]*r_g << "iном=" << parn[4]*r_g << 'n';
cout << "Параметры орбиты: n " << "Rp="
<< par[2]*(1-par[1]) << "Ra=" << par[2]*(1+par[1])
<< " n p=" << par[0] << "a=" << par[2] << "e="
<< par[1] << " n T=" << par[6] << "w=" << par[5]*r_g
<< "u=" << par[7]*r_g << " n i=" << par[4]*r_g << 'n';
clrscr();
real Vk_x,Vk_y,Vk_z;
if (fabs(di) < .0001*g_r)
{
Fl_ki = 0;
cout << "Закончить коррекцию наклонения n "
<< "di=" << (par[4]-parn[4])*r_g << "t=" << t << 'n';
cout << "Параметры орбиты: n " << "Rp="
<< par[2]*(1-par[1]) << "Ra=" << par[2]*(1+par[1])
<< " n p=" << par[0] << "a=" << par[2] << "e="
<< par[1] << " n T=" << par[6] << "w=" << par[5]*r_g
<< "u=" << par[7]*r_g << " n i=" << par[4]*r_g << 'n';
cout << "Суммарный импульс=" << dV_is
<< 'n';
clrscr();
}
else
{
real teta;
if (par[7] > par[5])
teta = 2*M_PI+par[7]-par[5];
else
teta = par[7]-par[5];
real Vr_i = sqrt(mu_z/par[0])*par[1]*sin(teta);
real Vn_i = sqrt(mu_z/par[0])*(1+par[1]*cos(teta));
V_t = sqrt(f[3]*f[3]+f[4]*f[4]+f[5]*f[5]);
Vk_x = -Vn_i*cos(parn[4])*sin(par[3])+Vr_i*cos(par[3]);
Vk_y = Vn_i*cos(parn[4])*cos(par[3])+Vr_i*sin(par[3]);
Vk_z = Vn_i*sin(parn[4]);
Vk = sqrt(Vk_x*Vk_x+Vk_y*Vk_y+Vk_z*Vk_z);
real dV_x = Vk_x-f[3];
real dV_y = Vk_y-f[4];
real dV_z = Vk_z-f[5];
real dV = sqrt(dV_x*dV_x+dV_y*dV_y+dV_z*dV_z);
real dVmax = 20*25./m;
cout << "Vнач=" << V_t << "Vк=" << Vk << "teta=" << teta*r_g
<< 'n';
cout << "dV=" << dV << "dVmax за 20 сек=" << dVmax;
if (dV > dVmax)
{
akor[0] = (25./m)*dV_x/dV;
akor[1] = (25./m)*dV_y/dV;
akor[2] = (25./m)*dV_z/dV;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1] <<
't' << akor[2] << 't' <<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_is = dV_is+dVmax;
cout << "Суммарный импульс=" << dV_is << 'n';
}
else
{
akor[0] = (fabs(dV)/dVmax)*(25./m)*dV_x/dV;
akor[1] = (fabs(dV)/dVmax)*(25./m)*dV_y/dV;
akor[2] = (fabs(dV)/dVmax)*(25./m)*dV_z/dV;
cout << "n Корректирующее ускорение:" << akor[0] << 't' << akor[1]
<< 't' << akor[2] << 't'<<
sqrt(akor[0]*akor[0]+akor[1]*akor[1]+akor[2]*akor[2]) << 'n';
dV_is = dV_is+fabs(dV);
cout << "Суммарный импульс=" << dV_is << 'n';
}
T_vd = t;
cout << "Вкл.дв. t=" << T_vd << 'n';
}
}
if ((!Fl_ka) && (!Fl_kp) && (!Fl_ki))
{
cout << "Коррекция окончена!" << 'n';
real m_t;
dV_ss = dV_ps+dV_as+dV_is;
m_t = m*(1-exp(-dV_ss/W));
cout << "Потребный импульс: n - перицентра dV_ps="
<< dV_ps << "n апоцентра dV_as=" << dV_as
<< "n Суммарный импульс=" << dV_ss << "Масса топлива=" << m_t
<< 'n';
dV_ps = 0;
dV_as = 0;
dV_is = 0;
dV_ss = 0;
m_t = 0;
}
}
}
void par_or(real *f, real *par)
{
real x = f[0];
real y = f[1];
real z = f[2];
real Vx = f[3];
real Vy = f[4];
real Vz = f[5];
real c1 = (y*Vz-z*Vy);
real c2 = (z*Vx-x*Vz);
real c3 = (x*Vy-y*Vx);
real C = sqrt(c1*c1+c2*c2+c3*c3);
par[0] = (C/mu_z)*C;
real R_ka = sqrt(x*x+y*y+z*z);
real V_ka = sqrt(Vx*Vx+Vy*Vy+Vz*Vz);
real f1 = (Vy*c3-Vz*c2)-(mu_z*x/R_ka);
real f2 = (Vz*c1-Vx*c3)-(mu_z*y/R_ka);
real f3 = (Vx*c2-Vy*c1)-(mu_z*z/R_ka);
real F = sqrt(f1*f1+f2*f2+f3*f3);
real h = V_ka*V_ka-(2*mu_z/R_ka);
if ((1+h*C*C/(mu_z*mu_z)) < 0)
{
cout << " Ошибка! n";
getch();
}
par[1] = F/mu_z;
if ((1-par[1]*par[1]) < 0)
{
cout << " (1-e*e) < 0 Ошибка! n";
getch();
}
par[2] = par[0]/(1-par[1]*par[1]);
par[4] = acos(c3/C);
real s_Om = c1/(C*sin(par[4]));
real c_Om = -c2/(C*sin(par[4]));
if (s_Om >= 0)
par[3] = acos(c_Om);
else
par[3] = 2*M_PI-acos(c_Om);
real c_om = (f1*cos(par[3])+f2*sin(par[3]))/F;
real s_om = f3/(F*sin(par[4]));
if (s_om > 0)
par[5] = acos(c_om);
else
par[5] = 2*M_PI - acos(c_om);
if (par[2] < 0)
{
cout << " Ошибка! n";
getch();
}
par[6] = 2*M_PI*sqrt((par[2]/mu_z)*par[2]*par[2]);
real c_u = (x*cos(par[3])+y*sin(par[3]))/R_ka;
real s_u = z/(R_ka*sin(par[4]));
if (s_u > 0)
par[7] = acos(c_u);
else
par[7] = 2*M_PI - acos(c_u);
}
#include "rk5.h"
#include
void Drkgs(real *prmt,real *y,real *dery,int ndim,int& ihlf,
void (*fct)(real &,real*,real*),
void (*out_p)(real,real*,real*,int,int,real*))
{
static real a[] = { 0.5, 0.292893218811345248, 1.70710678118665475,
0.16666666666666667 };
static real b[] = { 2.0, 1.0, 1.0, 2.0 };
static real c[] = { 0.5, 0.292893218811345248, 1.70710678118665475, 0.5 };
real *aux[8];
int i,j,imod,itest,irec,istep,iend;
real delt,aj,bj,cj,r,r1,r2,x,xend,h;
for (i=0; i<8; i++) aux[i] = new real[ndim];
for (i=0; i x = prmt[0]; xend = prmt[1]; h = prmt[2]; prmt[4] = 0.0; fct(x,y,dery); r = h*(xend-x); if (r <= 0.0) { ihlf = 13; if (r == 0.0) ihlf = 12; goto l39; } for(i=0; i { aux[0][i] = y[i]; aux[1][i] = dery[i]; aux[2][i] = 0.0; aux[5][i] = 0.0; } irec = 0; h = h+h; ihlf = -1; istep = 0; iend = 0; l4: r = (x+h-xend)*h; if (r >= 0.0) { iend = 1; if (r > 0.0) h = xend-x; } out_p(x,y,dery,irec,ndim,prmt); if (prmt[4] != 0.0) goto l40; itest = 0; l9: istep++; j = 0; l10: aj = a[j]; bj =b[j]; cj = c[j]; for (i=0; i { r1 = h*dery[i]; r2 = aj*(r1-bj*aux[5][i]); y[i] = y[i]+r2; r2 = r2+r2+r2; aux[5][i] += r2-cj*r1; } if (j-3 < 0) { j++; if (j-2 != 0) x = x+0.5*h; fct(x,y,dery); goto l10; } if (itest <= 0) { for (i=0; i itest = 1; istep = istep+istep-2; l18: ihlf++; x = x-h; h = 0.5*h; for (i=0; i { y[i] = aux[0][i]; dery[i] = aux[1][i]; aux[5][i] = aux[2][i]; } goto l9; } imod = istep/2; if (istep-imod-imod != 0) { fct(x,y,dery); for (i=0; i { aux[4][i] = y[i]; aux[6][i] = dery[i]; } goto l9; } delt = 0.0; for (i=0; i delt += aux[7][i]*fabs(aux[3][i]-y[i]); if (delt-prmt[3] > 0.0) { if (ihlf-10 >= 0) { ihlf = 11; fct(x,y,dery); goto l39; } for (i=0; i istep = istep+istep-4; x = x-h; iend = 0; goto l18; } fct(x,y,dery); for (i=0; i { aux[0][i] = y[i]; aux[1][i] = dery[i]; aux[2][i] = aux[5][i]; y[i] = aux[4][i]; dery[i] = aux[6][i]; } out_p(x-h,y,dery,ihlf,ndim,prmt); if (prmt[4] != 0) goto l40; for (i=0; i { y[i] = aux[0][i]; dery[i] = aux[1][i]; } irec = ihlf; if (iend > 0) goto l39; ihlf-; istep = istep/2; h = h+h; if (ihlf < 0) goto l4; imod = istep/2; if ((istep-2*imod != 0) || (delt-0.02*prmt[3] > 0.0)) goto l4; ihlf-; istep = istep/2; h = h+h; goto l4; l39: out_p(x,y,dery,ihlf,ndim,prmt); l40: for (i=0; i return; } [/sms]