Реферат на тему «Решение задач дифференциального счисления в пакетах символьной математики»
Выполнил: студент группы МДМ-115
Михайлов Павел
Введение
Многие прикладные задачи сводятся к решению обыкновенных дифференциальных уравнений (ОДУ) или их систем. Для некоторых уравнений и систем имеются формулы «точного» решения, и пакет Mathematica умеет их находить. В тех задачах, для которых символьное решение построить не удается, Mathematica может находить численное решение. В решениях она использует богатый набор специальных функций и свои интерполяционные функции, представляя решение в форме, в которой они могут быть непосредственно использованы.
Символьные решения ОДУ
Система Mathematica обладает обширными возможностями решения обыкновенных дифференциальных уравнений и их систем в символьном виде. Для этого используется функция DSolve, в алгоритме которой реализовано большинство известных на сегодняшний день аналитических методов.
Символьные решения ОДУ
При поиске решения функция DSolve полагает, что имена искомых функций и имя независимой переменной не содержат значений в рабочем пространстве системы. Если это не так, то функция DSolve выдаст сообщение об ошибке. В таком случае имена переменных и функций, используемых DSolve, следует удалить из рабочего пространства командой Remove[имя1,имя2,...]. Все последующие примеры предполагают, что это уже сделано. Если все же у вас возникнут проблемы с выполнением примеров, то обратитесь в конец пособия в раздел «Замечания о выполнении примеров», где мы кратко описываем возможные трудности, с которыми вы можете столкнуться, и способы их устранения.
Решение обыкновенных дифференциальных уравнений
Система Mathematica позволяет решать многие ОДУ в символьном виде с помощью функции DSolve. Функция имеет следующий синтаксис DSolve[уравнение,y,x]
Она определяет функцию y, считая x независимой переменной уравнения. Первый аргумент – уравнение (или список уравнений), записанное в терминах функций и ее производных (y[x], y'[x], y''[x] и т.д.), но допустимо использовать другие способы обозначения производных (например, 𝐷[𝑦[𝑥], 𝑥], 𝑦 (2) [𝑥], ∂𝑥𝑦[𝑥], ∂𝑥𝑥𝑦[𝑥] и др.). Второй аргумент – имя искомой функции. Третий аргумент – независимая переменная. Результат возвращается в виде списка правил подстановки.
Решение обыкновенных дифференциальных уравнений
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] == 𝒙 𝟐 , 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → 𝑥 3 3 + 𝐶[1]}} 3
Здесь C[1] представляет произвольную константу интегрирования.
Функция DSolve в качестве первого аргумента может принимать список уравнений, среди которых могут быть и начальные условия.
𝐃𝐒𝐨𝐥𝐯𝐞 [{𝑫[𝒚[𝒙], 𝒙] == 𝒙 𝟐 , 𝒚[𝟎] == 𝟏}, 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → 1 3 (3 + 𝑥 3 )}}
Она может также находить решение с произвольными параметрами в качестве коэффициентов.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] == 𝒂𝒚[𝒙], 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → ⅇ 𝑎𝑥𝐶[1]}}
Символьные параметры могут присутствовать в качестве коэффициентов или значений в начальных условиях.
𝐃𝐒𝐨𝐥𝐯𝐞 [{𝒚′[𝒙] == 𝒂𝒚[𝒙], 𝒚[𝒄] == 𝒃}, 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → 𝑏ⅇ −𝑎𝑐+𝑎𝑥 }}
Решение обыкновенных дифференциальных уравнений
Функция DSolve ищет решение в символьном виде и пытается вернуть решение в квадратурах. Если уравнение содержит неопределенную функцию, то в решении появляются неопределенные интегралы.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] == 𝒇[𝒙], 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → 𝐶[1] + 𝑓[𝐾[1]]ⅆ𝐾[1] 𝑥 1 }}
Решение обыкновенных дифференциальных уравнений
Здесь K[1] обозначает переменную интегрирования, а C[1] представляет произвольную константу. Если такие обозначения вас не устраивает, то можно выполнить замену/подстановку следующим образом
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] − 𝒚[𝒙] == 𝒇[𝒙], 𝒚[𝒙], 𝒙]/.{𝑲[𝟏] → 𝒕, 𝑪[𝟏] → 𝑪𝟏}
{{𝑦[𝑥] → ⅇ 𝑥 ⅇ −𝑡𝑓[𝑡] ⅆ𝑡 𝑥 1 + ⅇ 𝑥𝐶1 }}
Для ввода C1 наберите C, затем комбинацию Ctrl-_. В полученный шаблон введите индекс 1. Для возврата на нормальный уровень ввода наберите комбинацию Ctrl – пробел. Запись /. имя1-имя2 обозначает подстановку (символы /.) в предшествующее выражение вместо каждого вхождения набора символов имя1 другого набора символов имя2.
Решение обыкновенных дифференциальных уравнений
Ф ункция DSolve умеет работать с некоторыми разрывными функциями, например
𝐃𝐒𝐨𝐥𝐯𝐞 [𝑫[𝒚[𝒙],{𝒙, 𝟐}] − 𝒚[𝒙] == 𝐔𝐧𝐢𝐭𝐒𝐭𝐞𝐩[𝒙], 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → ⅇ 𝑥𝐶[1] + ⅇ −𝑥𝐶[2] + 1 2 ⅇ −𝑥 (−1 + ⅇ 𝑥 ) 2UnitStep[𝑥]}}
Здесь UnitStep – функция «единичная ступенька»
Решение обыкновенных дифференциальных уравнений
Однако с задачей Коши для ДУ с разрывными функциями Mathematica иногда не справляется
𝐃𝐒𝐨𝐥𝐯𝐞 [{𝒚′[𝒙] == 𝐔𝐧𝐢𝐭𝐒𝐭𝐞𝐩[𝒙], 𝒚[𝟏] == 𝟏}, 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → (0/. $Aborted[]) + (𝑥 − (0/. $Aborted[]))UnitStep[𝑥]}}
или справляется
𝒔 = 𝐃𝐒𝐨𝐥𝐯𝐞[{𝒚′[𝒙] + 𝐌𝐚𝐱[𝒙, 𝟏]𝒚[𝒙] == 𝟎, 𝒚[𝟎] == 𝟏}, 𝒚[𝒙], 𝒙]
Решение обыкновенных дифференциальных уравнений
Вместо имени константы интегрирования, выбираемой по-умолчанию, можно определить другой символ 𝐃𝐒𝐨𝐥𝐯𝐞[𝒚′[𝒙] == 𝒂𝒚[𝒙], 𝒚[𝒙], 𝒙,𝐆𝐞𝐧𝐞𝐫𝐚𝐭𝐞𝐝𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫𝐬 → 𝑲]
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] == 𝒂𝒚[𝒙], 𝒚[𝒙], 𝒙, 𝐃𝐒𝐨𝐥𝐯𝐞𝐂𝐨𝐧𝐬𝐭𝐚𝐧𝐭𝐬 → 𝑲] (в старых версиях) {{𝑦[𝑥] → ⅇ 𝑎𝑥𝐾[1]}}
Вместо имени константы можно использовать функции, которым в качестве аргумента будут передаваться индексы (номера) постоянных. Удобно использовать функцию Subscript[𝑎, 𝑛], которая возвращает запись вида 𝑎𝑛.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′′[𝒙] == 𝒚[𝒙], 𝒚[𝒙], 𝒙, 𝐆𝐞𝐧𝐞𝐫𝐚𝐭𝐞𝐝𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫𝐬 → (𝐒𝐮𝐛𝐬𝐜𝐫𝐢𝐩𝐭[𝑪, #]&)]
{𝑦[𝑥] → ⅇ 𝑥𝐶1 + ⅇ −𝑥𝐶2 }}
Решение обыкновенных дифференциальных уравнений
В некоторых случаях Mathematica возвращает несколько решений:
𝐃𝐒𝐨𝐥𝐯𝐞 [(𝛛𝒙𝒚[𝒙]) 𝟐 + (𝒚[𝒙]) 𝟐 == 𝟏, 𝒚[𝒙], 𝒙] (решаем уравнение 1 2 2 y y )
{{𝑦[𝑥] → −Sin[𝑥 − 𝐶[1]]},{𝑦[𝑥] → Sin[𝑥 + 𝐶[1]]}}
Заметим, что здесь потеряны два решения y x 1 (в Mathematica 9.0). Чтобы набрать выражение y[x] x вы можете набрать комбинацию Esc dt Esc. Она создает шаблон ввода ∂□□, который вы должны заполнить ∂𝑥𝑦[𝑥] . Можно также ввести комбинацию Esc pd Esc , которая создает символ , затем комбинацию Ctrl-_ (подчеркивание), затем x (появится ∂𝑥 ), затем → (клавиша управления текстовым курсором), затем введите y[x].
Решение обыкновенных дифференциальных уравнений
Однако, привычнее использовать «'» (штрих) для обозначения производных функции в ОДУ.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚[𝒙]𝒚′[𝒙] == 𝟏, 𝒚, 𝒙]
{{𝑦 → Function[{𝑥}, − 2 𝑥 + 𝐶[1]]},{𝑦 → Function[{𝑥}, 2 𝑥 + 𝐶[1]]}} DSolve может решать широкий спектр дифференциальных уравнений, и решение, обычно, получается в виде правила подстановок.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] + 𝒚[𝒙] == 𝟏, 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → 1 + ⅇ −𝑥𝐶[1]}}
Здесь второй параметр функции DSolve был y[x], а не просто y как в предыдущем примере. Допустимо использовать обе формы, однако между ними имеется различие. В последнем примере решение получается в виде правил для вычисления выражения y[x] (не функции и не ее частных значений, таких как y[0]).
Решение обыкновенных дифференциальных уравнений
Например:
𝒚 [𝒙] + 𝟐𝒚′[𝒙] + 𝒚[𝟎]/. %
{1 + ⅇ −𝑥𝐶[1] + 𝑦[0] + 2𝑦 ′ [𝑥]}
Решение обыкновенных дифференциальных уравнений
Обратите внимание, что y[0] и y'[x] не были вычислены. Значки (символы) /. обозначают подстановку в предшествующее выражение результата последнего вычисления (знак %).
Вы можете попросить DSolve определить функцию y (а не выражение y[x]) и она вернет правило для вычисления функции y.
𝐃𝐒𝐨𝐥𝐯𝐞 [𝒚′[𝒙] + 𝒚[𝒙] == 𝟏, 𝒚, 𝒙]
{{𝑦 → Function[{𝑥},1 + ⅇ −𝑥𝐶[1]]}}
В некоторых старых версиях результат будет возвращен в виде {{y-(1+E -#1 C[1]&)}} Здесь символ #1 обозначает 1 – й аргумент будущей функции, а знак амперсанда ( & ) постфиксное определение функции. Напомним, что формальные параметры при определении функции обозначаются # (или #1, #2 и т.д.), само имя функции обозначается #0, ## используется для обозначения всего списка аргументов, ##n обозначает списка аргументов начиная с n-того.
Решение обыкновенных дифференциальных уравнений
Если мы хотим построить график решения, то список правил подстановки надо преобразовать в выражение, которое следует передать функции Plot.
Это делается следующим образом
𝐝𝐬 = 𝐃𝐒𝐨𝐥𝐯𝐞[{𝒚′[𝒙] == −𝒙 𝟑𝒚[𝒙], 𝒚[𝟎] == 𝟏}, 𝒚[𝒙], 𝒙]
{{𝑦[𝑥] → ⅇ − 𝑥 4 4 }}
𝐏𝐥𝐨𝐭 [𝒚[𝒙]/. 𝐝𝐬,{𝒙, −𝟑, 𝟑}, 𝐏𝐥𝐨𝐭𝐒𝐭𝐲𝐥𝐞− 𝐓𝐡𝐢𝐜𝐤𝐧𝐞𝐬𝐬[𝟎. 𝟎𝟏]]
Решение обыкновенных дифференциальных уравнений
Можно построить график решений при разлчных значениях постоянной, вместо того, чтобы использовать параметр в начальных условиях.
𝐝𝐬 = 𝐃𝐒𝐨𝐥𝐯𝐞 𝒚 ′ 𝒙 == −𝒙 𝟑𝒚 𝒙 , 𝒚 𝒙 , 𝒙 ;
𝐭𝐚𝐛 = 𝐓𝐚𝐛𝐥𝐞[𝒚[𝒙]/. 𝐝𝐬[[𝟏]]/.{𝑪[𝟏] → 𝒌},{𝒌, −𝟒, 𝟒, 𝟏}]𝐏𝐥𝐨𝐭[𝐄𝐯𝐚𝐥𝐮𝐚𝐭𝐞[𝐭𝐚𝐛],{𝒙, −𝟑, 𝟑}, 𝐏𝐥𝐨𝐭𝐒𝐭𝐲𝐥𝐞 → {𝐓𝐡𝐢𝐜𝐤𝐧𝐞𝐬𝐬[𝟎. 𝟎𝟏]}]
Решение обыкновенных дифференциальных уравнений
Спасибо за внимание