— Слышь, Васёк, меня с работы увольняют. Говорят, робота нового взяли, который может меня полностью заменить. — Вот-те на! А что этот робот умеет делать? — Ничего… |
Из разговора двух программистов. |
Тут в Интернете распространяются слухи, что новый ChatGPT умеет писать программы не хуже иных программистов. А то и лучше. И уж точно дешевле. По этому поводу в среде рыцарей клавиатуры, бесстрашных бойцов невидимого фронта борьбы с ленью, проигрывающих сражение за сражением, начали бродить панические мысли вроде того, что скоро нас всех заменят роботами, фигачащими код с завидной скоростью, непревзойдённым качеством и потрясающей оптимизацией. А нам всем придётся идти в дворники, или, того хуже, начинать работать. (Как будто дворника роботом заменить нельзя! Причём местных дворников, судя по состоянию тротуаров, может с успехом заменить даже робот из эпиграфа).
Все эти грязные инсинуации мы отметём с негодованием.
Итак, задача: тело бросают вертикально вверх с заданной скоростью с уровня моря. До какой высоты поднимется тело, с учётом сопротивления воздуха?
Если бы не последнее уточнение, задача была бы тривиальной, и любой ученик седьмого класса средней школы мог бы решить её как минимум двумя разными способами. Но сопротивление воздуха всё меняет. Решение в виде формулы, куда надо подставить данные бросаемого тела и его начальную скорость, как я это себе представляю, требует серьёзных диффуров, но нам оно неинтересно. Нам интересно всего лишь, имея начальную скорость, посчитать, на какую максимальную высоту поднимется тело, или, что то же самое, на какой высоте скорость будет равна нулю. Для этого не нужно решать диффуры, можно просто написать программу. А программно это решить немногим сложнее, чем рассчитать высоту подъёма без учёта сопротивления воздуха.
Для начала, освежим теорию. С точки зрения банальной эрудиции, сила динамического лобового сопротивления воздуха пропорциональна квадрату скорости, площади поперечного сечения тела и коэффициенту сопротивления, а также плотности воздуха:
Начнём упрощать всё, что только можно. Пусть тело будет сферическим. У сферы коэффициент сопротивления CF для малых скоростей равен 0.47, площадь поперечного сечения S рассчитывается из радиуса сферы. Плотность воздуха ρ зависит от температуры и высоты подъёма, но температуру, для простоты, будем считать постоянной, +20°C, и плотность в нижних двух километрах от уровня моря тоже можно считать постоянной (1.2047 кг/м3). В целом, получается, что сила сопротивления F зависит только от квадрата скорости, все остальные параметры постоянные:
где K = ½·CF·ρ·S, поэтому K постоянная.
Сила сопротивления, делённая на массу брошенного объекта, даёт ускорение, согласно бессмертному Второму закону Ицика нашего Ньютона: F = m·a. Если тело брошено вертикально вверх, это ускорение будет направлено вниз, вместе с ускорением свободного падения g, чтобы тормозить тело ещё сильнее.
Формула для пройденного пути, если известна скорость в каждый момент времени, это просто интеграл скорости по времени. Раз мы бросаем тело с уровня моря, начальная высота h0 равна нулю. Возвращаемся к основному вопросу: на какой высоте скорость будет равна нулю?
Дальше всё просто. Все уравнения есть, все данные есть. Возьмём dt = 0.001 секунды. В момент t0 = 0 тело швыряют вверх со скоростью v0. Через один dt тело поднимется на v0·dt, поэтому h1 = v0·dt. Рассчитаем силу сопротивления воздуха, исходя из v0, делим на массу тела m, получаем ускорение сопротивления воздуха a1:
— прибавляем ускорение свободного падения g = 9.8171, при помощи найденного ускорения рассчитываем скорость:
Все величины после минуса в этой формуле положительные, поэтому скорость v1 будет меньше v0. Когда мы сделаем такой же расчёт для скорости v2, она окажется ещё меньше. Это хорошо; значит, формула правильная, и в какой-то момент vn станет равной нулю или отрицательной. Это и будет момент наивысшего подъёма.
Зная скорость v1, легко рассчитать высоту подъёма h2:
Продолжаем расчёты. Точно так же a2 = (K/m)·v12, и тогда v2 = v1 − (a2 + g)·dt, и h3 = h2 + v2·dt. Делаем это в цикле. Вывести на экран надо hn−1, максимальную высоту подъёма прямо за миг до того, как скорость vn станет отрицательной, а тело начнёт падать.
Ну просто же, правда? По крайней мере, не слишком сложно. Написать такую программу займёт не больше времени, чем напечатать это сообщение. (Про отладку я специально не упоминаю).
А потом можно начать усложнять: зная высоту, можно было бы ещё и плотность воздуха ρ рассчитывать. Она от температуры зависит, между прочим. И бросать тело можно не только с высоты моря. И учесть тот факт, что коэффициент сопротивления CF тоже зависит от нескольких факторов, включая уже набившую оскомину плотность воздуха ρ. И на него температура тоже влияет. Потом можно сделать расчёты для движения тела, брошенного не вертикально вверх, а под углом к горизонту, когда ускорение сопротивления воздуха раскладывается на вертикальную и горизонтальную составляющие. И учесть кривизну Земли и отклонение из-за силы Кориолиса, однозначно определяемой по широте тела. И получить расстояние до точки падения брошенного тела, с отклонением вбок из-за силы Кориолиса. И другую форму тела учесть. И влияние ветра добавить (постоянный снос вбок, это вообще легко, только на разной высоте направление и сила сноса могут быть разными). В общем, много чего можно добавить. Какие-то ошибки, конечно, будут, но если они окажутся уж слишком большими, мы уменьшим величину dt. Это сильно увеличит количество шагов в цикле, но нас это устраивает, — как говорил мой учитель, объясняя принципы оптимизации программ, «Компьютер железный, пусть считает».
Когда нас устроит полученный результат, можно пойти от обратного. Зная точку, куда должно приземлиться тело, и свои нынешние координаты, пусть программа скажет, в каком направлении, под каким углом к горизонту и с какой скоростью надо бросить тело с известными параметрами, чтобы оно попало точно туда, куда нам надо. В конце концов из этой программы получится баллистический калькулятор, незаменимая программа для снайперов и артиллеристов.
Лирическое отступление: | |
---|---|
![]() Баллистический калькулятор, США, 1932 год (кликабельно). | Баллистические калькуляторы, или системы управления огнём, ![]() |
Но мы ещё не там. Мы в самой простой версии задачи: сферу с известными параметрами швыряют вертикально вверх при постоянных температуре и плотности воздуха и полном безветрии. На какую максимальную высоту поднимется брошенная сфера?
Так вот, новый СhatGPT под моим мудрым надзором возился с этой самой простой версией задачи сутки и так её и не решил, давая для одной и той же начальной скорости 375 м/с разброс результатов от 3 метров до 7 километров. Можете сами попробовать, если не верите.
Программисты, вы можете выдохнуть. В дворники первыми пойдут копирайтеры, — уж что-что, а лозунги, призывы и тексты ChatGPT умеет придумывать хорошо. С другой стороны, когда нас всё-таки попрут в дворники, вакансий уже не останется…
no subject
А программистам надо готовиться сушить сухари!