Вычисление времени сжатия пружины под воздействием упавшего груза
Наконец, переменной TextReg в качестве значения присваиваем последовательность из трех описанных выше текстовых полей. Таким образом, весь выводимый текст запоминается в этой переменной.
Далее в процедуре используется процедура display() из пакета plots, которая отображает перечисленные в первом ее аргументе (этот аргумент может быть списком, множеством или массивом) графические структуры.
Совет
С процедурой display() допускается использовать опцию insequence, которая может иметь значение true или false (последнее является значением по умолчанию). Если insequence=false, то отображаются сразу все графические объекты. Чтобы отображать эти объекты в той очередности, в которой они указаны (это относится в первую очередь к спискам), следует указать insequence=true. Это, кстати, один из методов создания анимации.
Первой в списке отображаемых структур является пружина (spring(H+4*s*1/100,L,t)). Два последних параметра этой процедуры особых комментариев не требуют. Первый, как известно, определяет границу по высоте.
При ее выборе имели место следующие соображения. Во-первых, в задаче предполагается, что шарик точечный, т.е. его размеры при решении задачи во внимание не принимались. В целях наглядности, на рисунке размеры шарика будут существенными. Чтобы не вносить поправки на размер шарика в полученном уже решении, будем полагать, что шарик "сосредоточен" в самой его нижней точке. Далее радиус шарика примем равным толщине пружины. Следовательно, нижняя точка шарика первоначально находится на высоте Н, центр шарика – на высоте H+s*1/100, а верхняя точка – на высоте B+2*s*1/100. Сверху над шариком оставляем пространство толщиной с его диаметр. Отсюда имеем для верхней границы значение H+4*s*1/100.
На заметку
В данном случае имя глобальной переменной (высота в условии задачи Н) совпадает с именем локальной, объявленной в процедуре Sys_display(), переменной. По большому счету, поскольку и объявленная локальная, и такая же глобальная переменные обозначают одну и ту же величину, ничего страшного нет. Но даже если бы локальная и глобальная переменные обозначали разные величины, Maple корректно разграничивает область их использования: в теле процедуры используется локальная переменная, вне процедуры – глобальная. Мало того, даже если не объявить переменную как локальную, Maple введет сообщение о том, что в процедуре неявно задана локальная переменная, и именно так ее и будет интерпретировать.
После пружины отображается шарик. Окружность в Maple может быть нормирована процедурой circle () из пакета plottools. Первым параметром процедуры указывается точка (центр окружности), а вторым – радиус. Однако в данном случае шарик неплохо было бы закрасить. Поэтому создаем последовательность окружностей: у них совпадают центры и последовательно изменяются радиусы. Последовательность формируется процедурой seq(), где первый параметр– команда создания окружности ('plottools/circle'O) с центром в точке [x0,h(t)+s*1/100] (зависимость h(t) определяет динамику нижней точки шарика, а значит, центр находится на высоте h(t)+s*1/100) и радиусом K05*s*l*1/100, а индексная переменная принимает значения в диапазоне i=1..20. Таким образом, радиус шарика (т.е. внешний, самый большой радиус) равен, как следовало ожидать, s*1/100. Кроме того, одна из опций процедуры circled отвечает за желто-коричневый цвет шарика (color=TAN).
Совет
Можно поэкспериментировать с количеством внутренних окружностей, т.е. изменить диапазон изменения переменной i (при этом нужно изменить коэффициент 0.05 на 1/Nmax, где Nmax – верхняя граница диапазона изменения i). В этом случае можно наблюдать достаточно интересные визуальные эффекты. Еще один способ – задать для разных окружностей разный цвет, т.е. сделать цвет зависимым от индекса i.
Чтобы шарику было о что удариться, изобразим горизонтальную поверхность, f ограничивающую верхний конец пружины. Это будет обычная линия (процедура 'plottools/line'(). Параметрами процедуры указываются начальная ([х0-8*1/100,Xmin+L(t)]) и конечная ([x0+s*1/100,Xmin+L(t)]) точки. Обе точки имеют одинаковую координату по высоте, которая равна длине пружины в момент времени t, отсчитанной от координаты нижней точки пружины, т.е. Xmin+L(t).
Горизонтальные координаты выбраны так, чтобы поверхность-подложка размещалась симметрично относительно оси пружины, а ширина подложки совпадала с диаметром шарика. Толщина отображаемой линии установлена опцией thickness=3, а сама линия изображена красным цветом (color=RED).
Наконец, последним отображаемым объектом является текстовое поле (на самом деле их три!) TextReg с данными о моменте времени, высоте шарика и его скорости.
Опция axes=FRAME устанавливает тип рамки рисунка (точка пересечения координатных осей в левом нижнем углу рисунка), а опция scaling=constrained задает масштаб, при котором единицы измерения по разным осям координат совпадают, иначе шарик будет похож на эллипс.
Внимание!
Как отмечалось выше, отображаемые процедурой display() объекты могут быть организованы в виде списка (массива) или множества. В данном случае это список (то есть последовательность отображаемых объектов заключена в квадратные скобки). При этом объекты отображаются именно в той последовательности, в какой они указаны. Это важно, поскольку процедурой spring () определяется ряд глобальных переменных! Эта процедура должна выполняться первой, т.е. первой должна отображаться пружина. Оформлять графические объекты в виде множества настоятельно не рекомендуется, поскольку элементы множества перебираются, в принципе, в произвольном порядке. Это может стать причиной серьезных недоразумений.