Maple для студентов физиков. Часть 1. Учебное пособие
.pdf
Глава 8. Обыкновенные дифференциальные уравнения
|
|
|
|
|
0 0 ; |
|||||
четное: (0) = 1 и |
|
|
|
|
||||||
|
||||||||||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
0 |
1. |
||
нечетное: (0) = 0 и |
|
|
|
|
|
|||||
|
|
|||||||||
|
|
|
|
|
|
|
||||
Конкретные значения параметров не очень важны. Важнее суть решения. Поэтому ничего страшного, если начальный наклон задан = 1, а не 1e-16. В ДУ видно, что в каждое слагаемое входит , поэтому если вы нашли решение, то удвоив его, вы тоже будет иметь решение, только больше. Поскольку размер не важен, берем 1. В реальных задачах волновая функция нормируется.
Решение для волновой функции имеет физический смысл, если только она стремится к 0 при стремлении координаты к . Такое возможно только для совершенно определенных значений параметра(собственных значений). Поэтому нужна процедура, которая делает следующее:
(1)она должна уметь решать ДУ численно и
(2)она должна уметь подгонять параметр так, чтобы волновая функция была мала при больших .
Вот мепловский код, содержащий процедуру пристрелки и подстройки для решения более простой задачи, которая похожа на нашу квантовомеханическую.
ДУ: (для гармонического осциллятора)
2 |
2 |
|
|
|
|
|
||
|
|
y |
y 0 |
с y(0) = 0 и |
|
|
y (0) |
1. |
x |
2 |
x |
||||||
|
|
|
|
|
|
|
||
Мы хотим подогнать , воспользовавшись условием y(1) = 0. Сообразно этому, запустите процедуру (ниже), затем модифицируйте ее, чтобы найти значения в УШ для первых шести связанных состояний (три четных и три нечетных). Вам придется решить для себя, насколько далеко надо продолжать («протянуть») , чтобы аппроксимировать бесконечность. Не переоцените! Иногда достаточно 5–10.
Начнем заново и загрузим odeplot
> restart:with(plots):
171
Maple для студентов физиков
Определим ДУ и присвоим их deqn. Учтите, что в этом разделе кода (для правого конца) удовлетворяющий условиям стрельбы варьируемый параметр должен называться lambda.
> deqn:=diff(y(x),x$2)+lambda^2*y(x)=0;
Определим левую и правую конечные точки интервала
> a:=0;b:=1;
Определим начальные условия в начале интервала.
>bc:=y(a)=0,D(y)(a)=1;
>yright:=0;
>lambda:=2.5;
Учтите, что опция startinit=true говорит dsolve всегда стартовать
сопределенных начальных условий. При использовании fsolve важно иметь набор, чтобы найти значение параметра, который даст решение
сy(b)=yright.
>S:=dsolve({deqn,bc},y(x),type=numeric,startinit=true);
>odeplot(S,[x,y(x)],a..b);
>
>F:=proc(z)
>local a,b,deqn,bc,S;
>deqn:=diff(y(x),x$2)+z^2*y(x)=0;
>a:=0;b:=1;
>bc:=y(a)=0,D(y)(a)=1;
>if type(z,numeric) then
>S:=dsolve({deqn,bc},y(x),type=numeric,startinit=true,abserr=1e-6);
>subs(S(b),y(x))
>else
>‘F(z)’;
>end if;
>end;
теперь можно перенести F(λ) в fsolve, чтобы найти значение λ, которое удовлетворяет F(b)=yright. В разделе ниже увидите, как это сделать.
172
Глава 8. Обыкновенные дифференциальные уравнения
Установите Digits в наименьшее значение, чтобы fsolve не перетрудился, пока ищет правильный ответ, при том, что dsolve не всегда достаточно точна, чтобы удовлетворить требованию большей точности. Если вы не в процедуре, найдете правильный баланс между abserr в dsolve и поставленными здесь установками Digits, иначе fsolve будет работать бесконечно.
>Digits:=5;
>F(3.);
>lambda:=fsolve(F(z)=yright,z=3.0..3.2);
>S:=dsolve({deqn,bc},y(x),type=numeric):
>odeplot(S,[x,y(x)],a..b);
Заметьте, что теперь решение на правом конце стремится к нулю, как мы того и хотели.
Задача 7.11
См. вторую часть Пособия.
Как дифференциальное уравнение создает кривую? В физике важно интуитивно чувствовать, что означает ДУ, причем без груды формул и приемов их решения. Без этого математическая формулировка и переформулировка (уточнение модели) физических процессов будет трудна.
Рассмотрим простой пример и постараемся описать его словами:
y y.x
Поскольку x y – это наклон функции y(x), то это уравнение гово-
рит, что чем больше у, тем больше наклон функции. Рассмотрим два возможных случая.
(1) y(0) положительно. ДУ говорит, что наклон положителен, так что у возрастает. Но если у возрастает, наклон тоже растет, все больше и больше с ростом у. Поэтому не очень удивительно, что решением уравнения будет функция ex, которая становится гигантской с ростом х.
173
Maple для студентов физиков
(2) y(0) отрицательна. Теперь из ДУ следует, что наклон отрицателен, поэтому y должен будет уменьшиться, т. е. он становится все более отрицательным, чем он был при x = 0. Но чем более отрицателен y, тем наклон все отрицательнее, и т. д. Понятно, что решением будет функция –ex.
Этот качественный анализ применим к ДУ взрывного роста, о котором говорилось выше в разделе о ДУ первого порядка.
y y2 .x
Экспонента получилась в решении, когда справа была первая степень у. Это ДУ говорит, что для положительных у решение должно возрастать еще быстрее, чем в предыдущем случае, т. е. быстрее, чем для экспоненты:
>s:=dsolve({diff(y(x),x)=y(x)^2,y(0)=1},y(x));
>plot(rhs(s),x=0..1);
Задача 7.12
Теперь подумаем, что произойдет, если y(0) отрицателен. Сделайте грубые прикидки рисунков, затем проверьте свои ответы, изменяя начальные условия в примере выше.
В такую игру можно поиграть и с ДУ второго порядка. Берем ДУ простого гармонического осциллятора и описываем его словесно:
2 y y.x2
Вторая производная означает кривизну функции, положительная – выпуклость вниз, отрицательная – вверх. Если вторая производная велика по величине, то выпуклость очень узкая, а если вторая производная мала по величине, то широкая.
О чем говорит это уравнение, если стартовать с y = 1? Вторая производная отрицательна, поэтому кривизна функции «переворачивается» и направлена вниз, делая у меньше, что делает кривизну меньше, но также отрицательным, сохраняя кривизну направленной вниз, пока кривая не пересечет y = 0. Затем с отрицательным y ДУ говорит,
174
Глава 8. Обыкновенные дифференциальные уравнения
что кривизна положительна и начинает подниматься. Кривизна увеличивается ненамного, во-первых, потому что мала по величине, но в конечном счете у будет достаточно велико (у отрицательно, т. е. по модулю), затем остановится и вернется назад к y = 0. Когда достигнет, то у станет положительным, функция опять изменит кривизну и все повторится опять до достижения y = 0, и т. д. Поэтому решение будет периодическим, осциллирующим, вроде cos(x).
Задача 7.13
(1) Примените качественный анализ производных, чтобы догадаться, как выглядят решения уравнений, и затем проверьте в Maple.
2 |
|
|
|
|
|||
|
|
y y |
с y(0) =1 и |
|
|
y (0) |
0. |
x |
2 |
x |
|||||
|
|
|
|
|
|
||
(2) Примените качественный анализ производных, чтобы догадаться, как выглядят решения уравнений, и затем проверьте в Maple
(примените dsolve(....type=numeric) и odeplot). |
|
||||||||
|
2 |
2 |
|
|
|
|
|||
|
|
|
y y |
|
с y(0) =1 и |
|
|
y (0) |
0. |
|
x |
2 |
|
|
|||||
|
|
|
|
|
x |
|
|
||
(3) Примените качественный анализ производных, чтобы догадаться, как выглядят решения уравнений, и затем проверьте в Maple:
2 |
3 |
|
|
|
|
|||
|
|
y y |
|
с y(0) =1 и |
|
|
y (0) |
0. |
x |
2 |
|
x |
|||||
|
|
|
|
|
|
|
||
Задача 7.14–7.15
См. вторую часть Пособия.
Нелинейная динамика и хаос
За последние 40 лет применение компьютеров возродило старую и тяжелую задачу классической механики. Система трех связанных ДУ, с которой все началось, была придумана Эдом Лоренцом (Ed Lorentz) при попытках смоделировать погоду.
> restart;with(plots):
175
Maple для студентов физиков
>Eq1:=diff(x(t),t) = sigma*(y(t)-x(t));
>Eq2:=diff(y(t),t) = r*x(t)-y(t)-x(t)*z(t);
>Eq3:=diff(z(t),t) = x(t)*y(t)-b*z(t);
где константы , r, b можно выбрать произвольно. В большинстве случаев выбор параметров не дает ничего интересного, но Лоренц открыл, что есть диапазон выбора, для которого решения ведут себя очень странно. Если выберем:
> sigma:=10;b:=8/3;
и будем менять r от 0 до ~ 30, происходит переход от скучного ординарного поведения к странному, которое революционизировало много областей науки, в том числе физику.
Для численного решения этого набора ДУ с особым выбором r применим
>r:=10;s:=dsolve({Eq1,Eq2,Eq3,x(0)=1,y(0)=1,z(0)=1},{x(t),y(t),z(t)},type=
numeric);
Посмотрим, как выглядит решение с помощью odeplot
> odeplot(s,[[t,x(t)],[t,y(t)],[t,z(t)]],0..30,numpoints=600);
Выделим несколько минут и запустим группу для таких величин r: 10, 20, 28, 35, 45. При r выше примерно 25 колебания создают рисунок с неповторяющейся структурой (которые вы можете отсортировать, если запустите на более долгое время odeplot). Если вы возьмете чуть другие начальные условия, то получите совсем другую картинку (это знаменитый эффект бабочки). Чтобы его увидеть, возьмите r = 50 и сравните x(0)=1.0 с x(0)=1.0000001, обращая особое внимание на то, как выглядят зеленый и красный следы вблизи t = 30. Это достаточно неожиданно. Управляющие этим поведением уравнения полностью детерминированы, и достаточно просты – как может случайный выброс появиться из простой вещи? Это явно удивительно, и такое по-
ведение называется динамическим хаосом.
Другой способ. Вместо графика x(t) рисуем траекторию кривой решения [x(t),y(t),z(t)] как трехмерную кривую с помощью команды графики spacecurve. Для этого надо сделать цикл повторяющегося вызова dsolve, чтобы создать последовательность трехмерных графиков вдоль
176
Глава 8. Обыкновенные дифференциальные уравнения
траектории системы. В spacecurve передается последовательность точек вроде того, как в примере ниже:
Зададим начальные значения (x,y,z) в r0, начальное время в t1, конечное время в t2 и число точек вдоль траектории в numpoints; затем вычислим шаг по времени между двумя последовательными точками:
>r0:=[1,1,1];t1:=0;t2:=10;numpoints:=400;dt:=(t2-t1)/numpoints;
Зададим параметр системы r
>r:=50;
Шаг системы включает повторяющиеся вызовы dsolve, каждый из которых своим начальным условием имеет конечное условие предыдущего шага. Это сделано циклом for-do-end do (см. Главу 9). Учтите, что вычисления длительные и придется подождать.
>for i from 1 to numpoints do
>s:=dsolve({Eq1,Eq2,Eq3,x(0)=r0[1],y(0)=r0[2],z(0)=r0[3]},{x(t),y(t),z(t)},t
ype=numeric):
>t0:=t1+(i-1)*dt:
>tf:=t0+dt:
>sol:=s(tf-t0):
После каждого шага сохраним (x,y,z) в rf[i]
>rf[i]:=[rhs(op(2,sol)),rhs(op(3,sol)),rhs(op(4,sol))]:
Получим следующее начальное условие
>r0:=rf[i]:
Окончание цикла, возврат назад и повторное исполнение
> end do:
Поставим rf в последовательность, чтобы использовать со spacecurve
> L:=[seq(rf[i],i=1..numpoints)]:
Построим траекторию
> spacecurve(L,orientation=[45,60]);
177
Maple для студентов физиков
Можно поставить мышку и покрутить график, или можно анимировать вращение в цикле.
Мы сделаем 100 пространственных кривых, каждую с немного другим углом обзора. Затем анимируем эту последовательность, так что траектория поворачивается на экране, облегчая ее рассмотрение в 3D
>for i from 1 to 100 do
>theta :=45:phi:=i*3.6:
>p[i]:=spacecurve(L,orientation=[theta,phi]):
>od:
Нарисуем анимацию. Когда появится картинка, щелкните по ней, чтобы появились элементы управления анимацией на панели управления
> plots[display]([seq(p[i],i=1..100)],insequence=true);
Конечно, вы можете щелкнуть на одной кривой и использовать курсор для вращения фигуры как вы захотите, но лучше посмотрите на анимацию как на пространственную фигуру.
Задача 7.16
См. вторую часть Пособия.
178
Глава 9. ПРОГРАММИРОВАНИЕ: ЛОГИКА, ЦИКЛЫ, ПРОЦЕДУРЫ
Бывают случаи, когда в Maple нет команды, которая выполнит то, что вам нужно. Тогда можно написать свою программу в Maple, которая использует логику, циклы и процедуры.
Рассматриваемые в главе вопросы
Кубический β-сплайн |
Cubic b-spline |
Evalb(вычислении логических |
Evalb(evaluate Boolean) |
величин) |
|
If-then-elif-else-fi |
If-then-elif-else-fi |
Логические проверки (<,>,etc.) |
Logical tests (<,>,etc.) |
Цикл |
Loop |
Цикл, прерывание |
Loop, break out |
Цикл while |
Loop while |
Команда Op с dsolve |
Op command with dsolve |
По частям |
Piecewise |
Рисование результатов из fsolve |
Plotting results from fsolve |
Процедуры |
Procedures |
След |
Trace |
|
|
Разделы:
Логика: if-then-else-end if
Циклы: for, do, end do, while и break
Цикл суммирования:
Цикл с последовательной подстановкой Процедуры: подключение к работе циклов и логики Рисование результатов fsolve
Синтаксис и применение некоторых команд Maple
179
Maple для студентов физиков
Логика: if-then-else-end if
Основной командой логики Maple является if. Проиллюстрировать это можно так. Пусть вам нужна функция Maple f(x), которая получает значение x и возвращает -1 if x<0, 0 if x=0, и +1 if x>0.
Это записывается так:
>restart;
>f:=x-> if x<0 then -1 elif x=0 then 0 else 1 end if;
Вот тест для проверки
> f(-.5);f(0);f(.5);
Заметим, что это то же самое, что функция Maple signum. Сейчас вы увидите, что такой способ построения особых функций с помощью if-then-elif-else-end if не работает хорошо в Maple. Лучше всего применять другую конструкцию – piecewise, которая будет показана ниже.
Но сначала обсудим if-then-elseif, причем применим более сложную форму, чтобы показать, как она используется в логических выражениях.)
Операторы, определяющие функцию f, воспринимаются (почти) как чисто английские слова: elif – это «else if», а end if имеет смысл «работа окончена».
В оператор входят три элемента. Это логические команды if ...
then, elif ... then, else, и end if. Порядок записи важен.
Второй элемент – это условный оператор (оператор логической проверки). Это – вроде x < 0, и т. п. В Maple допустимы следующие логические проверки:
< |
> |
= |
<= |
>= |
<> не равно |
При получении Maple такого условия оно вычисляется как логическое выражение, т. е. как выражение, значением которого может быть true или false. Для помощи в отладке этого выражения в Maple есть команда вычисления логических (Boolean) выражений evalb. Она работает так:
> evalb(7>5);evalb(3=4);evalb(3<>4);
180
