Обыкновенные дифференциальные уравнения

Дифференциальные уравнения – это язык физики

Версия для печати

Дифференциальные уравнения первого порядка

С помощью команды diff рассматриваются обыкновенные ДУ.

Замечание. Для решения применяемых в физике ДУ в частных производных есть специально разработанный пакет Physics. Сведения о нем приведены в отдельной главе.

Задача 7.1 о радиоактивном распаде

Пусть скорость распада атомов в образце равна g (размерность 1/с), тогда уравнение для определения числа остающихся в нем радиоактивных атомов:

  • restart;
  • E1:=diff(N(t),t)=-g*N(t);

Добавим начальное условие: в момент времени t = 0 в образце было N0 радиоактивных атомов. Задача: найти функцию N(t).

Maple решает эту задачу с помощью команды dsolve.

  • dsolve(E1,N(t));

Как и ожидалось, решением является спадающая экспонента. Поскольку начальные условия еще не заданы, то вначале будет неизвестная константа. Ее значение найти несложно: при t = 0 экспонента = 1, поэтому константа _C1 = N0. Но dsolve может учитывать начальные условия и сделает эту небольшую работу сама. Для этого замените первый аргумент dsolve набором, который содержит E1 и начальное условие, как показано ниже (см. запрос ?dsolve,initial_conditions):

  • dsolve({E1,N(0)=No},N(t));

Теперь получим график этого решения. Для этого зададим Maple значения N0 и g:

  • No:= 5;g:=3;

но затем сделаем не вполне обычное действие: возьмем правую часть из полученного dsolve решения и передадим в график. Для этого напишем:
plot(

затем остановимся, применим мышь для выделения выражения в правой части написанного выше N(t) = ... и вставим его в команду. Но все же это неудобно, лучше воспользуемся возможностью доступа к найденному решению. Один из способов – присвоить решение переменной:

  • S1:=dsolve({E1,N(0)=No},N(t));

Теперь на решение можно сослаться по имени S1, а также можно сослаться на само решение с помощью rhs(S1). Делается это так:

  • plot(rhs(S1),t=0..3);

Заметьте, что команда rhs берет правую часть уравнения. Легко догадаться, что делает команда lhs.

Другой способ – нарисовать результаты. Для этого нужна переменная с именем N(t), которую можно использовать как выражение в команде plot. Синтаксис: assign(S1);

  • assign(S1);

и затем можно рисовать:

  • plot(N(t),t=0..3);

Естественный вопрос: что стало с N? Посмотрите:

  • N;

в ней ничего нет.

Проблема в том, что Maple сделал что-то для него естественное, но странное для нас. Он достаточно точно получил результат для S1, т. е. N(t) = 5e–3t, и создал выражение N(t). Посмотрите на него:

  • N(t);

Имеет смысл продифференцировать его:

  • diff(N(t),t);

и решить для случая, когда он = 1:

  • solve(N(t)=1,t);

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

  • N(5);

Если попытаться дать t значение, а затем вычислить выражение N(t), ничего не получится, а N(t) разрушится:

  • t:=3;
  • evalf(N(t));
  • solve(N(t)=1,t);

Проблема в том, что символ N(t), который появился без присваивания, – это смесь выражения и функции, поэтому, если хотите, используйте assign вместо rhs. Зачастую это действие кажется естественным, но следует очень внимательно присваивать значения тому, что появится в выражении. Также учтите, что нельзя снова вернуться к dsolve с другим начальным условием, потому что N(t) разрушено. Тогда следует применить restart.

  • S1:=dsolve({E1,N(0)=3},N(t));

Это выглядит настолько неприятным, что появляются опасения в дальнейшем применении assign. Но assign создает график. С другой стороны, часто самым безопасным является использование rhs.

В дифференцировании и командах plot, solve вызов N(t), который выглядит как использование функции N, на самом деле является использованием выражения с именем N(t). Посмотрите разницу между выражением и функцией.

Задача 7.2 о вычислении тока в контуре

Дифференциальное уравнение для тока i(t) в контуре, содержащем батарею ε, сопротивление R и индуктивность L:

(Для тока нельзя применять обозначение I(t), потому что и его нельзя применять в другом смысле.)

Решите это ДУ для тока и нарисуйте результат, если в начальный момент времени ток = 0, L = 0.001 Гн, R = 100 Ом, ε = 6 В.

Задача 7.3 о взрывном росте

Рассмотрим процесс, в котором скорость роста величины у пропорциональна степени y, например y2 или y3.

Примените Maple к этим двум случаям, решив ДУ вида:

В обоих случаях (p = 2 и p = 3) начальное условие y(0) = 1. Нарисуйте решение в достаточно большом временном интервале, чтобы увидеть «взрыв».

Задача 7.4

Рассмотрим относительно безвредное ДУ первого порядка:

при y(0) = 1.

Попросите Maple решить его и посмотрите, что случится.

Попытайтесь решить его в разделе, посвященном численному решению ДУ.

Некоторые полезные опции dsolve
implicit

Пусть есть ДУ для y(x) и предположение о наличии более простого решения. Чтобы y(x) не решать явно, применим опцию implicit:

  • eq:=diff(y(x),x)=sin(y(x))/cos(x);

Явное решение:

  • dsolve(eq);

Неявное решение:

  • dsolve(eq,implicit);

Учтите, что решения в виде y(x) = чему-то нет, а вместо этого есть уравнение, содержащее y(x), которое придется решать.

parametric

И иногда комбинированная опция implicit, parametric может дать красивое решение вместо жуткого:

  • eq:=diff(y(x),x)^2-diff(y(x),x)+y(x);
  • dsolve(eq);
  • dsolve(eq,implicit,parametric);

В этом решении – это параметр, изменение которого дает у и х, т. е. (неявно и параметрически) дает y(x). Попробуйте, получив решение с декларацией RootOf, применить этот метод.