Продолжение статьи, созданной в процессе решения задачи о погоне, для школьников. Очков Валерий Федорович, предложил мне решить методом структурного моделирования задачу погони волка за зайцем. И в первой части именно эта задача подробно и разобрана. Многие читатели справедливо спрашивали, а причем здесь евреи и ракеты? В этой части я покажу, как можно связать школьную задачу про бегающего по кругу зайца с израильской противоракетной обороной.
Причем здесь противоракетная оборона?
Вопрос справедливый. Если теперь мы посмотрим на нашу модель, то увидим, что, создавая модель волка в SimInTech, мы на самом деле создали систему наведения. Причем, из-за моей невнимательности, мой заяц бежит не по часовой стрелке, как в исходной задаче, а против, и теперь график движения зайца подозрительно напоминает траекторию движения ракет «поверхность – поверхность», если считать, что Y – это у нас высота. А график движения волка похож на траекторию ракеты-перехватчика.
Получилось, как в советском анекдоте про несунов с завода:
Беременная жена говорит мужу:
- В стране дефицит детских колясок, в магазинах не достать. Дорогой, ты на заводе работаешь, который детские коляски делает, ты там тихо детальки выноси, и мы коляску соберем к рождению малыша.
Подходит время рожать, жена спрашивает
- Ну как, 8 месяцев прошло, ты все детали вынес с завода? Будет коляска?
- Давно уже все детали в гараже, только вот как я ни собираю, все равно получается пулемет.
Так же и с нашей моделью: решали задачу с зайцем, получили ракету-перехватчик. Если мы сейчас соберем в отельный блок алгоритмы наведения волка на зайца, то наша структурная схема будет полностью повторять верхний уровень любой системы управления ракеты ПВО.
В самом деле у нас есть:
цель с ее положением в пространстве — это заяц.
перехватчик (волк) со своими характеристиками, в нашем простейшем случае – это скорость.
система наведения, которая, получая координаты цели (зайца) и координаты перехватчика (волка), выдает команды управления (куда бежать).

И теперь, в структурной схеме мы можем разбить задачу моделирования и отдельно уточнять модели перехватчика, учитывать мощность его двигателя, силы сопротивления среды, массу, и т.п. Можем менять модель, цели, модель системы наведения, при этом общая структура модели не поменяется.
Раз у нас получилось похоже на перехватчик, давайте поменяем алгоритм так, чтобы волк быстрее перехватывал «зайца», до того, как он поразит объект на поверхности. Как видим из графика, перехват не получился. В самом деле, если считать, что Y= 0 это уровень, на котором расположены все моделируемые объекты. В самом деле, если поставить расчет на паузу в момент, когда ракета пресекает уровень поверхности Y= 0, то перехватчик находится на расстоянии 35 метров.

Но прежде, чем переходить к доработке системы наведения перехватчика, давайте внесем немного оживления в сам проект. Создадим окно технической анимации.
На схемном окне есть кнопка «Менеджер данных…», нажимаем на нее и добавляем новую категорию и новое окно анимации:

Появляется новое окно, в котором мы будем рисовать зайца и волка в процессе моделирования. Черех кнопку «Менеджер данных…», это окно можно будет вызвать в любой момент создания модели или расчета.
В главном окне программы есть кнопка, которая вызывает «Панель примитивов», где мы можем вызвать инструменты для рисования.

Прежде чем начать моделировать зайца, расскажу анекдот про физиков.
Собрал Ротшильд английских ученых: математика-статистика, биолога-генетика, и физика-теоретика. И поставил задачу: вот вам каждому грант по 1 млн баксов. Хочу в скачках участвовать, и чтобы моя лошадь победила в королевском дерби. Как мне получить такую лошадь? Через год приходите с проектом:
Математик: Денег мало, но смогли. Мы исследовали статистику за 200 лет соревнований по конному спорту, все проанализировали. Нужно купить лошадь такого года, чтобы она пять лет побеждала в следующих соревнованиях (вот тут список), и нанять жокея, который побеждал в соревнования по списку, и тогда через 5 лет с вероятностью 10% они победят в королевском дерби.
Биолог-генетик: Денег совсем мало, но мы провели исследования и, если скрестить три линии вот этих скакунов, победителей соревнований в течение 5 лет, то потомство с вероятностью 20% победит.
Физик: Денег совсем мало, но я создал модель сферического коня в вакууме!
Вот и мы будем создавать модель сферического волка и зайца в вакууме.
Берем с панели заполоненный кружочек, ставим на окно анимации – это будет модель шарового зайца в вакууме. Таким же кружочком будем обозначать волка. Чтобы их отличать в языке программирования, поменяем имя кружочков по умолчанию Hare и Wolf и их цвет.

Чтобы в систему анимации передавать значения положения из модели нам необходимо в проект добавить сигналы. В главном меню в главном окне выбираем «Сервис / Сигналы» И в окне добавляем два сигнала для позиции волка и зайца. Тип данных у нас будет точка.

На схеме добавим два блока записи сигналов и указываем, какие сигналы записываем. При этом, теперь во время расчета в эти сигналы будут записываться положения зайца (цели) и волка (перехватчика).

После этого можно переходить в окно анимации. Выбираем меню окна анимации «Скрипт» и начинаем программировать поведение наших кружочков.

Сам скрипт с пояснениями приведен на следующем рисунке:

Если сейчас запустить на расчет, то мы увидим фигню: мало того, что кружочки разлетелись на большем поле, но и движение их по оси Y противоположно заданному.

Дело в том, что рисование направлений осей в окне анимации соответствует принятому в Windows, где ось Y направлена вниз. Поэтому, чтобы получить более удобное окно, нужно выполнить масштабирование сигналов. Для этого ставим на схему векторный усилитель с коэффициентом 0.3 для оси X и – 0.3 для оси Y. Это позволит сократить радиус в окне анимации, по которому бегает заяц. А значит, окно можно сделать меньше.

Шаровые модели зайца и волка — это хорошо, но хотелось бы еще видеть траектории. Поэтому добавим в окно анимации еще три элемента: две полилинии, которые будут отображать траектории движения цели (зайца) и перехватчика (волка), и одну линию – прицеливания.

Меняем Имя объекта для полилиний - WolfTrace и HareTrace и Direction для линии.
Теперь у нас есть объекты, которые можно использовать для анимации.
В скрипте создаем секцию инициализации, где создаем переменные, в которые будут записываться точки траектории в процессе моделирования.

После этого, во время расчета, мы сравниваем рассчитанное положение цели и перехватчика и, если они отличается от сохраненного ранее, то мы увеличиваем количество точек в полилинии. Таким образом рисуем трассу в окне анимации. На следующем рисунке скрипт построения траектории для зайца. Для волка – все то же самое.

Если все сделано правильно, то после запуска в окне анимации отражаются траектории движения цели (зайца) и перехватчика (волка), и линия направления, по которой формируется управления перехватчиком.

Теперь, когда у нас есть анимация, давайте займемся системой наведения, чтобы улучшить качество перехвата.
Сделаем специальную суб-модель, в которую будем передавать положение цели - зайца, положение перехватчика - волка, а она будет выдавать управляющий сигнал - угол направления для интегратора:

Понятно, что для улучшения наведения нужно направлять перехватчик не на текущее положение цели зайца, а на будущее с учетом направления его движения, брать упреждение.
Рассмотрим работу системы наведения в произвольный момент времени. Текущий алгоритм учитывает только взаимное положение перехватчика и цели. Давайте добавим учет движения цели.

Чтобы определить скорость и направления движения, нам достаточно на каждом временном шаге знать предыдущее положение цели, например, 1 секунду назад. Тогда разница между текущим положением цели () и предыдущим (
) дает нам возможность определить текущую скорость и направление движения. (Зеленый вектор на рисунке Vз)
Предположив, что скорость и направление цели не будут меняться (это, конечно, не так, но перехватчик-волк у нас не знает, что в голове у зайца, поэтому он может анализировать только текущее направление движения), мы определим, где будет цель в следующий момент времени.
С направлением предполагаемого движения разобрались, осталось решить, какую точку на этом направлении выбирать за точку прицела. Логика, здесь следующая:
Чем дальше мы от цели, тем больше времени нам нужно, чтобы ее достигнуть, и тем дальше она успеет уйти от текущего положения. В качестве первого приближения текущего положения цели мы можем взять время t, которое необходимо перехватчику до текущего положения цели. Это время можно получить, разделив расстояние до цели D на скорость волка t = D/Vв.
Насколько точка переместится к цели через время t, рассчитывается путем умножения скорости цели на время .
Даже из рисунка видно, что расчет этот весьма приблизительный, однако поскольку расчет происходит на каждом такте вычислений, при сокращении расстояния точность его увеличивается, пока все три точки цели прицеливания и перехватчика не совпадут.
Алгоритм последовательности можно описать так:
1) Текущую скорость цели Vз
2) Расстояние до цели В
3) Время, необходимое для достижения текущего положения цели
4) Упреждение – расстояния, где будет цель через это время.
5) Добавляем к текущему положению упреждения, получаем точку прицеливания
6) Используем точку прицеливания для расчета направления движения!
Таким образом, первый и простейший алгоритм прицеливания в среде структурного моделирования выглядит так:

В данном алгоритме добавлен также ручной ключ, который позволяет переключать режим прицеливания. Он стоит после расчета времени до перехвата. Если он замкнут, это время (путем деления расстояния на скорость движения перехватчика) передается на блок векторного умножения, где умножается на скорость и получается добавка к текущему положению. Если его размокнуть во время расчета, то на выходе будет ноль, соответственно обнулится и добавка, и точка прицеливания совпадет с текущим положением.
В схеме также добавлена запись в список сигналов точки прицеливания PointPos, которую используем в анимации, чтобы отобразить куда целиться.
Запускаем на расчет и видим значительное улучшение параметров перехвата. Прямо со старта перехватчик направляется не к цели параллельно земле, а под углом к горизонту.

И перехват осуществляется значительно быстрее:

Давайте честно, кончено на графиках анимация действительно похожа на перехват цели, но параметры все-таки из мира животных, причем шаровых животных в вакууме. А что будет, если скорости и параметры цели будут как у реальных ракетных систем? Сработает ли система наведения, если мы запустим не шарового коня в вакууме по кругу, а артиллерийский снаряд по баллистической траектории? У меня-таки есть ответ на этот вопрос. И евреи здесь совсем даже причем. Рассмотрим израильскую систему Купол, которая умеет перехватывать артиллерийские снаряды 155 мм. Именно в Израиле используют дорогие ракеты для перехвата дешёвых снарядов.
Дисклеймер для Моссада: я по специальности инженер-физик-ядерËньщик, и только американская коррупция сделала из меня быдлокодера (я об этом писал).
Поэтому никаких реальных алгоритмов наведения я не знаю. Алгоритм, описанный в статье, я лично сам выдумал, зуб даю, а как на самом деле работает Купол я в душе не представлю!
Так как данный текст мы пишем для самых маленьких, то обратимся к школьной программе, вспомнив закон Ньютона из школьной физики:
Где – ускорение,
– масса,
– сила из этого следуюет что
- ускорение.
Вспомним также из школьной программы, как расстояние зависит от ускорения и времени:
Мы уже показали, что блок интегратор вычисляет расстояние, если на его вход подается скорость. В нашем уравнении нет скорости, а есть ускорение. Ничего страшного! Мы ставим еще один интегратор, который превратит ускорение в скорость
Смоделируем ситуацию: объект массой 1 кг движется со скоростью 1 м/с, сначала у нас нет никакой силы, а потом на 5 секунде появится сила F = 1 Н.
Зададим F = 1, и m = 1 в глобальных переменных. Используем их в блоке структурной схемы - «ступенька», который будет выдавать 0 в течение 5 секунд, а после 5 секунд выдаст нам a = F/m =1. Это и будет ускорение.

Как мы помним из физики, тело, на которое не действует сила, либо находится в покое, либо движется с постоянной скоростью. Пусть наше тело движется со скоростью 1 м/с. Для этого в интеграторе, который на вход получает ускорение в начальных условиях, мы зададим 1.

После этого запустим задачу на расчет и посмотрим, что будет происходить. Первый интегратор на вход получает ускорение, на выходе отдает нам скорость. Пока сила не действует, ускорение равно 0, и тело движется с постоянной скоростью.
Смотрим на график и видим, что модель отвечает законам мироздания, о которых нам рассказывали в школе:

В течение первых 5 секунд скорость не меняется (зеленая линия), и наш объект движется равномерно cо скоростью 1, и за 5 секунд проходит 5 метров (красная линия).
Затем появляется сила, которая создает ускорение = 1, и мы видим, как скорость начинает расти через 2 секунды после появления силы (7 секунда расчета), скорость 1 + 2 = 3, а расстояние, пройденное после за 2 секунды, также отвечает уравнению
Разобравшись как моделировать движение, когда известны силы, заменим шарового зайца в вакууме на артиллерийский снаряд.
Дисклеймер для ФСБ: как летают артиллерийские снаряды я тоже не знаю, вся дальнейшая информация взята из статьи «Полёт тел в стратосфере (Дальнобойная артиллерия)», автор Благовещенский̆ Владимир Валерьевич.
Рассмотрим артиллерийский снаряд. Движение тела по баллистической траектории можно описать формулой Ньютона:
где: - вектор ускорения свободного падения;
-сила сопротивленя водуха.
где: - скорость тела.
-коэффициент сопротивления воздуха.
Здесь: – площадь лобового сопротивления снаряда;
– плотность воздуха;
Разложим пространственный вектор на два слагаемых по осям х и у:
где:
Повторим уравнение с двумя интеграторам для и
Такие уравнения можно собрать в SimInTech, тем более у нас есть блок, который вычисляет плотность воздуха в зависимости от высоты его.
Создадим новый проект и в глобальном скрипте добавим параметры снаряда

Сначала соберем уравнения для движения по оси x. Примем, что скорость по оси Y равна скорости по оси Y и высота полета 1 м. Тогда у меня получается примерно такая структурная модель. В качестве пояснения я подписываю, какие вычисления выполняются в блоках и какие результаты получаются.

Поясню модель:
В интеграторе 1, который получает ускорение, задаем в качестве начальных условий скорость по оси X - [v*cos(alpha)]. Пока нет модели движения по оси Y, используем скорость по Vх вместо Vy в блоке возведения в квадрат 2. В блок усилитель 3 заносим все постоянные коэффициенты - c*S/2/m.Плотность по высоте считается специальным блоком атмосфера. Принимаем, что высота 1 метр. В итоге у нас получается необходимое выражение для ускорения,
Которое умножается на -1, и подается на вход интегратора 1. Первый интегратор рассчитывает текущую скорость, следующий интегратор по скорости рассчитывает расстояние. Добавляем графики расстояния и скорости по Х.
Запускаем на расчет и убеждаемся, что скорость падает по квадратичному закону (сила сопротивления воздуха действует!): чем выше скорость, тем больше сила сопротивления, и тем быстрее замедляется снаряд.
Видим, что расстояние увеличивается медленней при замедлении снаряда.
Законы физики соблюдаются! Ньютон был бы доволен!

Перейдем к формуле для ускорения по оси Y. Здесь практически все тоже самое. Добавляется сила тяжести F= m*g. В формуле ускорения после сокращения на массу, от нее остается – g.
Добавляем -g, как постоянный источник к силе трения, и теперь можем использовать высоту Y и скорость Vy.
Добавляем на схему вычисления пути ускорения по оси Y, также фазовый портрет для отображения траектории полета и блок остановки расчета (в момент времени, когда у нас высота = 1 метр, считаем, что снаряд прилетел.)
У меня получилась такая схема:

И вспоминаем, что в линии может быть не одно число, вектор. Мы можем вместо отдельного расчета Х и У объединить их в одну схему. Тогда интеграторы одновременно рассчитывают скорость и ускорение по оси Х и Y. Например, вот так выглядят свойства первого интегратора, обеспечивающего расчет скорости, где задаются начальные условия для выстрела.

Формулы расчета ускорения по осям у нас отличаются только наличием силы тяжести, поэтому общая модель полета снаряда у меня получилась вот такого вида:

Запускаем на расчет:

И видим, что результат совпадает с траекторией из исходной статьи.
Упакуем нашу модель в отдельный блок-субструктуру:

А дальше воспользуемся красотой структурного моделирования и вставим в модель зайца модель снаряда дальнобойной артиллерии. Поскольку на выходе у моделей и зайца, и снаряда есть X и Y, то их легко заменить. Тем самым мы демонстрируем, как модель, содержащая в себе только круг, заменяется физической моделью с учетом массы и плотности воздуха по высоте.
Так просто, копи пастом, заяц превращается в снаряд дальнобойной артиллерии.

Конечно, нужно добавить параметры снаряда в окно глобальных переменных, а также увеличить скорость волка до скорости ракеты-перехватчика системы купол – 700 м/с.
Ну, и для того, чтобы анимация работала, нужно уменьшить масштаб до 0.006

А теперь запускаем на расчет в режиме прицеливания без упреждения:

При угле выстрела 45 град. перехват не осуществлен! Снаряд пробил купол!

Замыкаем ключ, включаем ключ, включая систему наведения в режим работы с упреждением. И система наведения срабатывает – перехват снаряда осуществлён.


Кстати, при стрельбе с углом 30% перехватчик успевает сбить снаряд даже с наведением по снаряду:

А если включить упреждение, то перехват цели при угле выстрела 30 градусов даже похож на видео из Израиля:

И хотя у нас практические честно моделируется только полет снаряда, а перехватчик – все тот же шаровой волк в вакууме. Но это не мешает нам получать удовольствие от структурного моделирования в среде SimInTech.
Модель можно взять здесь…
Подписывайтесь на канал Технолог Петухов там больше секретной информации.
А я пошел собирать модель полета на Луну.