Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чечин_КомпьютМетСоврЕстеств.doc
Скачиваний:
8
Добавлен:
01.03.2025
Размер:
2.21 Mб
Скачать

4.2. Обезразмеривание задачи

В дифференциальное уравнение входит параметр . Это означает, что маятники разной длины (l) будут иметь разные периоды колебаний и что периоды одного и того же маятника на Луне, Земле и Марсе также будут различными (за счёт разных значений ускорения свободного падения g). Возникает вопрос: нужно ли нам, проводя вычислительные эксперименты, перебирать разные значения параметра ? В таких ситуациях обычно стараются уменьшить число свободных параметров в исходной математической модели за счёт соответствующего выбора единиц измерения (на этом принципе основаны методы «теории размерностей», играющие существенную роль при исследовании многих сложных задач физики (см., например [7])). В нашем случае без ограничения общности рассмотрения можно положить за счёт масштабирования временной переменной. Действительно, пусть

, (52)

где t – «старое время», – «новое время», а – некоторый, пока что неопределённый масштабный множитель. Тогда имеем

. (53)

Подставляя в выражение для второй производной в дифференциальное уравнение математического маятника, получим

. (54а)

или

(54b)

Здесь штрихом обозначено дифференцирование по новому временному аргументу , в отличие от точки, которая отвечает дифференцированию по старому аргументу t.

Поскольку – произвольный множитель, выберем его таким образом, чтобы удовлетворить условию

. (55)

В этом случае дифференциальное уравнения маятника приводится к некоторому «стандартному» виду:

(56)

а масштабный множитель , то есть

. (57)

Таким образом, в единицах измерения, ответствующих формуле (57), уравнение математического маятника приобретает простой вид и в него уже не входят величины g и l.

Из этого следует, что для каждого значения достаточно поставить лишь один вычислительный эксперимент и найти соответствующее значение периода колебаний . Таким образом, можно построить некоторую универсальную таблицу, перебирая значения с некоторым, достаточно маленьким шагом на заданном интервале, указывая тем самым для каждого значения величину периода . В результате мы получим табличное представление функции зависимости периода от начального угла отклонения (вспомним, как представлены элементарные функции в известных четырёхзначных математических таблицах Брадиса).

С помощью такой универсальной таблицы можно найти период колебаний маятника любой длины (l) на любой планете (g) при его начальном отклонении :

. (58)

Фактически, переход от исходного уравнения (51) к уравнению (56) является обезразмериванием задачи ( является безразмерным временем, поскольку [T]=с, [ ]= ).

4.3. Постановка прямого вычислительного эксперимента

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

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

Maple легко позволяет решать дифференциальные уравнения численными методами и строить их графики. Воспользуемся этой возможностью для решения задачи коши (51) при .

Для решения дифференциального уравнения в аналитической форме, построения его приближённого решения в форме степенного ряда или нахождения численного решения в пакете Maple используется один и тот же оператор (точнее, процедура – функция)

dsolve

c различными спецификациями, которые определяют, каким образом мы хотим решать данное уравнение. Для построения численного решения необходимо задать спецификацию numeric, а для построения в форме степенного ряда – series. При отсутствии же спецификации такого рода Maple пытается найти аналитическое решение (что, как уже говорилось, ему удаётся весьма редко).

При использовании оператора dsolve необходимо указать, что мы решаем, то есть задать дифференциальное уравнение или их систему и, если это необходимо, соответствующие дополнительные условия (в нашем случае – начальные). Далее указывается способ решения (построение решения в численном виде в форме степенного ряда, или в аналитического виде).

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

Напомним, что на языке Maple множество представляет собой последовательность элементов, заключённую в фигурные скобки, а список представляет собой последовательность, заключённую в квадратные скобки. В свою очередь, последовательность есть совокупность элементов, отделённых друг от друга запятыми. Напомним также, что элементы множества считаются неупорядоченными (могут задаваться в любом порядке) и все они должны быть разными (повторения исключаются). В отличие от множества, элементы списка строго упорядочены и к ним можно обращаться по номеру. Один и тот же элемент в списке может повторяться в нем на разных местах сколь угодно много раз.

Уравнения и дополнительные условия (в случае решения задачи о математическом маятнике таковыми являются начальные условия) можно задавать в операторе dsolve в явном виде – они будут элементами множества, которое является первым аргументом этого оператора. Лучше, однако, ввести отдельные переменные, которые определяют решаемое дифференциальное уравнение и переменные, задающие начальные условия. Тогда в операторе dsolve указываются просто имена этих дополнительных переменных, а не соответствующие им объекты в явном виде.

Рассмотрим простейший фрагмент программы, который решает задачу Коши (51) для математического маятника и строит на мониторе компьютера график решения

Программа 1

> restart;

> with(plots);

> phi0:=1.3;

> Eq := diff (phi(t), t$2) + sin(phi(t)) = 0;

> Nach := phi(0) = phi0, D(phi)(0) = 0;

> Resh:= dsolve({Eq,Nach},{phi(t)},numeric);

> odeplot(Resh, [t, phi(t)], [0..5], labels = [t, phi]);

Прокомментируем кратко приведённую программу.

Restart – оператор, с которого следует начинать любую программу и который осуществляет начальное восстановление (очистку памяти, отводимой Maple для хранения переменных).

Во второй строке стоит оператор, подключающий графическую библиотеку, которая, в частности, содержит необходимый нам далее оператор odeplot.

В третьей строке переменной присваивается начальное значение угла отклонения - 1.3.

В четвёртой строке программы переменной Eq присваивается дифференциальное уравнение математического маятника. Заметим, что переменная phi(t) (при выполнении программы Мaple пишет греческую букву ) указывается обязательно со своим аргументом t во всех местах, где она встречается!24 Первым аргументом оператора diff является дифференцируемая функция phi(t), а второй аргумент этого оператора определяет, по какой переменной она дифференцируется и сколько раз (после знака $).

В пятой строке переменной Nach присваивается последовательность из двух элементов. Этими элементами являются равенства phi(0)=phi0 (оно соответствует первому начальному условию = ) и D(phi)(0)=0 (оно соответствует второму начальному условию =0). Обратите внимание, что здесь использован оператор дифференцирования D (его можно было бы использовать и при задании дифференциального уравнения), а также и на несколько необычную запись аргументов этого оператора. В первых круглых скобках указано имя дифференцируемой функции, а во второй скобке – значение её аргумента, при котором вычисляется производная.25

В шестой строке программы «переменная» Resh представляет собой процедуру решения нашего дифференциального уравнения (по умолчанию используется метод Рунге-Кутты-Фельдберга). В скобках после имени оператора dsolve указаны три аргумента, отделённые друг от друга запятыми. Два первых аргумента представляют собой множества: {Eq, Nach} и {phi(t)}. Первый из этих аргументов определяет нашу задачу Коши. Он задаёт решаемое уравнение и соответствующие начальные условия (их можно задавать в любом порядке, поскольку они являются элементами множества!). Второй аргумент определяет переменную, относительно которой решается наше уравнение (в общем случае здесь может стоять набор переменных, отделённых друг от друга запятыми). Наконец, третий аргумент оператора dsolve представляет собой спецификацию, которая определяет способ решения рассматриваемой задачи Коши – мы заказываем построение численного решения.

Указание. Попробуйте убрать этот аргумент, пытаясь тем самым получить аналитическое решение.

В последней строке нашей программы стоит оператор odeplot, для построения графика решения рассматриваемого нами ОДУ. В круглых скобках после имени этого оператора указаны 4 аргумента. Первый из них (Resh) определяет процедуру решения нашей задачи Коши. Второй аргумент ([t,phi(t)]) представляет собой список из двух элементов, который указывает, что ось абсцисс соответствует переменной t, а ось ординат – функции phi(t). Третий аргумент ([0..5]) определяет интервал изменения независимой переменной t. Четвёртый аргумент обязательным не является – он просто заказывает печать меток около осей координат: символа t около оси абсцисс и символа phi около оси ординат.

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

В результате выполнения Программы 1 на экране компьютера высвечивается график функции , который соответствует периодическим колебаниям маятника.

Для определения периода колебаний , очевидно, необходимо найти расстояние от начала координат до первого нуля функции и умножить его на 4. Приближённое положение на временной оси этого нуля можно получить, если подвести к нему стрелку курсора и щёлкнуть левой клавишей мышки. В результате Maple высвечивает в небольшом окошке над графиком координаты острия курсора на плоскости (t, ). В результате проделанной операции мы получим приближённое значение четверти периода колебаний маятника при фиксированном в третьей строке программы значении начального угла отклонения (угловой амплитуды маятника).

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

Проводя вышеуказанный вычислительный эксперимент для значений на интервале [0, ] с фиксированным шагом h (например, h=0.2) мы получим в табличной форме зависимость периода колебаний Т( ) от амплитуды .

Проведённый численный эксперимент полностью аналогичен физическому эксперименту: вручную задаётся начальное отклонение и с помощью соответствующего щелчка мыши (то есть также вручную) определяется соответствующее ему значение Т( ).

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

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

Рассмотрим несколько таких алгоритмов применительно к решению нашей задачи о нахождении периода математического маятника.

А. Наиболее простым в идейном смысле (но отнюдь не самым быстрым) является алгоритм половинного деления (дихотомии). Суть его заключается в следующем. Начиная с некоторого значения (например, с t=0), мы идём вдоль временной оси с некоторым фиксированным шагом h до тех пор, пока на двух последовательных шагах функция не будет иметь разные знаки, то есть до тех пор, пока не будет выполнено условие

(59)

(непрерывная функция слева и справа от своего нулевого значения должна иметь разные знаки).

Выполнение условия (59) означает, что, как говорят артиллеристы старой закалки, «цель захвачена в вилку».26 После этого начинается процедура «половинения» этой вилки. Для этого переходим к середине интервала - точке ( она является полусуммой концов выделенного интервала («вилки»)): . Далее находим знак функции при , то есть знак . Если этот знак совпадает со знаком , то ясно, что искомый нуль функции находится на подинтервале , а в противном случае (то есть когда знак совпадает со знаком ) – на подинтервале . И в первом и во втором случаях вилка, то есть интервал, на котором локализован искомый нуль функции , сужается в два раза.

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

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

В. Более быстрым, но на практике «более капризным», является метод касательных Ньютона. Это итерационный метод для решения уравнений вида f(t)=0, где f(t) – некоторая непрерывная и дифференцируемая функция, суть которого заключается в следующем.27 Исходя из некоторого начального приближения ( ) к корню решаемого уравнения строится касательная к графику функции f(t). Пересечение этой касательной с осью абсцисс даёт следующее приближение ( ) к искомому корню. Таким образом, метод Ньютона основан на многократном применении формулы

, (60)

которую легко получить из элементарных геометрических соображений. Здесь – предыдущее, а –последующее приближение к корню уравнения f(t)=0. В формулу (60) входит не только значение правой части уравнения для предыдущего приближения , но и значение производной функции f(t) в этой точке, т.е. .

В зависимости от выбора начального приближения, метод Ньютона может не только сходиться, но и расходиться (о критериях выбора начального приближения см., например [8, 9]), что означает не последовательное приближение к корню, а удаление от него.

Задание. Напишите на языке Maple процедуру нахождения периода колебаний математического маятника с использованием метода Ньютона.

Указание. В качестве начального приближения можно взять точку t=0, а значение производной , которая входит в формулу (60) не нужно вычислять отдельно – поскольку в процессе решения дифференциального уравнения второго порядка Maple выдаёт на каждом шаге не только значение функции f(t), но и значение её производной .

С. Для решения рассматриваемой нами задачи можно воспользоваться и стандартным оператором решения уравнений solve для нахождения ближайшего к началу координат нуля функции , и чтобы применить этот оператор необходимо с помощью Maple определить функцию . Для этого можно использовать в операторе dsolve ещё одну полезную спецификацию, которая задаётся в виде равенства output=listprocedure. В результате применения этой спецификации Maple формирует для решаемого ОДУ n-ой степени список процедур (p), в который входит t, phi(t) и все производные последней функции вплоть до n-1 первого порядка включительно.

Для формирования функции, корень которой мы будем искать, можно использовать конструкцию типа f:=(t)->subs(p,phi(t)), которая выделяет из списка p переменную phi(t) и превращает её в функции f(t) (см. [8] стр. 73, 106).

Далее для решения уравнения f(t)=0 можно использовать оператор fsolve({f(t)=0}, {t}).28

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

Задание. Написать свой вариант программы нахождения периода колебаний математического маятника и построить с её помощью таблицу, в первом столбце которой заданы значения угловой амплитуды колебаний на интервале [0, ], во второй – значения соответствующих периодов Т( ), а в третьей – значения частот колебаний .

Задание. Построить графики функции для начальных углов отклонения , близких к точке верхнего положения равновесия, например, для =3.0 , 3.14 , 3.1415… Убедиться в том, что колебания маятника при больших амплитудах очень сильно отличаются от гармонических. Пронаблюдать переход от колебательного к вращательному движению маятника при за счёт накопления вычислительных ошибок применяемого численного метода. При вращательном движении возрастает по модулю, изменяясь в положительном или отрицательном направлениях с характерными «ступеньками». Эти ступеньки соответствуют нахождению маятника вблизи верхнего положения равновесия, когда скорость его движения является достаточно малой величиной (ступеньки почти параллельны временной оси).