Advertisement
dmkozyrev

example.m

Jun 18th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 6.23 KB | None | 0 0
  1. function example
  2. % Программа, демонстрирующая движение нескольких искусственных спутников Земли
  3.  
  4.   R = 6371; % Радиус земли в километрах
  5.  
  6. % Перечисляются элементы орбиты каждого из спутников (в примере три спутника):  
  7.   count = 3;                     % количество спутников
  8.   a     = [4*R  3*R     2*R];    % Большие полуоси
  9.   e     = [0.3  0.05    0.15];   % Эксцентриситет
  10.   i     = [pi/9 pi/4    pi/3];   % Наклонение
  11.   Omega = [pi/6 pi/3    pi];     % Долгота восходящего узла
  12.   omega = [pi/3 2*pi/3  5*pi/3]; % Аргумент перицентра
  13.   T     = [180  90      60];     % Период обращения
  14.  
  15. % Цвета для каждого спутника:
  16.   color_track = [   'r',  'b',    'g'];   % Цвет линии орбиты
  17.   color_bind  = { '--r',  '--b',  '--g'}; % Цвет линии, соединяющей спутник и центр земли
  18.  
  19. % Предварительный расчет координат для каждого из спутников:
  20.   len = max(T); % len - сколько итераций рисовать (выбрана длина максимального периода)
  21.   sp_x = sp_y = sp_z = zeros(count, len); % векторы для декартовых координат спутников
  22.   max_value = 0;  % в процессе расчетов будем искать максимальное значение среди всех координат чтобы пронормировать
  23.   for id = 1:count % в цикле по всем функциям
  24.     % вызов функции, расчитывающей координаты одного спутника:
  25.     [sp_x(id, :), sp_y(id, :), sp_z(id, :)] = one_sputnik(a(id), e(id), i(id), Omega(id), omega(id), T(id), len);
  26.     % поиск и обновление максимума среди координат:
  27.     tm1 = max(abs(sp_x(id, :)));
  28.     tm2 = max(abs(sp_y(id, :)));
  29.     tm3 = max(abs(sp_z(id, :)));
  30.     max_value = max([max_value, tm1, tm2, tm3]);
  31.   end
  32.  
  33. % Нормировка радиуса Земли:
  34.   R /= max_value;
  35.  
  36. % Рисование сферы:
  37.   [X, Y, Z] = sphere(25);
  38.   mesh(R*X, R*Y, R*Z);
  39.  
  40. % Настраивание осей:
  41.   axis ([-1 1 -1 1 -1 1]);
  42.   axis equal;
  43.   hold on;
  44.   xlabel('x');
  45.   ylabel('y');
  46.   zlabel('z');
  47.  
  48. % Нормировка координат спутников и рисование орбит:
  49.   for id = 1:count
  50.     sp_x(id, :) /= max_value;
  51.     sp_y(id, :) /= max_value;
  52.     sp_z(id, :) /= max_value;
  53.     % рисуем орбиту спутника с номером id:
  54.     plot3(sp_x(id, [1:T(id), 1]), sp_y(id, [1:T(id), 1]), sp_z(id, [1:T(id), 1]), color_track(id));
  55.   end
  56.  
  57.   r = R / 25; % радиус сферы для отображения спутника
  58.   X *= r;     % сжатие сферы
  59.   Y *= r;
  60.   Z *= r;
  61.  
  62.  
  63. % Рисуем каждый спутник и линию, соединяющую спутник и центр Земли в начальный момент времени:
  64.   h = sputnik = zeros(1, count); % вектора, в которые мы будем сохранять ссылки на графические объекты для их удаления
  65.   for id = 1:count
  66.     % рисуем сферу, представляющую спутник:
  67.     sputnik(id) = surf(X+sp_x(id, 1), Y+sp_y(id, 1), Z+sp_z(id, 1));
  68.     % рисуем линию, соединяющую спутник и центр Земли:
  69.     h(id) = plot3([0 sp_x(id, 1)], [0 sp_y(id, 1)], [0 sp_z(id, 1)], color_bind{id});
  70.   end
  71.  
  72. % счетчик моментов времени для каждого спутника:
  73.   k = ones(1, count);
  74.  
  75. % основная анимация:
  76.   for t = 2:len % текущий момент времени
  77.     for id = 1:count % цикл по всем спутникам
  78.       k(id)++; % увеличиваем момент времени каждого спутника
  79.       if (k(id) > T(id)) % если превысили период обращения
  80.         k(id) = 1; % то возвращаемся в начало
  81.       end
  82.      
  83.       % удаление предыдущих и рисование текущих сфер и линий:
  84.       delete(sputnik(id));
  85.       delete(h(id));
  86.       sputnik(id) = surf(X+sp_x(id, k(id)), Y+sp_y(id, k(id)), Z+sp_z(id, k(id)));
  87.       h(id) = plot3([0 sp_x(id, k(id))], [0 sp_y(id, k(id))], [0 sp_z(id, k(id))], color_bind{id});
  88.     end
  89.     pause(0.001); % величина паузы
  90.   end
  91. end
  92.  
  93. function [x, y, z] = one_sputnik(a, e, i, Omega, omega, T, len)
  94. % функция, расчитывающая координаты одного спутника в каждый из моментов времени
  95. % a - большая полуось орбиты
  96. % e - эксцентриситет
  97. % i - наклонение
  98. % Omega - долгота восходящего узла
  99. % omega - аргумент перицентра
  100. % T - Период обращения
  101. % len - длина массива, которую необходимо выделить
  102. % введена, так как периоды у всех спутников разные, а длина ассивов должна быть одинаковая
  103.  
  104. % i и Omega не изменяются, поэтому заранее вычисляем их косинусы и синусы:
  105.   cos_Omega = cos(Omega);
  106.   sin_Omega = sin(Omega);
  107.  
  108.   cos_i = cos(i);
  109.   sin_i = sin(i);
  110.  
  111. % массив для моментов времени:
  112.   dt = 2*pi/T;
  113.   t = [0:dt:2*pi-dt, zeros(1, len-T)];
  114.  
  115. % массив координат:
  116.   x = y = z = zeros(1, length(t));
  117.  
  118. % вычисляем координаты для каждого момента времени:
  119.   for k = 1:length(t)
  120.     r = a*(1-e^2)/(1+e*cos(t(k)));
  121.     sin_omega = sin(t(k)+omega);
  122.     cos_omega = cos(t(k)+omega);
  123.     x(k) = r*(cos_Omega*cos_omega-sin_Omega*sin_omega*cos_i);
  124.     y(k) = r*(sin_Omega*cos_omega+cos_Omega*sin_omega*cos_i);
  125.     z(k) = r*sin_omega*sin_i;
  126.   end
  127. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement