Дифференциальные уравнения первого порядка
С помощью команды diff рассматриваются обыкновенные ДУ.
Замечание. Для решения применяемых в физике ДУ в частных производных есть специально разработанный пакет Physics. Сведения о нем приведены в отдельной главе.
Пусть скорость распада атомов в образце равна 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). Посмотрите разницу между выражением и функцией.
Дифференциальное уравнение для тока i(t) в контуре, содержащем батарею ε, сопротивление R и индуктивность L:
(Для тока нельзя применять обозначение I(t), потому что и его нельзя применять в другом смысле.)
Решите это ДУ для тока и нарисуйте результат, если в начальный момент времени ток = 0, L = 0.001 Гн, R = 100 Ом, ε = 6 В.
Рассмотрим процесс, в котором скорость роста величины у пропорциональна степени y, например y2 или y3.
Примените Maple к этим двум случаям, решив ДУ вида:
В обоих случаях (p = 2 и p = 3) начальное условие y(0) = 1. Нарисуйте решение в достаточно большом временном интервале, чтобы увидеть «взрыв».
Рассмотрим относительно безвредное ДУ первого порядка:
при y(0) = 1.
Попросите Maple решить его и посмотрите, что случится.
Попытайтесь решить его в разделе, посвященном численному решению ДУ.
Пусть есть ДУ для y(x) и предположение о наличии более простого решения. Чтобы y(x) не решать явно, применим опцию implicit:
- eq:=diff(y(x),x)=sin(y(x))/cos(x);
Явное решение:
- dsolve(eq);
Неявное решение:
- dsolve(eq,implicit);
Учтите, что решения в виде y(x) = чему-то нет, а вместо этого есть уравнение, содержащее y(x), которое придется решать.
И иногда комбинированная опция implicit, parametric может дать красивое решение вместо жуткого:
- eq:=diff(y(x),x)^2-diff(y(x),x)+y(x);
- dsolve(eq);
- dsolve(eq,implicit,parametric);
В этом решении _Т – это параметр, изменение которого дает у и х, т. е. (неявно и параметрически) дает y(x). Попробуйте, получив решение с декларацией RootOf, применить этот метод.