Главная страница
Навигация по странице:

  • Функция Gln_data_from_NA

  • Функция init_satpos_gln

  • Функция satpos_eci_in_metr

  • Спутниковые системы навигации. Учебное пособие. Учебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1


    Скачать 4.49 Mb.
    НазваниеУчебное пособие ( Лабораторный практикум на компьютере ) Київ 2008 1
    Дата12.04.2023
    Размер4.49 Mb.
    Формат файлаpdf
    Имя файлаСпутниковые системы навигации. Учебное пособие.pdf
    ТипУчебное пособие
    #1057965
    страница8 из 14
    1   ...   4   5   6   7   8   9   10   11   ...   14

    Функция Read_GL_Alm
    function [alm,max_kol] = Read_GL_Alm(Dat);
    %Имя функции: Read_GL_Alm
    %Функция читает данные альманаха спутников ГЛОНАСС.
    %Входные данные:
    %Dat - имя файла, содержащего альманах спутников ГЛОНАСС , например, Dat = 'GLN_all.alm';
    %Выходные данные:
    %alm - данные альманаха спутников ГЛОНАСС (структура) ,
    %max_kol- максимальное количество спутников в альманахе fid =fopen(Dat,'rt');%открытие файла max_kol = 0;
    %чтение данных из файла while not(feof(fid)) s1=fscanf(fid,'%s',6); if not(feof(fid)) lenstr = length(s1); max_kol = max_kol + 1;
    % while (fscanf(fid,'%s',1) == '-') end str1 = fscanf(fid,'%s',1);
    % lenstr = length(str1); str2 = fscanf(fid,'%s',1); lenstr = length(str2); n_sv = sscanf(str2,'%d'); strID = str2(1:lenstr);
    ID = sscanf(strID,'%d'); alm(ID).ID = ID; %номер спутника (1...24)
    %%%%%%%%%%% t_1=fscanf(fid,'%s',1); alm(ID).Hn=fscanf(fid,'%d'); % номер частоты спутника t_2=fscanf(fid,'%s',1); alm(ID).Health=fscanf(fid,'%d',1);%здоровье (0- спутник здоров) t_3=fscanf(fid,'%s',1); alm(ID).ecc = fscanf(fid,'%g',1);% эксцентриситет орбиты спутника t_4=fscanf(fid,'%s',1);
    108
    alm(ID).Na =fscanf(fid,'%g',1 );% номер суток к которым относятся данные альманаха, отсчиты- ваемых
    %от ближайшего високосного года t_5=fscanf(fid,'%s',3); alm(ID).deltai = fscanf(fid,'%g',1); % наклонение орбиты спутника (радианы) t_6=fscanf(fid,'%s',2); alm(ID).LambdaN = fscanf(fid,'%g',1); % долгота восходящего узла орбиты спутника (радианы) while not(fscanf(fid,'%c',1) == ':') end
    % t_7=fscanf(fid,'%s',1) alm(ID).TLambdaN = fscanf(fid,'%g',1) - 10800;% время прохождения восходящего узла орбиты спутника,
    %к которому относятся данные альманаха, приведенное к времени UTC (секунда) t_8=fscanf(fid,'%s',2); alm(ID).omegan = fscanf(fid,'%g',1); %аргумент перигея (радианы) t_11=fscanf(fid,'%s',1); alm(ID).Tdr=fscanf(fid,'%g',1); % драконический период (секунда/виток) t_12=fscanf(fid,'%s',1); alm(ID).dTdr=fscanf(fid,'%g',1); % скорость изменения драконического периода (секунда/виток в квадрате) t_13=fscanf(fid,'%s',2); alm(ID).tau_n=fscanf(fid,'%g',1) / 1000.0;%коэффициет коррекции шкалы времени (сдвиг времени спутника
    %относительно системного времени ГЛОНАСС в секундах) end; end fclose(fid);
    Функция Gln_data_from_NA
    function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap);
    %Имя функции:Gln_data_from_NA
    %Функция предназначена для преобразования номера дня NA (день привязки альманаха
    % от ближайшего високосного года) в текущую дату
    %function [time_UTC] = Gln_data_from_NA(leap_year, day_from_leap);
    %Входные данные:
    % leap_year - ближайший високосный год
    %day_from_leap (NA) - день привязки альманаха
    %Выходные данные:
    %структура timeUTC (год, месяц, день) - текущая дата
    DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; %количество дней в месяцах
    109
    n4 = mod(leap_year, 4); n100 = mod(leap_year, 100); n400 = mod(leap_year, 400); if (n4 == 0) n_leap = 1; else n_leap = 0; end if ((n100 == 0) & (n400 > 0)) n_leap = 0; end if (day_from_leap > (365 + n_leap)) day = day_from_leap - (365 + n_leap); k =fix (day / 365); day = mod(day, 365); else day = day_from_leap; k = -1; end; god = leap_year + k + 1; if (god > leap_year) n_leap = 0; end; mon = 1; mon_day = 31; while (day > mon_day) day = day - mon_day; mon = mon + 1; % LK mon_day = DnMon(mon);
    % mon = mon+1; if (mon == 2) mon_day = mon_day + n_leap; end end time_UTC.year = god; time_UTC.mon = mon; time_UTC.day = day;
    Функция JD_data
    function [JD, day_year] = JD_data(timeUTC)
    %Имя:JD_data
    % Функция JD_data(timeUTC) вычисляет :
    110

    %JD - номер юлианского дня, day_year - номер дня года.
    %Входные данные:
    %Структура timeUTC
    %timeUTC.year - год,
    % timeUTC.mon - месяц,
    % timeUTC.day - день.
    %Выходные данные:
    %JD - юлианский день;
    %day_year- день от начала года.
    %количество дней в месяцах
    DnMon = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    %Вычисление номера юлианского дня опорной эпохи jd0 = JD_epohi(timeUTC.year);
    %Учет високосного года nfebr = 0; if mod(timeUTC.year,4) == 0 nfebr = 1; end;
    %Расчетномера дня года k = 0; for i = 2 : timeUTC.mon k = k + DnMon(i - 1); if (i == 2) k = k + nfebr; end; end; day_year = k + timeUTC.day;
    %Расчет номера юлианского дня
    JD = jd0 + day_year;
    Функция LLH_to_ECEF
    function [XYZ] = LLH_to_ECEF( a, b, llh)
    %Имя функции:LLH_to_ECEF.m
    %Функция преобразования географических координат в прямоугольную геоцентрическую систему координат (ECEF)
    %Входные данные:
    %Структура llh
    %llh.lon-долгота (радиан),
    %llh.lat-широта (радиан),
    %llh.h-высота (метр);
    %a, b-большая и малая полуоси земного эллипсоида в WGS-84 (метр);
    %Выходные данные:
    111

    %Структура XYZ
    %XYZ.x - координата x в ECEF;
    %XYZ.y - координата y в ECEF;
    %XYZ.z - координата z в ECEF; a2=a * a; b2=b * b; r = a2 / sqrt(a2 * cos(llh.lat) * cos(llh.lat) + b2 * sin(llh.lat) * sin(llh.lat));
    XYZ.x = (r + llh.h) * cos(llh.lat) * cos(llh.lon);
    XYZ.y = (r + llh.h) * cos(llh.lat) * sin(llh.lon);
    XYZ.z = (b2 / a2 * r + llh.h) * sin(llh.lat);
    Функция WGS84_to_PZ90
    function [pos_pz90] = WGS84_to_PZ90( pos_wgs84)
    %Имя функции: WGS84_to_PZ90.m
    %Функция преобразует координаты из системы WGS 84 в систему ПЗ 90 p = (1.0 - 0.12e-6); x = pos_wgs84.x; y = pos_wgs84.y; z = pos_wgs84.z; pos_pz90.x = (p * x + p * 0.82e-6 * y + 1.4 ); pos_pz90.y = (-p * 0.82e-6 * x + p * y + 1.4); pos_pz90.z = (p * z + 0.9);
    Функция ECEF_to_LLH
    function [llh] = ECEF_to_LLH(a, b, XYZ)
    %Имя функции:ECEF_to_LLH
    %Функция преобразует координаты из системы ECEF в географическую систему
    %Входные данные:
    %a, b-большая и малая полуоси земного эллипсоида (метр); ( a=6378137.0; %b=6356752.314; метры)
    %Структура XYZ
    %XYZ.x - координата x в ECEF;
    %XYZ.y - координата y в ECEF;
    %XYZ.z- координата z в ECEF;
    %Выходные данные:
    %Структура llh
    %llh.lon - долгота (радиан);
    %llh.lat - широта (радиан);
    %llh.h-высота (метр); a2 = a * a; b2 = b * b; xy = sqrt(XYZ.x * XYZ.x + XYZ.y * XYZ.y); thet = atan2(XYZ.z * a , (xy * b));
    112

    %thet = atan(XYZ.z * a / (xy * b)); esq = 1.0 - b2 / a2; epsq = a2 / b2 - 1.0; llh.lat = atan((XYZ.z + epsq * b * (sin(thet) ^3)) / (xy - esq * a * (cos(thet) ^3))); llh.lon = atan2(XYZ.y, XYZ.x);%! while (llh.lon < 0) llh.lon = 2*pi + llh.lon; end;
    %if llh.lon < 0
    % llh.lon = 2*pi + llh.lon;
    %end ; r = a2 / sqrt(a2 * cos(llh.lat) * cos(llh.lat) + b2 * sin(llh.lat) * sin(llh.lat)); llh.h = xy / cos(llh.lat) - r; end
    Функция GLN_satfind
    function [kol_gln_a, satvis_gln, satpos_gln_ns, satpos_gln_ecef] = GLN_satfind(a, b, timeUTC, cur- rent_loc_pz90, alm_gln);
    %Имя функции:GLN_satfind
    %Функция вычисляет координаты спутников ГЛОНАСС, углы видимости и количество видимых спутников
    %Входные данные:
    %a, b- большая и малая полуоси земного эллипсоида;
    %timeUTC- параметры времени;
    %current_loc_pz90- широта, долгота и высота точки, из которой наблюдаются спутники (структура);
    % alm_gln-альманах спутников ГЛОНАСС (структура)
    %Выходные данные:
    %kol_gln_a- количество видимых спутников ГЛОНАСС,
    %satvis_gln- углы видимости спутников (структура),
    %satpos_gln_ns-координаты спутников (структура) в абсолютной системе координат (ECI)
    %satpos_gln_ecef- координаты спутников (структура) в подвижной системе координат (ECEF)
    RAD_TO_DEG = 180.00 / pi ;
    KOL_GLN = 24; nom_ns = 1;
    Min_Elev = 0; % минимальный угол видимости kol_gln_a = 0;
    [nom_sat_gln_a, trac_sat_gln_a, sat_pos, satvis_gln] = init_data(KOL_GLN);
    % число дней от фундаментальной эпохи 2000г от 12h, 0, January:
    % jd_up_epoh = JD_from_epohi( 2000, timeUTC) - 0.5; % from 12h UTC 2000 nut = 0;
    113

    S0 = s0_Nut( timeUTC, nut); time_s0 = S0.s0_m_mod ; %time_s0 - истинное звездное время в день обсервации, 0h UTC year = timeUTC.year; leap_year = fix( year / 4) * 4; % ближайший к текущему (предыдущий) високосный год ti = timeUTC.ti; % текущее время обсервации от начала дня n00 = fix(ti / 86400);
    % n0 - номер текущих суток внутри 4-х летнего периода (от ближайшего високосного года) n0 = JD_from_epohi(leap_year, timeUTC) + n00 + 1;
    [eci_current_loc, eci_rec_pos_xyz] = llh_to_eci(a, b, ti, time_s0, current_loc_pz90); satpos_eci = init_satpos_gln(); for ( i = 1 : KOL_GLN) prn = alm_gln (i).ID; health = alm_gln (i).Health; if ( (prn > 0) & (health == 0)) satpos_eci = gln_a_1(i, n0, ti, time_s0, alm_gln);
    [satpos_eci, satpos_gln_a] = satpos_eci_in_metr(satpos_eci); %Transformation coordinates from
    "Km" in "m" satpos_gln_ns(prn) = satpos_gln_a;
    %-----
    [satpos_ecef] =eci_to_ecef(time_s0, ti, satpos_eci); satpos_gln_ecef(prn) = satpos_ecef;
    % calculates angles of visibility by almanac:
    [top] = top_coord(prn, eci_current_loc, eci_rec_pos_xyz,satpos_gln_a); satvis_gln(prn) = top; if (satvis_gln(prn).r > 0.0) el = RAD_TO_DEG * satvis_gln(prn).el; if ( el >= Min_Elev)
    % fprintf('prn=%2i el=%f az=%f \n ', prn, el, RAD_TO_DEG * satvis_gln(prn).az); satpos_gln( prn) = satpos_eci;
    [satpos_ecef] =eci_to_ecef(time_s0, ti, satpos_eci);
    [trac_sat_gln_a] = rewrite_satpos(nom_ns, satpos_ecef); trac_sat_gln_a( nom_ns).r = satvis_gln( prn).r; trac_sat_gln_a (nom_ns).prn = prn; nom_sat_gln_a(nom_ns) = prn; nom_ns = nom_ns + 1; % number of visible satellites end; % if ( el >= Min_Elev) end; % if ( satvis_gln[prn-1].r > 0.0)
    114
    end; % f ( (prn > 0) & (health == 1)) end; % for ( i = 1 : KOL_GLN) kol_gln_a = nom_ns - 1;
    Функция ris_vis_sat
    function ris_vis_sat(max_n, nj, ti_start, step_t, ris_vid)
    %Имя функции:ris_vis_sat
    %Функция строит графики спутников, видимых из точки наблюдения mm = step_t/3600.0; j_color = 0; color7(1:7) = ['b' 'g' 'r' 'c' 'm' 'y' 'k']; for i = 1 : max_n str1 = ris_vid(i, 1: nj ); k = find(str1); if k > 0 len = length(k); if len == 1 hPlot = plot(k(1):k(1),ris_vid(i,k(1):k(1)), s); set(hPlot, 'LineWidth', 3); hold on; else n0 = k(1); j_color = j_color + 1; if (j_color > 7 ) j_color = 1; end s = color7(j_color); for j = 2 : len if (k(j) > (k(j-1) + 1)) | (j == len) k0 = k(j - 1); hPlot = plot(n0*mm : mm : k0*mm,ris_vid(i,n0:k0), s); set(hPlot, 'LineWidth', 3); hold on; n0 = k(j); end; % if end; % for j = 2 : len end; % else end; % if k > 0 end; % for i = 1 : max_n
    115
    grid on hAxes=gca;
    My = [0:2:25]; kol_x = ti_start + nj * step_t;
    Mx = [0 : 2 : (kol_x - ti_start) / 3600]; set(hAxes, 'ytick', My,'xtick',Mx) ; hText = gca; set(hText,'FontSize',12,'FontName','TimesNewRoman') xlabel('Время наблюдения спутников ГЛОНАСС, час') ylabel('Номер навигационного спутника')
    Функция JD_epohi
    function jden = JD_epohi(epoha)
    %Имя: JD_epohi
    %Фукция JD_epohi(epoha) рассчитывает номер юлианского дня
    %до начала года (epoha) на 12h, 0 день, январь.
    %Входные данные: epoha, размерность-год
    %Выходные данные:
    % jden- номер юлианского дня на 12h, 0 день, январь ( размерность -дни) rk = mod(epoha,4); if ( rk == 0 ) rk = 1.0; else rk = 2.0 - rk * 0.25; end; n100 = floor(epoha / 100); n400 = floor(epoha / 400); jden = (4712 + epoha) * 365.25 + n400 - n100 + rk;
    % fprintf('epoha=%d rk=%f jden=%6.2f \n', epoha, rk, jden);
    Функция init_data
    function[nom_sat_gln_a, trac_sat, sat_pos, satvis_gln] = init_data(kol)
    %Имя функции: init_data
    %Функция предназначена для инициализации массивов sat_pos.prn = 0; sat_pos.x = -1.0; sat_pos.y = -1.0; sat_pos.z = -1.0; sat_pos.vx = -1.0; sat_pos.vy = -1.0; sat_pos.vz = -1.0;
    116
    sat_pos.dvx = -1.0; sat_pos.dvy = -1.0; sat_pos.dvz = -1.0; sat_pos.range_m = -1.0; for( i = 1 : kol) nom_sat_gln_a(i) = 0; satvis_gln(i).el = -1; satvis_gln(i).az = -1; satvis_gln(i).r = 0; trac_sat(i).prn = 0; trac_sat(i).x = -1.0; trac_sat(i).y = -1.0; trac_sat(i).z = -1.0; trac_sat(i).vx = -1.0; trac_sat(i).vy = -1.0; trac_sat(i).vz = -1.0; trac_sat(i).range_m = -1.0; end;
    Функция JD_from_epohi
    function [jd] =JD_from_epohi( epoha, timeUTC);
    %Имя функции:JD_from_epohi.m
    %Функция вычисляет jd - количество дней от указанного года (epoha)
    % до текущей даты, указанной в структуре timeUTC, представленной в виде
    % (timeUTC.year, timeUTC.mon, timeUTC.day) jd0 = JD_epohi(epoha) + 1; % 12h, 1 den January
    [day, day_year] = JD_data(timeUTC); jd = day - jd0;
    Функция s0_Nut
    function [S0] = s0_Nut( timeUTC, nut)
    %Имя функции: s0_Nut
    %Функция рассчитывает истинное или среднее звездное время на 0ч UTC
    %Входные данные:
    %timeUTC - дата, на которую требуется рассчитать истинное или среднее звездное время
    %nut- признак (если nut= 0, то вычисляется среднее звездное время без учета нутации, иначе вычис- ляется
    %истинное звездное время)
    %Выходные данные:
    %S0 - истинное или среднее звездное время на 0ч UTC jd2000 = 2451545; % 12h UTC 1 января
    % Применить функцию JD_data
    [jd, day_year] = JD_data( timeUTC); if (jd == NaN)
    117
    s0_mod = NaN; h = NaN; min = NaN; sec = NaN; fprintf('function s0_m - end0 \n'); return; end; jd = jd - 0.5; d = jd - jd2000; t = d / 36525.0; % 36525 - юлианский период 100 лет t2 = t * t; h1 = 24110.54841;
    %h1=6.0*3600.0+41.0*60.0+50.54841;
    % h2 = 236.555367908 * d; h2 = 8640184.812866 * t ; h3 = 0.093104 * t2; h4 = t2 * t * 6.2E-6; if ( nut == 0) na = 0; else na = utc_nut(t); end; s0_m = h1 + h2 + h3 - h4;
    S0.s0_nut = s0_m + na;
    S0.s0_m_mod = mod(s0_m, 86400); s0_day = floor(s0_m / 86400);
    S0.s0_m_hour = S0.s0_m_mod / 3600.0;
    S0.s0_m_hour = floor(S0.s0_m_mod / 3600); sec_min = S0.s0_m_mod - S0.s0_m_hour * 3600;
    S0.s0_m_min = floor(sec_min / 60);
    S0.s0_m_sec = sec_min - S0.s0_m_min * 60;
    S0.s0_nut_mod = mod(S0.s0_nut, 86400); s0_day = floor(S0.s0_nut / 86400);
    S0.s0_nut_hour = S0.s0_nut_mod / 3600.0;
    S0.s0_nut_hour = floor(S0.s0_nut_mod / 3600); sec_min = S0.s0_nut_mod - S0.s0_nut_hour * 3600;
    S0.s0_nut_min = floor(sec_min / 60);
    S0.s0_nut_sec = sec_min - S0.s0_nut_min * 60;
    Функция llh_to_eci
    function [eci_llh, eci_xyz] = llh_to_eci(a, b, ti, time_s0, llh_loc) ;
    %Имя функции:llh_to_eci
    %Функция вычисляет позицию приемника в абсолютной геоцентрической системе координат (ECI)
    %Входные данные:
    %a, b-большая и малая полуоси земного эллипсоида (метр);
    118

    %ti- текущее время (секунды) ,
    %time_s0- истиное звездное время,
    %Структура llh_loc - координаты приемника; {
    %llh_loc.lon-долгота (радиан);
    %llh_loc.lat-широта (радиан);
    %llh_loc.h-высота (метр);
    %Выходные данные:
    %Структура eci_llh - географические координаты приемника в абсолютной геоцентрической системе координат (ECI)
    %eci_llh.lon - долгота (радиан);
    %eci_llh.lat - широта (радиан);
    %eci_llh.h - высота (метр);
    %Структура eci_xyz- координаты приемника в абсолютной прямоугольной геоцентрической системе координат (ECI)
    % eci_xyz.x - координата x;
    % eci_xyz.y - координата y;
    % eci_xyz.z - координата z;
    OMEGA_Z = 0.7292115e-4; % угловая скорость вращения Земли, (рад/cek)
    SEC_IN_RAD = 7.2722052166430e-005; % (PI / 43200.0 ) // Number radian eci_llh.lon = llh_loc.lon + ti * OMEGA_Z + SEC_IN_RAD * time_s0; eci_llh.lat = llh_loc.lat; eci_llh.h = llh_loc.h; eci_xyz = llh_to_ecef( a, b, eci_llh);
    Функция init_satpos_gln
    function [sat_pos] = init_satpos_gln() ;
    %Имя функции:init_satpos_gln
    %Функция предназначена для инициализации структуры sat_pos sat_pos.prn = 0; sat_pos.x = -1.0; sat_pos.y = -1.0; sat_pos.z = -1.0; sat_pos.vx = -1.0; sat_pos.vy = -1.0; sat_pos.vz = -1.0; sat_pos.dvx = -1.0; sat_pos.dvy = -1.0; sat_pos.dvz = -1.0; sat_pos.range_m = -1.0;
    Функция gln_a_1
    function [satpos_xyz_gln] = gln_a_1(ns, n0, ti_current, time_s0, alm_gln);
    119

    %Имя функции:gln_a_1
    %Функция рассчитывает координаты и скорости спутников ГЛОНАСС в соответствии с интерфейс- ным
    %контрольным документом ГЛОНАСС
    %Входные данные:
    %ns- номер спутника ,
    %n0 - номер текущих суток внутри 4-х летнего периода (от ближайшего високосного года),
    %ti_current - текущее время обсервации от начала дня,
    %time_s0 - истинное звездное время в текущий момент обсервации,
    %alm_gln - альманах спутников ГЛОНАСС
    %Выходные данные:
    %Структура satpos_xyz_gln
    %satpos_xyz_gln.x - координата по оси x;
    %satpos_xyz_gln.y- координата по оси y;
    %satpos_xyz_gln.z- координата по оси z;
    %satpos_xyz_gln.vx- скорость по оси x;
    %satpos_xyz_gln.vy - скорость по оси y;
    %satpos_xyz_gln.vz- скорость по оси z ;
    % I_MID - Mean value of an inclination of a plane of orbit of a satellite
    I_MID = 1.0995574287564; %(double)(PI * 63.0 / 180.0)
    T_DR_MID = 43200.0; %Mean value a dragon of cycle time of a satellite
    A_PZ90_KM = 6378.136; %(Km) Equatorial radius of the Earth
    MU = 398600.44; % (Km^3/cek^2) constant of a gravitational
    OMEGA_Z = 0.7292115e-4; %скорость вращения Земли (Angular speed of rotation of the Earth, рад/cek)
    SEC_IN_RAD = 7.2722052166430e-005; %(PI / 43200.0 ) Number radian in second of time
    2*PI/(24*3600)=PI/43200
    HALF_PI = pi / 2;
    D7_3 = 7.0 / 3.0;
    D7_4 = 7.0 / 4.0;
    D7_6 = 7.0 / 6.0;
    D7_24 = 7.0 / 24.0;
    D49_72 = 49.0 / 72.0; nn = fix(ti_current / 86400); ti = ti_current - nn * 86400;
    % i_incl = I_MID + alm_gln(ns).deltai; i_incl = alm_gln(ns).deltai; ecc2_1 = 1.0 - alm_gln(ns).ecc * alm_gln(ns).ecc;
    % t_dr = T_DR_MID + alm_gln(ns).Tdr; t_dr = alm_gln(ns).Tdr;
    120
    n_dr = pi * 2 / t_dr;
    %1. Вычисление полуоси a_n: a_n = semi_axis_1( t_dr, i_incl, alm_gln(ns).ecc, alm_gln(ns).omegan); alm_gln(ns).a = a_n;
    %2. Вычисление t_lambda_k - время пересечения восходящего узла орбиты спутника sin_i = sin(i_incl); cos_i = cos(i_incl); sin_i2 = sin_i * sin_i; cos_i2 = cos_i * cos_i; v = - alm_gln(ns).omegan; % omega_n - angle of a perigee
    J = -0.00162393855 ; % J = 3/2 *C20; C20=1082.6257 * 10-6; ae_a = A_PZ90_KM / a_n; ae_a2 = ae_a * ae_a; j_ae_a2 = J * ae_a2; omega1 = j_ae_a2 * n_dr * cos_i / (ecc2_1 * ecc2_1); n0_na = (n0 - alm_gln(ns).Na); tz = ti - alm_gln(ns).TLambdaN + 86400.0 * n0_na; wk = tz / t_dr; wi = fix(wk); wi2 = wi * wi; t_lambda_kk = alm_gln(ns).TLambdaN + t_dr * wi + alm_gln(ns).dTdr * wi2; t_lambda_k = t_lambda_kk - n0_na * 86400.0 ; lambda_k = alm_gln(ns).LambdaN + (omega1 - OMEGA_Z) * (wi * t_dr + alm_gln(ns).dTdr * wi2) ;
    %time_s0 - a true sidereal time to Greenwich midnight of date n0 to which time ti concerns time_s = time_s0 * SEC_IN_RAD + OMEGA_Z * t_lambda_k ; omega_0 = lambda_k + time_s;
    % Auxiliary values: d1 = 1.0 - 1.5 * sin_i2; j_ae_a2_d1 = j_ae_a2 * d1; j_ae_a2_d = j_ae_a2 * (1.0 - 1.5 * sin_i); j_ae_a2_sin_i = j_ae_a2 * sin_i; j_ae_a2_sin_i2 = j_ae_a2 * sin_i2; j_ae_a2_cos_i2 = j_ae_a2 * cos_i2;
    % 3. Calculation of constants: tau = 0; l = cos(alm_gln(ns).omegan) * alm_gln(ns).ecc; h = alm_gln(ns).ecc * sin(alm_gln(ns).omegan); dop_x = (sqrt(1.0 - alm_gln(ns).ecc) * tan( v / 2.0)); dop_y = sqrt(1.0 + alm_gln(ns).ecc);
    121
    ee = 2.0 * atan2(dop_x, dop_y ); ma = ee - alm_gln(ns).ecc * sin(ee); ll = ma + alm_gln(ns).omegan;
    % for (j = 0; j <= 1; j++) for ( j= 1 : 2) sin_l = sin(ll); sin_2l = sin(2 * ll); sin_3l = sin(3 * ll); sin_4l = sin(4 * ll); cos_l = cos(ll); cos_2l = cos(2 * ll); cos_3l = cos(3 * ll); cos_4l = cos(4 * ll); l_cosl = l * cos_l; delta_a(j) = 2.0 * a_n * j_ae_a2_d1 * l_cosl +... j_ae_a2 * sin_i * (0.5 * h * sin_l - 0.5 * l_cosl +... cos(2.0 * alm_gln(ns).LambdaN) + 3.5 * l * cos_3l + 3.5 * h * sin_3l); delta_h(j) = j_ae_a2_d1 * (l * n_dr * tau + sin_3l +...
    1.5 * l * sin_2l - 1.5 * h * cos_2l) -...
    0.25 * j_ae_a2_sin_i2 * (sin_l - D7_3 * sin_3l +...
    5.0 * l * sin_2l - 8.5 * l * sin_4l +...
    8.5 * h * cos_4l + h * cos_2l) + j_ae_a2_cos_i2 *...
    (tau * l * n_dr - 0.5 * l * sin_2l); delta_l(j) = j_ae_a2_d1 * ( - tau * h * n_dr + cos_l +...
    1.5 * l * cos_2l + 1.5 * h * sin_2l) -...
    0.25 * j_ae_a2_sin_i2 * ( - cos_l - D7_3 * cos_3l -...
    5.0 * h * sin_2l - 8.5 * l * cos_4l -...
    8.5 * h * sin_4l + l * cos_2l) + j_ae_a2_cos_i2 *...
    ( - tau * h * n_dr + 0.5 * h * sin_2l); d_omega(j) = j_ae_a2 * cos_i * (tau * n_dr + 3.5 * l * sin_l -...
    3.5 * h * cos_l - 0.5 * sin_2l - D7_6 * sin_3l + ...
    D7_6 * h * cos_3l); delta_i(j) = 0.5 * j_ae_a2_sin_i * cos_i * ( - l * cos_l +... h * sin_l + cos_2l + D7_3 * l * cos_3l + D7_3 * h * sin_3l); delta_ll(j) = 2.0 * j_ae_a2_d *... %
    2.0 * j_ae_a2_d1 *
    (tau * n_dr + D7_4 * l * sin_l -...
    D7_4 * h * cos_l) + 3 * j_ae_a2_sin_i *...
    ( - D7_24 * h * cos_l - D7_24 * l * sin_l -...
    D49_72 * h * cos_3l + D49_72 * l * sin_3l +...
    0.25 * sin_2l) + j_ae_a2 * cos_i *...
    122

    (tau * n_dr + 3.5 * l * sin_l - 2.5 * h * cos_l -...
    0.5 * sin_2l - D7_6 * l * sin_3l + D7_6 * h * cos_3l); tau = ti - t_lambda_k; ll = ma + alm_gln(ns).omegan + n_dr * tau; end;
    % 4. Corrections to orbit elements of a satellite by second zone harmonic J20
    % influence at the moments of time ti dda = delta_a(2) - delta_a(1); ddh = delta_h(2) - delta_h(1); ddl = delta_l(2) - delta_l(1); dd_omega = d_omega(2) - d_omega(1); ddi = delta_i(2) - delta_i(1); dd_ll = delta_ll(2) - delta_ll(1);
    % 5. calculation of influenced elements of orbits at the moment of ti time ai = a_n + dda; hi = h + ddh; li = l + ddl;
    % ecc_i = alm_gln[ns].ecc; ecc_i = sqrt(hi * hi + li * li); if (ecc_i == 0) w_i = 0; else if (li == ecc_i) w_i = HALF_PI; else if (li == - ecc_i) w_i = - HALF_PI; else if (li

    = 0) w_i = atan2(hi,li); else w_i = HALF_PI; end; end; end; end; omega_i = omega_0 + dd_omega; ii_incl = i_incl + ddi; ll_z = ma + alm_gln(ns).omegan + n_dr * tau + dd_ll;
    123

    % ll_z = ma + alm_gln(ns).omegan + n_dr * (ti - t_lambda_k) + dd_ll; mm_i = ll_z - w_i;
    % 6. Coordinates and components of satellite velocity vector
    % in absolute coordinate system OXaYaZa at the moment of ti time :
    % Ei(n) = Mi + ei * sin Ei(n-1), Ei(0) = Mi, | Ei(n) - Ei(n-1) | <= 10-8, eps_kepler = 1E-8; ee_i = kepler( mm_i, ecc_i, eps_kepler);% ee_i - эксцентрическая аномалия
    % alm_mca(ns).ek = ee_i; v_i = 2.0 * atan2(sqrt(1.0 + ecc_i) * tan(ee_i / 2.0) , sqrt(1.0 - ecc_i) ); u_i = v_i + w_i; ri = ai * (1.0 - ecc_i * cos(ee_i)) ; ecc_i2 = 1.0 - ecc_i * ecc_i; sqrt_mu_ai = sqrt( MU / ai); vr_i = sqrt_mu_ai * (ecc_i - sin(v_i) ) * ecc_i2; vu_i = sqrt_mu_ai * (1.0 + ecc_i * cos(v_i) ) * ecc_i2; cos_ui = cos(u_i); sin_ui = sin(u_i); cos_ii = cos(ii_incl); sin_ii = sin(ii_incl); cos_omega_i = cos(omega_i); sin_omega_i = sin(omega_i); x_dop = (cos_ui * cos_omega_i - sin_ui * sin_omega_i * cos_ii); y_dop = (cos_ui * sin_omega_i + sin_ui * cos_omega_i * cos_ii); satpos_xyz_gln.x = ri * x_dop; satpos_xyz_gln.y = ri * y_dop; satpos_xyz_gln.z = ri * sin_ui * sin_ii; satpos_xyz_gln.vx = vr_i * x_dop - vu_i * (sin_ui * cos_omega_i +... cos_ui * sin_omega_i * cos_ii); satpos_xyz_gln.vy = vr_i * y_dop - vu_i * (sin_ui * sin_omega_i -... cos_ui * cos_omega_i * cos_ii); satpos_xyz_gln.vz = vr_i * sin_ui * sin_ii + vu_i * cos_ui * sin_ii;
    Функция satpos_eci_in_metr
    function [satpos_eci, satpos_gln] = satpos_eci_in_metr(satpos_eci);
    %Имя функции: satpos_eci_in_metr
    %Функция преобразует координаты satpos_eci (структура), заданные в километрах в координаты
    %satpos_eci, satpos_gln в метрах satpos_eci.x = satpos_eci.x * 1000.0; satpos_eci.y = satpos_eci.y * 1000.0;
    124
    satpos_eci.z = satpos_eci.z * 1000.0; satpos_eci.vx = satpos_eci.vx * 1000.0; satpos_eci.vy = satpos_eci.vy * 1000.0; satpos_eci.vz = satpos_eci.vz * 1000.0; satpos_gln.x = satpos_eci.x; satpos_gln.y = satpos_eci.y; satpos_gln.z = satpos_eci.z;
    Функция init_satpos_gln
    function [sat_pos] = init_satpos_gln() ;
    %Имя функции:init_satpos_gln
    %Функция предназначена для инициализации структуры sat_pos sat_pos.prn = 0; sat_pos.x = -1.0; sat_pos.y = -1.0; sat_pos.z = -1.0; sat_pos.vx = -1.0; sat_pos.vy = -1.0; sat_pos.vz = -1.0; sat_pos.dvx = -1.0; sat_pos.dvy = -1.0; sat_pos.dvz = -1.0; sat_pos.range_m = -1.0;
    Функция eci_to_ecef
    function [satpos_ecef] =eci_to_ecef(s0, ti, satpos_eci)
    %Имя функции:eci_to_ecef
    %Функция преобразования координат
    %Входные данные: s0 - истинное звездное время в текущий момент обсервации ,
    %ti - текущее время; satpos_eci
    %Структура satpos_eci
    %satpos_eci.x - координата x в абсолютной неподвижной системе координат (ECI);
    %satpos_eci.y - координата y в абсолютной неподвижной системе координат (ECI);
    %satpos_eci.z - координата z в абсолютной неподвижной системе координат (ECI);
    %satpos_eci.vx - скорость vx в абсолютной неподвижной системе координат (ECI);
    %satpos_eci.vy - скорость vy в абсолютной неподвижной системе координат (ECI);
    % satpos_eci.vz - скорость vz в абсолютной неподвижной системе координат (ECI);
    %Выходные данные:
    % Структура satpos_ecef
    %satpos_ecef.x - координата x в подвижной системе координат (ECEF);
    %satpos_ecef.y - координата y в подвижной системе координат (ECEF);
    %satpos_ecef.z - координата z в подвижной системе координат (ECEF);
    125

    %satpos_ecef.vx - скорость по оси x в подвижной системе координат (ECEF);
    %satpos_ecef.vy - скорость по оси z в подвижной системе координат (ECEF);
    %satpos_ecef.vz- скорость по оси z в подвижной системе координат (ECEF);
    %Коэффициенты
    % SEC_IN_RAD - коэффициент преобразования секунд в радианы
    % s0(radian) = s0 (sek) * SEC_IN_RAD, where
    % SEC_IN_RAD = 2 * pi / (24 * 3600) = pi / 43200
    SEC_IN_RAD = pi / 43200;
    OMEGA_Z = 0.7292115e-4; %( скорость вращения Земли (angular speed of rotation of the Earth, рад/cek) s_zv = s0 * SEC_IN_RAD + OMEGA_Z * ti; cos_s = cos(s_zv); sin_s = sin(s_zv); satpos_ecef.x = satpos_eci.x * cos_s + satpos_eci.y * sin_s; satpos_ecef.y = -satpos_eci.x * sin_s + satpos_eci.y * cos_s; satpos_ecef.z = satpos_eci.z; satpos_ecef.vx = satpos_eci.vx * cos_s + satpos_eci.vy * sin_s + OMEGA_Z * satpos_ecef.y; satpos_ecef.vy = -satpos_eci.vx * sin_s + satpos_eci.vy * cos_s - OMEGA_Z * satpos_ecef.x; satpos_ecef.vz = satpos_eci.vz;
    Функция top_coord
    function [satvis] = top_coord(prn, rec_llh, rec_xyz, nlo_xyz)
    % Имя функции: top_coord
    % Функция выполняет расчет топоцентрических координат объекта по заданным
    %географическим (долгота, широта, высота) и геоцентрическим (x, y, z)
    %координатам приемника, а также геоцентрическим координатам объекта(x, y, z)
    %Входные данные:
    %prn - номер спутника
    %структура
    % rec_llh.lat - широта (рад) приемника
    %rec_llh.lon - долгота (рад) приемника
    %rec_llh.h - высота (м) приемника
    %структура
    %прямоугольные геоцентрические координаты приемника (м)
    % rec_xyz.x
    %rec_xyz.y
    %rec_xyz.z
    %структура
    126

    % прямоугольные геоцентрические координаты объекта (м)
    %nlo_xyz.x
    %nlo_xyz.y
    %nlo_xyz.z
    %Выходные данные:
    %структура satvis
    % top.s - проекция вектора дальности на ось, направленную на Юг (South)
    % top.e - проекция вектора дальности на ось, направленную на Восток (East)
    % top.z - проекция вектора дальности на ось, направленную в Зенит
    % top.daln - дальность до объекта
    % top.az - угол азимута объекта
    % top.el - угол видимости объекта rx = nlo_xyz.x - rec_xyz.x; ry = nlo_xyz.y - rec_xyz.y; rz = nlo_xyz.z - rec_xyz.z; r_sat = sqrt( rx * rx + ry * ry + rz * rz); r_rec = sqrt((rec_xyz.x)^2 + (rec_xyz.y)^2+ (rec_xyz.z)^2); top.r = r_sat; rx1 = rx; ry1 = ry; rz1 = rz; sin_lat = sin(rec_llh.lat); cos_lat = cos(rec_llh.lat); sin_lon = sin(rec_llh.lon); cos_lon = cos(rec_llh.lon);
    % Projections of vector of range in topocentric coordinate system: top.e = -sin_lon * rx1 + cos_lon * ry1; top.s = cos_lon * sin_lat * rx1 + sin_lon * sin_lat * ry1 - cos_lat * rz1; top.z = cos_lat * cos_lon * rx1 + cos_lat * sin_lon * ry1 + sin_lat * rz1;
    % azimut: отсчет по часовой стрелке от оси направленной на Север (N or -S) (-top.s) eps = 10e-10; if ( (abs(top.e) < eps) || (abs(top.s) < eps)) top.az = 0.0; else top.az = atan2(top.e,-top.s); end; if (top.az < 0.0) top.az = top.az + pi * 2; end;
    % elevation: cos_el_top = (rec_xyz.x * rx + rec_xyz.y * ry + rec_xyz.z * rz) / (r_sat * r_rec); if ( cos_el_top >= 1.00 )
    127
    el = 0.0; else if ( cos_el_top <= -1.00 ) el = pi; else el = acos(cos_el_top); end; end; top.el = pi / 2.0 - el; satvis.el = top.el; satvis.az = top.az; satvis.r = r_sat;
    Функция rewrite_satpos
    function [result] = rewrite_satpos(nom, satpos)
    %Имя функции:rewrite_satpos
    %Функция предназначена для перезаписи структуры satpos в массив структур result result(nom).x = satpos.x; result(nom).y = satpos.y; result(nom).z = satpos.z; result(nom).vx = satpos.vx; result(nom).vy = satpos.vy; result(nom).vz = satpos.vz;
    Функция utc_nut
    function nut = utc_nut(t)
    %Имя: utc_nut
    %Функция предназначена для расчета нутации
    %Входные данные:
    %t =6.023472005475702e+002;
    %Выходные данные:
    %nut - нутация
    R = 1296000; % ( 1r=360grad=1 296 000 cek)
    RAD_SEK_ANGL = pi/(3600*180); t2 = t * t; t3 = t2 * t; l = 485866.733 + (1325.0 * R + 715922.633) * t + 31.310 * t2 + 0.064 * t3;%1.034807679476340e+012 l1 = 1287099.804 + (99 * R + 1292581.224) * t - 0.577 * t2 - 0.012 * t3; f = 335778.877 + (1342 * R + 295263.137) * t - 13.257 * t2 + 0.011 * t3; dd = 1072261.307 + (1236 * R + 1105601.328) * t - 6.891 * t2 + 0.019 * t3; omega = 450160.280 - (5 * R + 482890.539) * t + 7.455 * t2 + 0.008 * t3; eps0 = 84381.448 - 46.8150 * t - 0.00059 * t2 + 0.001813 * t3;
    % eps0 = 84381.447996 - 46.8150 * t - 0.00059 * t2 + 0.001813 * t3;
    128
    eps_d = utc_nut_fi_eps(t, l, l1, f, dd, omega, 'd','e'); eps_k = utc_nut_fi_eps(t, l, l1, f, dd, omega, 'k','e'); eps = eps0 + eps_d + eps_k; cos_eps = cos(RAD_SEK_ANGL * eps ) / 15.0; d_fi = utc_nut_fi_eps(t, l, l1, f, dd, omega, 'd', 'f'); k_fi = utc_nut_fi_eps(t, l, l1, f, dd, omega, 'k', 'f'); nut1 = d_fi * cos_eps; nut2 = k_fi * cos_eps;
    % nut3 = 0.00264 * sin(omega) + 0.000063 * sin(2.0 * omega) nut3 = 0; nut1_dop = nut1; nut2_dop = nut2; nut3_dop = nut3; nut = nut1 + nut2 + nut3;
    Функция utc_nut_fi_ep
    function nut_fi_eps = utc_nut_fi_eps(t, l, l1, f, dd, omega, typ_nut, fi_eps)
    % Имя функции:utc_nut_fi_eps
    %Функция предназначена для расчета нутации по епсилон и фи
    %Входные данные:
    %t - значение параметра приведено в функции utc_nut;
    %l - значение параметра приведено в функции utc_nut;
    %l1 - значение параметра приведено в функции utc_nut;
    %f -значение параметра приведено в функции utc_nut;
    %dd - значение параметра приведено в функции utc_nut;
    % оmega - значение параметра приведено в функции utc_nut;
    %typ_nut - признак параметра приведен в функции utc_nut;
    %fi_eps - признак параметра приведен в функции utc_nut;
    %Выходные данные:
    %nut_fi_eps - значение нутации по по епсилон и фи
    % применить функцию koef
    [koef_id, koef_abd, koef_ik, koef_abk] = koef;
    RAD_SEK_ANGL = pi/(3600*180); if (typ_nut == 'd') n = 30; else n = 76; end; sum_a = 0; sum_b = 0; for i = 1 : n if (typ_nut == 'd')
    129
    s1 = koef_id(i,1) * l + koef_id(i,2) * l1 + koef_id(i,3) * f + koef_id(i,4) * dd + koef_id(i,5) * omega; if (fi_eps == 'f') a = koef_abd(i,1) * 1e-4; bt = koef_abd(i,2) * 1e-4; else a = koef_abd(i,3) * 1e-4; bt = koef_abd(i,4) * 1e-4; end; else s1 = koef_ik(i,1) * l + koef_ik(i,2) * l1 + koef_ik(i,3) * f + koef_ik(i,4) * dd + koef_ik(i,5) * omega; if (fi_eps == 'f') a = koef_abk(i,1) * 1e-4; bt = koef_abk(i,2) * 1e-4; else a = koef_abk(i,3) * 1e-4; bt = koef_abk(i,4) * 1e-4; end; end; if (fi_eps == 'f') sin_s1 = sin(RAD_SEK_ANGL * s1); sa = a * sin_s1; sb = bt * sin_s1; else cos_s1 = cos(RAD_SEK_ANGL * s1); sa = a * cos_s1; sb = bt * cos_s1; end; arg = RAD_SEK_ANGL * s1; sum_a = sum_a + sa; sum_b = sum_b + sb; end; nut_fi_eps = sum_a + sum_b * t;
    Функция koef
    function[koef_id, koef_abd, koef_ik, koef_abk] = koef
    % Имя функции:koef
    % Функция предназначена для ввода коэффициентов при расчете нутации koef_id = [ 0, 0, 0, 0, 1 ; % 1 0, 0, 0, 0, 2 ; % 2
    -2, 0, 2, 0, 1 ; % 3 2, 0,-2, 0, 0 ; % 4
    -2, 0, 2, 0, 2 ; % 5 130

    1,-1, 0,-1, 0 ; % 6 0,-2, 2,-2, 1 ; % 7 2, 0,-2, 0, 1 ; % 8 0, 0, 2,-2, 2 ; % 9 0, -1, 0, 0, 0 ; % 10 % исправлено
    0, 1, 2,-2, 2 ; % 11 0,-1, 2,-2, 2 ; % 12 0, 0, 2,-2, 1 ; % 13
    -2, 0, 0,2, 0 ; % 14 % исправлено
    0, 0, 2,-2, 0 ; % 15 0, 2, 0, 0, 0 ; % 16 0, 1, 0, 0, 1 ; % 17 0, 2, 2,-2, 2 ; % 18 0,-1, 0, 0, 1 ; % 19
    -2, 0, 0, 2, 1 ; % 20 0,-1, 2,-2, 1 ; % 21 2, 0, 0,-2, 1 ; % 22 0, 1, 2,-2, 1 ; % 23 1, 0, 0,-1, 0 ; % 24 2, 1, 0,-2, 0 ; % 25 0, 0,-2, 2, 1 ; % 26 0, 1,-2, 2, 0 ; % 27 0, 1, 0, 0, 2 ; % 28
    -1, 0, 0, 1, 1 ; % 29 0, 1, 2,-2, 0 ];% 30 koef_abd = [ -171996.0,-174.2, 92025.0, 8.9; % 1 2062.0, 0.2, -895.0, 0.5; % 2 46.0, 0.0, -24.0, 0.0; % 3 11.0, 0.0, 0.0, 0.0; % 4
    -3.0, 0.0, 1.0, 0.0; % 5
    -3.0, 0.0, 0.0, 0.0; % 6
    -2.0, 0.0, 1.0, 0.0; % 7 1.0, 0.0, 0.0, 0.0; % 8
    -13187.0, -1.6, 5736.0,-3.1; % 9
    -1426.0, 3.4, 54.0,-0.1; % 10 % исправлено
    -517.0, 1.2, 224.0,-0.6; % 11 217.0, -0.5, -95.0, 0.3; % 12 129.0, 0.1, -70.0, 0.0; % 13
    -48.0, 0.0, 1.0, 0.0; % 14 % исправлено
    -22.0, 0.0, 0.0, 0.0; % 15 17.0, -0.1, 0.0, 0.0; % 16 131

    -15.0, 0.0, 9.0, 0.0; % 17
    -16.0, 0.1, 7.0, 0.0; % 18
    -12.0, 0.0, 6.0, 0.0; % 19
    -6.0, 0.0, 3.0, 0.0; % 20
    -5.0, 0.0, 3.0, 0.0; % 21 4.0, 0.0, -2.0, 0.0; % 22 4.0, 0.0, -2.0, 0.0; % 23
    -4.0, 0.0, 0.0, 0.0; % 24 1.0, 0.0, 0.0, 0.0; % 25 1.0, 0.0, 0.0, 0.0; % 26
    -1.0, 0.0, 0.0, 0.0; % 27 1.0, 0.0, 0.0, 0.0; % 28 1.0, 0.0, 0.0, 0.0; % 29
    -1.0, 0.0, 0.0, 0.0]; % 30 koef_ik = [ 0, 0, 2, 0, 2; % 31 1, 0, 0, 0, 0; % 32 0, 0, 2, 0, 1; % 33 1, 0, 2, 0, 2; % 34 1, 0, 0,-2, 0; % 35
    -1, 0, 2, 0, 2; % 36 0, 0, 0, 2, 0; % 37 1, 0, 0, 0, 1; % 38
    -1, 0, 0, 0, 1; % 39
    -1, 0, 2, 2, 2; % 40 1, 0, 2, 0, 1; % 41 0, 0, 2, 2, 2; % 42 2, 0, 0, 0, 0; % 43 1, 0, 2,-2, 2; % 44 2, 0, 2, 0, 2; % 45 0, 0, 2, 0, 0; % 46
    -1, 0, 2, 0, 1; % 47
    -1, 0, 0, 2, 1; % 48 1, 0, 0,-2, 1; % 49
    -1, 0, 2, 2, 1; % 50 1, 1, 0,-2, 0; % 51 0, 1, 2, 0, 2; % 52 0,-1, 2, 0, 2; % 53 1, 0, 2, 2, 2; % 54 1, 0, 0, 2, 0; % 55 2, 0, 2,-2, 2; % 56 0, 0, 0, 2, 1; % 57 0, 0, 2, 2, 1; % 58 132

    1, 0, 2,-2, 1; % 59 0, 0, 0,-2, 1; % 60 1,-1, 0, 0, 0; % 61 2, 0, 2, 0, 1; % 62 0, 1, 0,-2, 0; % 63 1, 0,-2, 0, 0; % 64 0, 0, 0, 1, 0; % 65 1, 1, 0, 0, 0; % 66 1, 0, 2, 0, 0; % 67 1,-1, 2, 0, 2; % 68
    -1,-1, 2, 2, 2; % 69
    -2, 0, 0, 0, 1; % 70 3, 0, 2, 0, 2; % 71 0,-1, 2, 2, 2; % 72 1, 1, 2, 0, 2; % 73
    -1, 0, 2,-2, 1; % 74 2, 0, 0, 0, 1; % 75 1, 0, 0, 0, 2; % 76 3, 0, 0, 0, 0; % 77 0, 0, 2, 1, 2; % 78
    -1, 0, 0, 0, 2; % 79 1, 0, 0,-4, 0; % 80
    -2, 0, 2, 2, 2; % 81
    -1, 0, 2, 4, 2; % 82 2, 0, 0,-4, 0; % 83 1, 1, 2,-2, 2; % 84 1, 0, 2, 2, 1; % 85
    -2, 0, 2, 4, 2; % 86
    -1, 0, 4, 0, 2; % 87 1,-1, 0,-2, 0; % 88 2, 0, 2,-2, 1; % 89 2, 0, 2, 2, 2; % 90 1, 0, 0, 2, 1; % 91 0, 0, 4,-2, 2; % 92 3, 0, 2,-2, 2; % 93 1, 0, 2,-2, 0; % 94 0, 1, 2, 0, 1; % 95
    -1,-1, 0, 2, 1; % 96 0, 0,-2, 0, 1; % 97 0, 0, 2,-1, 2; % 98 0, 1, 0, 2, 0; % 99 1, 0,-2,-2, 0; % 100 133

    0,-1, 2, 0, 1; % 101 1, 1, 0,-2, 1; % 102 1, 0,-2, 2, 0; % 103 2, 0, 0, 2, 0; % 104 0, 0, 2, 4, 2; % 105 0, 1, 0, 1, 0]; % 106 koef_abk = [-2274.0, -0.2, 977.0, -0.5; % 31 712.0, 0.1, -7.0, 0.0; % 32
    -386.0, -0.4, 200.0, 0.0; % 33
    -301.0, 0.0, 129.0, -0.1; % 34
    -158.0, 0.0, -1.0, 0.0; % 35 123.0, 0.0, -53.0, 0.0; % 36 63.0, 0.0, -2.0, 0.0; % 37 63.0, 0.1, -33.0, 0.0; % 38
    -58.0, -0.1, 32.0, 0.0; % 39
    -59.0, 0.0, 26.0, 0.0; % 40
    -51.0, 0.0, 27.0, 0.0; % 41
    -38.0, 0.0, 16.0, 0.0; % 42 29.0, 0.0, -1.0, 0.0; % 43 29.0, 0.0, -12.0, 0.0; % 44
    -31.0, 0.0, 13.0, 0.0; % 45 26.0, 0.0, -1.0, 0.0; % 46 21.0, 0.0, -10.0, 0.0; % 47 16.0, 0.0, -8.0, 0.0; % 48
    -13.0, 0.0, 7.0, 0.0; % 49
    -10.0, 0.0, 5.0, 0.0; % 50
    -7.0, 0.0, 0.0, 0.0; % 51 7.0, 0.0, -3.0, 0.0; % 52
    -7.0, 0.0, 3.0, 0.0; % 53
    -8.0, 0.0, 3.0, 0.0; % 54 6.0, 0.0, 0.0, 0.0; % 55 6.0, 0.0, -3.0, 0.0; % 56
    -6.0, 0.0, 3.0, 0.0; % 57
    -7.0, 0.0, 3.0, 0.0; % 58 6.0, 0.0, -3.0, 0.0; % 59
    -5.0, 0.0, 3.0, 0.0; % 60 5.0, 0.0, 0.0, 0.0; % 61
    -5.0, 0.0, 3.0, 0.0; % 62
    -4.0, 0.0, 0.0, 0.0; % 63 4.0, 0.0, 0.0, 0.0; % 64
    -4.0, 0.0, 0.0, 0.0; % 65
    -3.0, 0.0, 0.0, 0.0; % 66 134

    3.0, 0.0, 0.0, 0.0; % 67
    -3.0, 0.0, 1.0, 0.0; % 68
    -3.0, 0.0, 1.0, 0.0; % 69
    -2.0, 0.0, 1.0, 0.0; % 70
    -3.0, 0.0, 1.0, 0.0; % 71
    -3.0, 0.0, 1.0, 0.0; % 72 2.0, 0.0, -1.0, 0.0; % 73
    -2.0, 0.0, 1.0, 0.0; % 74 2.0, 0.0, -1.0, 0.0; % 75
    -2.0, 0.0, 1.0, 0.0; % 76 2.0, 0.0, 0.0, 0.0; % 77 2.0, 0.0, -1.0, 0.0; % 78 1.0, 0.0, -1.0, 0.0; % 79
    -1.0, 0.0, 0.0, 0.0; % 80 1.0, 0.0, -1.0, 0.0; % 81
    -2.0, 0.0, 1.0, 0.0; % 82
    -1.0, 0.0, 0.0, 0.0; % 83 1.0, 0.0, -1.0, 0.0; % 84
    -1.0, 0.0, 1.0, 0.0; % 85
    -1.0, 0.0, 1.0, 0.0; % 86 1.0, 0.0, 0.0, 0.0; % 87 1.0, 0.0, 0.0, 0.0; % 88 1.0, 0.0, -1.0, 0.0; % 89
    -1.0, 0.0, 0.0, 0.0; % 90
    -1.0, 0.0, 0.0, 0.0; % 91 1.0, 0.0, 0.0, 0.0; % 92 1.0, 0.0, 0.0, 0.0; % 93
    -1.0, 0.0, 0.0, 0.0; % 94 1.0, 0.0, 0.0, 0.0; % 95 1.0, 0.0, 0.0, 0.0; % 96
    -1.0, 0.0, 0.0, 0.0; % 97
    -1.0, 0.0, 0.0, 0.0; % 98
    -1.0, 0.0, 0.0, 0.0; % 99
    -1.0, 0.0, 0.0, 0.0; % 100
    -1.0, 0.0, 0.0, 0.0; % 101
    -1.0, 0.0, 0.0, 0.0; % 102
    -1.0, 0.0, 0.0, 0.0; % 103 1.0, 0.0, 0.0, 0.0; % 104
    -1.0, 0.0, 0.0, 0.0; % 105 1.0, 0.0, 0.0, 0.0]; % 106
    Функция semi_axis_1
    135

    % double semi_axis(double t_dr, double i_incl, double ecc, double omega_n) function [a_npp] = semi_axis_1(t_dr, i_incl, ecc, omega_n);
    %Имя функции:semi_axis_1
    %Функция вычисляет радиус орбиты спутника ГЛОНАСС в соответствии с интерфейсным контроль- ным
    %документом ГЛОНАСС
    %Входные данные:
    %t_dr - драконический период обращения спутника ГЛОНАСС (секунды)
    %i_incl - наклонение орбиты спутника ГЛОНАСС (радиан)
    %ecc - эксцентриситет
    %omega_n - аргумент перигея орбиты спутника ГЛОНАСС (радиан)
    %Выходные данные:
    %a_npp - большая полуось орбиты спутника ГЛОНАСС (километр)
    A_PZ90_KM = 6378.136; %(Km) Equatorial radius of the Earth
    J20 = -1082625.7e-9; % Factor at the second zone harmonicm
    % B_PZ90_KM = 6356.75136174571344; % AP_LAND (Km) Polar radius of the Earth */
    %a_npp = 1;
    MU = 398600.44; % (Km^3/cek^2) constant of a gravitational epsilon = 1.0e-3; sin_i = sin(i_incl); sin_i2 = sin_i * sin_i; v = -omega_n;% omega_n - angle of a perigee ecc2_1 = 1.0 - ecc * ecc; b1 = 2.0 - 2.5 * sin_i2; b2 = sqrt(ecc2_1 * ecc2_1 * ecc2_1 ); b3 = 1.0 + ecc * cos(omega_n); b3 = b3 * b3; b4 = 1.0 + ecc * cos(v); b5 = b4 * b4 * b4 / ecc2_1; b = b1 * b2 / b3 + b5; t_ock = t_dr; tock_2pi = t_ock /(pi * 2); p1_3 = 1.0 / 3.0; a_dop = MU * tock_2pi * tock_2pi; a_n = a_dop^(1/3);
    % a_n = pow(a_dop, p1_3); nn = 0; dda = epsilon + 1; while ( (dda > epsilon) & (nn < 50) ) p = a_n * ecc2_1; % Focal parameter
    136
    ae_p = A_PZ90_KM / p; b0 = 1.0 + (1.5 * J20 * ae_p * ae_p) * b; t_ock = t_dr / b0; tock_2pi = t_ock / (pi * 2); a_dop = MU * tock_2pi * tock_2pi; a_npp = a_dop^(1/3); dda = abs(a_n - a_npp); a_n = a_npp; nn = nn + 1; end;
    Функция kepler
    function [Ek] = kepler(Mk, ecc, eps);
    %Имя функции:kepler
    %Функция предназначена для решения уравнения Кеплера
    % eps = 1.0E-15; y = ecc * sin(Mk); x1 = Mk; x = y; for k = 0 : 15 x2 = x1; x1 = x; y1 = y; y = Mk - (x - ecc * sin(x)); if (abs(y - y1) < eps) break end x = (x2 * y - x * y1) / (y - y1); end %k
    Ek = x;
    Функция map
    function map(N)
    %Имя функции:map
    %Применена функция MatLab для внесения в графики орбитального движения изображения Земли load('topo.mat','topo','topomap1');
    [x,y,z] = sphere(50); cla reset
    %axis square off props.AmbientStrength = 0.1;
    137
    props.DiffuseStrength = 1; props.SpecularColorReflectance = .5; props.SpecularExponent = 20; props.SpecularStrength = 1; props.FaceColor= 'texture'; props.EdgeColor = 'none'; props.FaceLighting = 'phong'; props.Cdata = topo; surface(x*N,y*N,z*N,props); light('position',[-1 0 1]); light('position',[-1.5 0.5 -0.5], 'color', [.6 .2 .2]); view(3) ; grid on
    4.3.5 Примеры выполнения комплекса программ ORBITA_GL_NAVIOR
    Некоторые результаты, иллюстрирующие работу программ, изображены на рис. 4.8 - рис. 4.11.
    Рис. 4.8. Орбиты спутников ГЛОНАСС в системе координат ECEF
    138

    Рис. 4.9. Орбиты спутников ГЛОНАСС в системе координат ECI
    Рис. 4.10. Орбита спутника ГЛОНАСС № 24 за 7 суток
    139

    0 2
    4 6
    8 10 12 14 16 18 20 22 24 0
    2 4
    6 8
    10 12 14 16 18 20 22 24
    Время наблюдения спутников ГЛОНАСС, час
    Но м
    е р
    нав и
    гац и
    онн о
    го сп ут ник а
    Рис. 4.11. Видимость спутников ГЛОНАСС
    Программы имеют и другие возможности в зависимости от задач, которые может поставить специалист, исследующий орбитальное движение спутников.
    140

    141
    1   ...   4   5   6   7   8   9   10   11   ...   14


    написать администратору сайта