Maple для студентов физиков. Часть 1. Учебное пособие
.pdf
Глава 8. Обыкновенные дифференциальные уравнения
Начнем с ДУ закона Ньютона:
>restart:
>E2:=diff(y(t),t$2) = -g;
>S2:=dsolve({E2,y(0)=y[0],D(y)(0)=v[0]},y(t));
Это очевидный результат.
Заметьте несколько деталей того, как это сделано. Для ввода начальных условий для производной от y применяйте D(y), что означает dy/dt (D – это общий символ производной для Maple), затем прикрепите (0), чтобы сказать, что производная вычислена при t = 0. Да, конечно, это означает, что diff и D – это производная, но между ними есть тонкое различие, которое надо понимать. Оно обсуждено в разделе о производных в Главе 5 (diff и D). Поэтому или запоминайте синтаксис команды dsolve (выше) или запомните, где его легко найти.
Второе знаменитое ДУ второго порядка – для гармонического осциллятора.
> E3:=diff(y(t),t$2)=-omega^2*y(t);
Maple решает его в общем виде с произвольными константами
> dsolve(E3,y(t));
Предупреждение: эта форма решения опасна, поскольку нет гарантии, что при каждом запуске рабочего листа с такой командой dsolve на выходе получится _C1 с синусом и _C2 с косинусом. В Maple есть собственная логика того, как делается такой выбор, но в даже в более сложных ДУ, чем это, она кажется вполне случайной. Поэтому не давайте Maple делать этот выбор. Примените такую форму решения: скопируйте мышкой решение в новую строку и выберите свои неизвестные коэффициенты, например, избавьтесь от неудобного y(t) = и замените его естественным присвоением:
> ysol:= A*sin(omega*t)+B*cos(omega*t);
Любой расчет направленный на определение A и B каждый раз будет теперь работать одинаково, потому что вы навсегда установили, что A – с синусом, а B – с косинусом.
161
Maple для студентов физиков
Если константы определяются начальными условиями, есть форма команды dsolve, которая будет определять их автоматически. Например, пусть вам нужно решить ДУ E3 с начальными условиями y(0) = 1 и dy/dt(0) = 2. Тогда пишем:
> s:=dsolve({E3,y(0)=1,D(y)(0)=2},y(t));
Теперь пусть Maple даст нам выражение для y(t), применив assign
> assign(s);
Теперь построим график решения
> plot(y(t),t=0..20);
Не работает.
Рамка есть, но нет функции. И нет догадок, что не так. Для отладки задачи надо бы подставить несколько значений t в y(t). Но вспомним, что y(t) выглядит как выражение, но не совсем им является и что подстановка значений для t запустит его. Поэтому рассмотрим y(t) с этой точки зрения и прикинем, можно ли увидеть что не так:
> y(t);
Команда plot даст численные значения t, но ведь ω просто включено в выражение и не имеет численного значения. Это и есть ошибка: мы не задали численные значения ω!
Теперь сделаем так
> plot(subs(omega=1,y(t)),t=0..20);
Эта проблема была достаточно простой, и вы могли легко ее разрешить. Но Maple может легко решать и более сложные задачи.
Поставим в гармонический осциллятор затухание (демпфер), для чего добавим силу затухания в виде F mv , где τ – характеристиче-
ское время затухания. Новое уравнение движения теперь выглядит так:
>restart:with(DEtools):
>Eq:=diff(y(t),t$2) + diff(y(t),t)/tau + omega^2*y(t)=0;
162
Глава 8. Обыкновенные дифференциальные уравнения
и мы получаем общее решение:
> dsolve(Eq,y(t));
Выглядит впечатляюще. Но, если это осциллятор с затуханием, то где синусы и косинусы? Проблема в том, что Maple не знает как велики и . Подумаем с точки зрения физического смысла. Пусть
естественная частота – порядка 2π, тогда период |
T |
2 |
1 сек. |
|
|
||||
|
|
|
Теперь пусть осциллятор (подразумеваем – маятник) находится в моторном масле при 50 градусах ниже нуля. Тогда характеристическое время затухания 0.05 секунд (трение столь велико, что движение остановится за 0.05 сек). Интуиция должна подсказать, что если толкнуть маятник назад и освободить его, вы должны ожидать увидеть некоторое покачивание, т. е. маятник медленно проплывет к своему вертикальному положению и останется в этом положении. Посмотрим, что скажет Maple:
>omega:=2*Pi;tau:=.05;
>Y:=dsolve({Eq,y(0)=1,D(y)(0)=0},y(t));
>plot(rhs(Y),t=0..20);
Maple согласен с вашей интуицией.
Теперь изменим затухание и представим, что произойдет. Интуиция должна подсказать, что, если нагреть масло, или использовать вместо него WD-40 (жидкое масло), или, может быть, воздух, маятник начнет колебаться с медленным затуханием. Например, если τ = 20, то Maple дает:
>omega:=2*Pi;tau:=20;
>Y:=dsolve({Eq,y(0)=1,D(y)(0)=0},y(t));
>plot(rhs(Y),t=0..20);
Теперь он колеблется и медленно затухает. Но какое чудо сделало экспоненту в оригинальном решении синусами и косинусами?
Вспомним формулу Эйлера: e(iθ) = cos(θ) + isin(θ): при таких значениях константы в экспоненте стали комплексными, поэтому формула перешла от распада к колебаниям.
163
Maple для студентов физиков
Это поднимает вопрос о величине τ, при которой происходит переходотчистогозатуханиякзатухающимколебаниям. Посмотритеназад, на общий вид и вы увидите, что в нем есть квадратный корень в экс-
понентах (2 1)(2 1) |
1 4 2 2 . Если аргумент этих корней |
положителен, то оба фундаментальных решения в сумме есть затухающие экспоненты, и мы имеем затухание. Если аргумент под корнем – отрицательный, то результат комплексный, и экспонента комплексная, т. е. это синусы и косинусы, и мы получаем колебания. Переход между
двумя режимами – когда квадратный корень = 0, т. е. когда 1 . 2
Этот особый случай называется критическим затуханием.
Задача 7.4
ПустьMaple решитзадачуогармоническомосцилляторесзатуханиемдляслучаякритическогозатуханияприω= 1 инарисуетграфикфункции y(t) от t = 0 до t = 20 при начальных условиях y(0) = 1 и dy/dt(0) = 0. График будет выглядеть в точности как для осциллятора с затуханием, причем при полном отсутствии намеков на то, что вы находитесь точно на границе между затуханием и колебаниями. Для проверки того что вы точно на границе, увеличьте τ на 2 % и снова постройте график. Растянитеокнографикавниз, чтобыможнобыловидеть, чтоy(t) становится немного отрицательным, показывая что колебания начинаются. Чтобы это увидеть, нужны очень серьезные размеры окна.
Задача 7.5
См. вторую часть Пособия.
Задача 7.6
Примените Maple, чтобы получить общие решения ДУ второго порядка:
(a) |
x2 |
|
d2 |
|
f (x) |
|
x |
d |
|
f (x) |
|
|
x2 |
n2 |
f (x) 0 |
||
|
|
2 |
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
dx |
|
|
|
|
|
dx |
|
|
|
|
|
|
|
||
(b) |
x2 |
|
d2 |
|
f (x) |
|
x |
d |
|
f (x) |
|
|
x2 |
n2 |
f (x) 0 |
||
|
|
2 |
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
dx |
|
|
|
|
|
dx |
|
|
|
|
|
|
|
||
164
Глава 8. Обыкновенные дифференциальные уравнения
(c) |
1 x2 |
|
d2 |
f (x) |
|
2x |
d |
f (x) |
|
n |
n 1 |
|
f (x) 0 |
||
|
|
2 |
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
|||||||
|
|
dx |
|
|
|
|
dx |
|
|
|
|
|
|
||
Системы дифференциальных уравнений
Зачастую более удобно иметь дело с системой ДУ, чем с ДУ второго, третьего и более высоких порядков. Многие численные методы требуют, чтобы вы записывали ваше ДУ в виде системы ДУ первого порядка. Вот простой пример. Если мы введем ускорение dv/dt и скорость dx/dt, то уравнение гармонического осциллятора можно переписать так (система ДУ 1 порядка):
d v(t) 2 x(t) dt
d x(t) v(t) dt
Команда Maple dsolve обращается с системами вроде этой, запрашивая набор {наборы – в фигурных скобках} уравнений и начальных условий, набор функций, для которых надо получить решение и возможно дополнительные аргументы, вроде этого
>restart:
>Eq1:=diff(v(t),t)=-omega^2*x(t);Eq2:=diff(x(t),t)=v(t);
>dsolve({Eq1,Eq2,x(0)=1,v(0)=0},{x(t),v(t)});
Заметьте, что это действительно приятная форма получения ответа, потому что одновременно получаем и положение и скорость. Еще хорошо, что вам не нужно помнить систему D-обозначений для начальных условий производной. Чтобы нарисовать x(t) и v(t) надо, прежде всего, задать значение ω, а затем снова решить
> omega:=1;XV:=dsolve({Eq1,Eq2,x(0)=1,v(0)=0},{x(t),v(t)});
затем с помощью команды assign снова сделать графики, вроде этих
>assign(XV);
>plot([x(t),v(t)],t=0..20);
165
Maple для студентов физиков
Задача 7.7
См. вторую часть Пособия.
Численное решение дифференциальных уравнений
Зачастую Maple не сможет дать решение ДУ, выраженное в известных вам функциях. В этом случае вы захотите получить численное решение и, возможно, построить график решения, а также получить решение при каком-то значении переменной, например, при x = 2, и т. п.
Вы говорите Maple решить ДУ численно, применяя команду dsolve с опцией type=numeric, как показано в примере ниже. Но прежде, чем начать действия, следует предупредить, что
(1)«Численное» подразумевает, что применяются числа с плавающей точкой. Если задать Maple целые числа для начальных условий, или определения констант, то, dsolve(....type=numeric) может не сработать.
(2)Поскольку вся задача численных расчетов заключается в получении чисел, и поскольку Maple обычно не желает выдавать числа, что затрудняет выполнение полезных действий с результатом работы
Maple.
(3)Будет намного лучше, если задавать Maple ДУ 1-го порядка, а
не 2-го, 3-го...
(4)Присваивайте переменной результат выполнения dsolve, тогда вы сможете ссылаться на него впоследствии, т. е. применяйте кон-
струкцию F:=dsolve(...type=numeric).
Начнем с численного решения для гармонического осциллятора. Вначале определим уравнения для x(t) и v(t).
>restart:omega:=1.;
>Eqx:=diff(x(t),t)=v(t);Eqv:=diff(v(t),t)=-omega^2*x(t);
затем определим начальные условия:
> IC:=x(0)=1.,v(0)=0.;
и в конце, для получения численного решения вызовем dsolve с численной опцией,
> XV:=dsolve({Eqx,Eqv,IC},{x(t),v(t)},type=numeric);
166
Глава 8. Обыкновенные дифференциальные уравнения
Теперь XV – это процедура, которая ожидает, чтобы ей дали значение t, а она вернет приближенные решения для x(t) и v(t),
> XV(2.);
Учтите, что ответ дается с обычной точностью 18 десятичных знаков. В этом случае нам ответ известен заранее (это просто x(t) = cos(t)), поэтому его можно проверить (после увеличения числа знаков Maple остается в режиме вычислений с плавающей точкой).
> Digits:=18:cos(2.);
Очевидно, Maple врет – результат dsolve вполне точен (семь значащих цифр), но не настолько точен, как должны бы показать возвращаемые им числа.
Увеличим точность за счет более долгого решения, указав, какой численный метод следует применить.
Чтобы посмотреть справку о возможности выбора, сделайте за-
прос ?dsolve, numeric. rkf45 – это хороший выбор.
Если не подходит, выберите другой и задайте допустимую погрешность, как ниже:
>XV:=dsolve({Eqx,Eqv,IC},{x(t),v(t)},type=numeric,method=rkf45,abserr= 1e-10);
>XV(2);
Это лучше, но Maple не позволит делать это всегда. Попробуйте изменить погрешность на 1e-15 (в команде выше) и посмотрите, что получится. (Не оставляйте ее столь малой, чтобы не усложнять.)
Совет: не пытайтесь вычислять со слишком высокой точностью, например, 1 часть на 1 000 000 000 000. Обычно хороший результат получается при 5–6 значащих цифрах. Чтобы удостовериться, что примененные параметры хороши для решаемой вами задачи, выполните численный расчет дважды с разной погрешно-
стью.
Maple создал процедуру XV, которая решает ДУ численно. Теперь нам нужно построить график решения. Здесь есть одна неработающая деталь: нельзя использовать assign(XV), как делалось в символьных вычислениях. Простейший способ решения проблемы – применить
167
Maple для студентов физиков
команду odeplots, которая ожидает, чтобы ей задали результат, полу-
ченный из команды dsolve(....type=numeric).
Напоминаю: чтобы получить к ней доступ надо применить коман-
ду with(plots).
Прежде, чем продолжить – еще одна проблема.
В команде dsolve погрешность установлена равной 1e-10, что мало, и чтобы при запросе к odeplot найти много точек, придется долго скучать у пустого экрана. Поэтому сначала установим приемлемое значение погрешности при рисовании графика.
>XV:=dsolve({Eqx,Eqv,IC},{x(t),v(t)},type=numeric,method=rkf45,abserr= 1e-6);
Это следует использовать, чтобы нарисовать plot x(t)
> with(plots):odeplot(XV,[t,x(t)],0..20,numpoints=500,color=navy);
или чтобы нарисовать оба x(t) и v(t)
> dsolve odeplot(XV,[[t,x(t)],[t,v(t)]],0..20,numpoints=200);
или сделать так, чтобы создать фазовый график v(t) в зависимости от x(t) со временем t в качестве параметра
> odeplot(XV,[x(t),v(t)],0..20,numpoints=200);
Имейте в виду:
(1)в odeplot есть все обычные опции plot, так что можно улучшить вид графика;
(2)если у вас ошибка задается малой, а numpoints задано большим, то вам придется долго ждать, пока ваш график будет построен.
Задача 7.8
Это задача 7.3, которую Maple не смог решить символьно. Сделайте численный расчет и постройте y(x) от x = 0 до x = 20.
y sin(xy) with y(0) = 1.
x
Задача 7.9
См. вторую часть Пособия.
168
Глава 8. Обыкновенные дифференциальные уравнения
В Maple есть пакет для ДУ, который называется DEtools, в котором есть много возможностей, одна из которых визуально показывает путь решения ДУ («потоки»). Этот инструмент называется DEplot, и ниже показан пример как им пользоваться (опять осциллятор с затуханием):
d |
x(t) v(t) , |
d |
v(t) 2 x(t) gv(t), |
|
|
||
dt |
dt |
||
где – угловая частота, g – скорость затухания.
Команды ниже показывают, как включить набор связанных ДУ в команду DEplot и заставить ее показать решение как кривую в [x,v] плоскости. Эту плоскость в физике называют фазовым пространством и с ним часто имеют дело в классической механике.
Вызовем пакет DEtools
>restart:with(DEtools):
>eqx:=diff(x(t),t)=v(t);eqv:=diff(v(t),t)=-x(t)-.5*v(t);
Теперь будем численно решать ДУ с начальными условиями x(0) = 1 и v(0) = 0, запустим его на 20 сек и построим его решение в фазовом пространстве [x,v].
DEplot будет рисовать стрелки, которые показывают течение решения в этом пространстве.
Это свойство позволяет визуализировать решение при начальных условиях, отличающихся от тех, что вы выбрали.
DEplot([eqx,eqv],[x(t),v(t)],t=0..20,[[x(0)=1,v(0)=0]],x=-1..1,v=-1..1,stepsiz
e=.01,scaling=constrained,color=red,linecolor=navy);
Затратьте минуту на запрос ?DEplot чтобы изучить эту команду и действие каждого ее члена.
Затем увеличьте скорость затухания и посмотрите, как изменяется предыдущая картинка. И в конце замените член затухания с gv на gv v (затухание в воздухе) и посмотрите, как изменится картинка. Объясните эти изменения.
169
Maple для студентов физиков
Стрельба
Задача 7.10
Иногда не надо решать ДУ с известными значениям начальных условий. Это может быть неизвестный параметр в ДУ, значение которого определяется из решения ДУ в другой точке. Или надо отталкиваться только от начальных условий и затем подгонять неопределенные начальные условия до тех пор, пока решение не удовлетворит каким-то условиям в конце. Подгонка напоминает артиллерийскую пристрелку: стартуем в точке а и попадаем в мишень в точке b (методы пристрелки). Если найдено символьное решение, то это несложно сделать, но для численного решения это весьма сложно. В реальности, встроенных команд Maple может оказаться недостаточно, поэтому ниже рассказано о процедуре, показывающей пути решения задачи.
Вначале сформулируем конкретную задачу. Уравнение Шредингера (УШ) для связанных состояний частицы в потенциале гармонического осциллятора:
|
|
2 |
|
2 |
|
|
|
|
|
hbar |
|
|
|
|
|
|
|
|
x2 |
|
kx2 |
|
||||
|
|
|
|
|
|
E . |
||
|
2m |
|
2 |
|||||
|
|
|
|
|
||||
Переведем в безразмерный вид, заменив x на :
|
|
|
|
1 |
|
|
|
hbar2 |
|
|
|
||
|
|
|||||
x = a , где |
|
4 |
|
|||
a |
|
|
|
|
|
|
2m |
|
|
||||
|
|
|
|
|
||
и заменив E на собственное значение |
: |
|
|
|
||
|
2ma2E |
. |
|
|
|
|
hbar |
2 |
|
|
|
||
|
|
|
|
|
||
УШ с новыми переменными
2 2 0.2
Решение этого уравнения бывает двух типов: четные функции пои нечетные функции по . Следовательно, у нас есть два разных начальных условия при = 0:
170
