Условия и циклы
План рассказа
- Лирическое отступление: Кондрашёв, Циклы Миланковича.
- Лирическое отступление: показать на проекторе "косички" в репозитории. Где у кого почему случались конфликты.
- Циклы
- range, слайсы, важные операции со списками, zip, enumerate
- Условия
Контрольная работа
Предположим, что у нас уже описан класс Vector таким, как мы его описали на прошлой лекции, т.е, например, так:
Опишите функцию dot_product, которая получает на вход два вектора и возвращает их скалярное произведение.
- Что ответит питон на такое:
Задание
Следующая часть модели солнечной системы: собственно вся модель.
Нам нужно сделать класс Model, который будет хранить в себе список состояний всех планет. Ещё у этого класса есть параметр delta_t – шаг симуляции.
У этого класса нужно сделать метод step, который делает переход от предыдущего состояния модели к следующему – через интервал delta_t.
Создав такой класс для моделей, сделайте модель с Землёй, Луной и Солнцем из прошлого занятия, запустите симуляцию с шагом 1 час на 365 дней вперёд и убедитесь, что за это время Земля совершила примерно1 полный оборот вокруг Солнца.
Подсказки
Состояние планеты вполне можно считать синонимом понятия "объект планета".
Задействованные физические уравнения очень простые:
a = F / m – силу мы посчитали в прошлый раз, масса у нас есть; получаем ускорение.
v' = v + a * delta_t – решение уравнения движения для скорости при постоянном ускорении. (Под записью v' имеется в виду скорость в следующий момент времени, а не производная).
x' = x + v * delta_t – решение уравнения движения для положения2 при постоянной скорости.
Понятно, что в уравнениях 2 и 3 ни ускорение, ни скорость не являются постоянными, и это, собственно, и является основным источником ошибки. Тем не менее, для простых ситуаций или для достаточно маленького delta_t ошибка будет достаточно мала.3
Если мы подвинем одну планету, потом посчитаем, куда нужно двигать другую планету, потом третью – то, наверное, получится менее точная модель, чем если мы сначала посчитаем, куда нужно подвинуть каждую планету, а потом дружно их все подвинем. А на самом деле, нам достаточно прежде, чем двигать, запомнить силы притяжения, действующие между планетами.
Не стоит пытаться посчитать силу притяжения планеты к самой себе!
Упражнения
Упражнения не приближают вас к цели написания модели солнечной системы и не требуются для получения зачёта. Их можно делать сколько угодно – пока не наступит посинени^W понимание, – или не делать вовсе. Если вы их будете делать, какие-нибудь комментарии на тему того, хорошо, плохо или совсем не о том, я буду давать. Разумеется, упражнения можно делать в любом порядке; я постарался приблизительно упорядочить упражнения в порядке возрастания сложности.
Я рекоммендую сколько-нибудь упражнений всё же сделать, в начале следующего занятия будет контрольная работа с подобным заданием, и её результат будет определять, о чём я буду рассказывать дальше: о скучных алгоритмах или об интересных полезных свойствах питона.
Все упражнения совершаются в файле excercises.py, и как всегда, я настоятельно прошу почаще делать коммиты (самое редкое – после написания и отладки каждой функции), делать к коммитам содержательные комментарии и не забывать хотя бы изредка делать push'и. Сейчас всё это мелочи и не существенно, но будет очень сильно играть когда вы будете работать в команде или когда вы будете использовать репозитории для себя для хранения истории.
Ни одна из функций не должна менять входные данные, если на вход даётся изменяемый объект.
Напишите функцию odd_values(list), которая получает на вход список чисел и возвращает список, который содержит нечётные из входных чисел.
Напишите функцию revert(list), которая получает на вход список и возвращает список с теми же элементами в обратном порядке.
Напишите функцию sum_numbers(list), которая получает на вход список чисел и возвращает их сумму
Напишите функцию sum_strings(list), которая получает на вход список строк и конкатенирует их
Напишите функцию odd_indices(list), которая получает на вход список и возвращает из него только элементы с нечётными номерами (индексами)
Напишите функцию q(list), которая получает на вход список чисел (и возвращает список чисел) и выполняет следующий алгоритм:
Если на вход дан пустой список или список из одного элемента, возвращает копию этого списка. В противном случае, она берёт из списка первый элемент; собирает список из всех элементов list (кроме первого), которые меньше или равны выбранному, применяет к нему рекурсивно функцию q, и результат кладёт в переменную a; делает список из всех элементов из list, которые строго больше выбранного и применяет к нему рекурсивно функцию q, и результат кладёт в переменную b; склеивает результат из списка a, первого элемента list и списка b и то, что получилось, возвращает
- Определите, что делает эта функция.
Напишите функцию s(list), которая делает то же самое другим способом. (Хорошо бы, чтобы этот способ был лучше в каком-нибудь из аспектов: понятности, простоты, скорости работы на больших списках, объёма памяти необхоимого для работы).
В моём случае Земля ушла от своих исходных координат примерно на 1 миллион километров, что кажется приемлемо мало, учитывая, что при этом она почти сохранила своё расстояние до Солнца; точнее, она оказалась на 1 миллион километров по своей орбите не доходя до точки возврата; если симуляцию продолжить после этого ещё на 11 часов, она оказывается в трёх тысячах от точки возврата, что меньше радиуса Земли; получается, такая грубая модель дала нам ошибку примерно в 11 часов на год (1)
В физике принято называть это радиус-вектором, но у нас уже есть радиус планет, так что мы будем использовать термин положение, чтобы не запутаться. (2)
Что такое мала, что такое достаточно, и как небольшой кровью сделать ошибку ещё меньше -- это вопрос численных методов в математике, и мы обойдёмся такой грубой моделью. (3)