MathCAD — это просто! Часть 23. Внутренняя кухня решения дифференциальных уравнений. Дифференциальные уравнения в частных производных
Источник: http://www.nestor.minsk.by/kg
Хотя мы с вами говорим о решении дифференциальных уравнений в среде MathCAD уже, в общем-то, довольно-таки давно, тем не менее, тема эта по- прежнему остается не до конца раскрытой. Почему? Потому, что дифференциальным уравнениям и их решению в мире посвящено гигантское количество различных научных работ и книг — пожалуй, столько их не посвящалось больше ни одному вопросу прикладного применения математики.
Дифференциальные уравнения сегодня — это, прежде всего, основа для всех физических и химических расчетов, применяемых в промышленности и науке. И потому без дифференциальных уравнений не может обойтись в рамках своей профессиональной деятельности ни один специалист технического или естественнонаучного профиля. И чем лучше мы с вами научимся решать дифференциальные уравнения с помощью MathCAD, тем легче вам будет разбираться с ними в тот момент, когда они понадобятся вам для выполнения какой-либо порученной вам работы. Разговор о дифференциальных уравнениях в MathCAD просто не может быть полным без двух вещей. Первая из них — это краткий, слишком краткий для того, чтобы быть действительно полезным, рассказ о внутренних механизмах решения дифференциальных уравнений в этой мощной математической среде, то есть об используемых MathCAD'ом алгоритмах их численного интегрирования. Увы, объем газетной статьи ограничен, и рассказывать подробно настолько, насколько хотелось бы, у меня нет возможности. Вторая же такая вещь — рассказ о решении дифференциальных уравнений в частных производных, к которым относятся практически все уравнения математической и теоретической физики. Конечно, вещи это довольно сложные, но я постараюсь сделать их понятными для каждого из читателей серии «MathCAD — это просто». Ну, а судить, насколько хорошо у меня это выйдет, уже дело ваше.
Численное интегрирование обыкновенных дифференциальных уравнений методом Рунге-Кутта четвертого порядка
Для того, чтобы понять, как именно работают алгоритмы численного решения дифференциальных уравнений, нужно вспомнить, что именно мы делаем, решая дифференциальное уравнение в MathCAD'е. Вспомнили? Правильно, мы интегрируем. Значит, мы находим первообразную некоторой функции, которую в простейшем случае можем записать как f(x,y), где y и будет решением нашего дифференциального уравнения. Для того, чтобы объяснять дальше, нужно напомнить, что же такое производная — ведь именно ею является наша функция f(x, y) по отношению к своей искомой первообразной. Производная — это предел приращения функции к пределу приращения своего аргумента (или своих аргументов, если таковых имеется больше, чем один). Однако пределы — это всего лишь математическая абстракция, какой бы хорошей и удобной она ни была. То есть мы не можем в реальном мире оперировать бесконечно малым приращением ни функции, ни ее аргументов, если хотим с их помощью вычислить саму производную. Выход из этой ситуации напрашивается самый простой и логичный — перейти от бесконечно малого приращению к малому, но все же конечному. Говорят, что дифференциальное уравнение при этом заменяется на разностное, и для его решения применяются специальные разностные методы.
Самым распространенным методом решения дифференциальных уравнений в численном виде является метод Рунге-Кутта четвертого порядка, который из-за его повсеместной распространенности обычно называют просто методом Рунге-Кутта. Этот метод разработан еще в начале XX века немецкими математиками Карлом Рунге и Мартином Вильгельмом Куттом и с тех пор, как появились первые вычислительные машины, используется для численного решения дифференциальных уравнений самым что ни на есть активным образом. В MathCAD'е метод Рунге-Кутта в его классическом виде реализован в функции rkfixed. Ограничения, накладываемые ею на решаемые с ее помощью уравнения, — это те самые ограничения, которые на них накладывает метод Рунге-Кутта. Алгоритм Рунге-Кутта итерационный, то есть для вычисления значения функции с заданной точностью нужно выполнить вычисления несколько раз, и для каждого следующего вычисления используются результаты предыдущего. Записать это в виде формул можно следующим образом:
Самая нижняя из всех формул — это исходное уравнение, которое мы решаем указанным методом, а коэффициенты k называются прогоночными коэффициентами. Как видите, для того, чтобы вычислить по этим формулам хоть одно значение y, нужно воспользоваться начальным (нулевым) значением y. То есть этот метод очень хорошо подходит для решения задачи Коши, а вот если встретится краевая задача, то здесь уже надо искать другой метод. Как можно понять из формул, h — это величина шага интегрирования. Об этой величине я рассказывал тогда, когда приоткрывал завесу тайны над «кухней» численного интегрирования в MathCAD'е, а потому останавливаться на ней повторно и рисовать графики, иллюстрирующие ее геометрическую интерпретацию, я не буду. Почему рассмотренный нами алгоритм называется алгоритмом четвертого порядка? Дело в том, что суммарная погрешность при вычислении функции по записанным выше формулам составляет величину порядка h4. При достаточно малых h это очень хорошая точность, и именно поэтому метод Рунге-Кутта получил такое широкое распространение. Конечно, рассмотренный нами метод численного решения дифференциальных уравнений не настолько универсален, насколько нам того хотелось бы, но разработчики MathCAD существенно упростили нам задачу, реализовав удобную и мощную функцию Odesolve, комбинирующую в себе возможности нескольких разных алгоритмов численного решения обыкновенных дифференциальных уравнений. Если вдруг вы решите проникнуть глубже в тайны методов численного решения дифференциальных уравнений, то делать это лучше всего с помощью соответствующих учебников, которых в библиотеках и в интернете можно найти великое множество.
Решение дифференциальных уравнений в частных производных
Что ж, давайте уже перейдем к завершающему наш разговор о дифференциальных уравнениях в MathCAD'е вопросу — решению дифференциальных уравнений в частных производных. Дифференциальным уравнением в частных производных называется уравнение относительно функции нескольких переменных (обязательно более чем одной), содержащее саму эту функцию (что, впрочем, необязательно) и ее частные производные по различным аргументам (вот это уже необходимо). Классическими уравнениями в частных производных являются уравнения математической физики — например, такие, как уравнение колебаний мембраны или даже струны; уравнение теплопроводности, описывающее перенос тепловой энергии в веществах; уравнение Шредингера, на котором построена вся квантовая механика. Решать уравнения в частных производных обычно еще сложнее, чем обыкновенные дифференциальные уравнения, однако, как вы сами сможете убедиться, это утверждение можно не считать справедливым в тех случаях, когда вам на помощь приходит такая мощная математическая среда, как MathCAD. Давайте попробуем решить с помощью MathCAD'а уже упоминавшееся буквально пару строчек назад уравнение теплопроводности, которое можно записать в следующем виде:
Решать его будем с помощью уже частично знакомого вам блока Given…Pdesolve. Он весьма схож с блоком Given...Odesolve, который мы использовали для обыкновенных дифференциальных уравнений, но имеются некоторые отличия. Так, например, производные для этого блока нужно задавать в индексной форме записи. То есть первая производная от y по x будет записана как yx. В MathCAD'е для записи производных в нижнем регистре нажмите кнопку «.» («ю» на русской клавиатуре). Вот таким образом будет выглядеть наше решение дифференциального уравнения в частных производных:
То, что стоит сразу непосредственно после Given, думаю, в каких-либо подробных прояснениях не нуждается, потому что это, собственно говоря, и есть то самое дифференциальное уравнение, которое мы с вами усиленно решаем. Сразу же следом за ним идут начальные условия по времени и граничные условия по координате — такие условия называются условиями Дирихле. Но самое важное, в общем-то, не они, а та функция, с помощью которых наш набор условий превращается в решенное дифференциальное уравнение — это функция Pdesolve. Первый ее параметр — это название функции или вектор функций, которые заданы в блоке Given. Второй и третий параметры — это один из аргументов функции и вектор из его начального и конечного значений. Здесь нужно внимательно следить за тем, чтобы эти значения в блоке Given обязательно совпадали с параметрами самой Pdesolve — в случае их взаимного несоответствия система MathCAD выдаст ошибку. Следующие два (или четыре, или шесть — все зависит от исходной функции и решаемого уравнения) параметра также обозначают аргумент и его граничные значения. Ну, а завершают список параметров функции Pdesolve количество шагов по каждой из переменных. Совсем не обязательно делать их равными для всех переменных — надо смотреть на особенности самого уравнения, а также начальных и граничных условий. Чтобы визуализировать результаты решения, можно воспользоваться нашими знаниями о построении графиков в MathCAD'е и построить трехмерный график (см. соответствующий рисунок). Вопрос на засыпку: какая из осей изображает время? Вот и проверим, насколько вы разобрались в свое время с графиками.
Конечно, для таких уравнений, где одна из переменных является временем, лучше строить не трехмерные графики, а двумерные, но анимированные. Как они делаются, я вам уже имел удовольствие рассказывать, а потому вы, безо всяких сомнений, успешно справитесь с их созданием.
Выводы
Что ж, как видите, и в глубинах MathCAD’а, в которых идет решение дифференциальных уравнений численными методами, все оказалось вовсе не так уж и сложно. Конечно, мы с вами разобрали только самый простой случай, но ведь перед нами, согласитесь, и не стоит задачи написать собственную математическую среду наподобие MathCAD, а потому мы можем позволить себе не разбираться в тонкостях реализации разных методов, а просто предоставить MathCAD'у самому разбираться с подсунутыми нами уравнениями. С дифференциальными уравнениями в частных производных тоже все оказалось не так уж сложно, потому что разработчики MathCAD постарались максимально унифицировать процесс их решения с процессом решения обыкновенных дифференциальных уравнений. Так что не нужно бояться дифференциальных уравнений, если под рукой есть MathCAD. Рано или поздно, так или иначе, но они падут под натиском этого грозного математического «оружия».