MathCAD — это просто! Часть 21. Продолжаем борьбу с дифференциальными уравнениями

Итак, в прошлый раз, если вы помните, мы с вами поговорили об аналитическом решении дифференциальных уравнений. Процесс это, как мы убедились, совершенно несложный, однако имеющий один существенный и неоспоримый минус — совсем не факт, что мы сможем аналитически получить решение дифференциального уравнения даже тогда, когда наверняка знаем, что оно существует.

Мы с вами уже говорили когда-то о символьном процессоре MathCAD, и я рассказывал вам, что он, мягко говоря, далеко не всемогущ, и уж точно не настолько всемогущ, чтобы решать абсолютно все, что ему подсунет пользователь. В общем-то, причина этого вполне понятна: решение многих математических задач требует творческого подхода — откровенно говоря, лишь в очень малом числе задач оно лежит достаточно близко к поверхности, чтобы его сходу мог найти математический процессор MathCAD'а. Хотя алгоритмы, лежащие в его основе, чрезвычайно сложны (в отличие, кстати, от тех, на которых построены численные способы решения), они вовсе не безупречны и даже близко не приближают компьютер по мыслительным и аналитическим способностям к человеку. Когда речь идет о дифференциальных уравнениях, все сказанное не просто верно, а верно в квадрате. Дифференциальные уравнения сами по себе довольно сложны и коварны, и потому не зря, как я говорил в прошлый раз, вызывают трепет у студентов, имеющих "удовольствие" их изучать. Конечно, существуют выработанные многими поколениями математиков способы решения основных типов дифференциальных уравнений, однако в реальных задачах (особенно физических и технических) иногда возникают уравнения, которые сложно решить с помощью классических формул. И символьный процессор MathCAD'а тоже опускает руки. Как быть в этом случае? Сдаться и признать такое уравнение нерешаемым? Думаю, вряд ли это такая уж хорошая идея. Гораздо эффективнее вооружиться тем инструментом, который придуман специально для решения того, что невозможно решить аналитически — численными методами. Изначально MathCAD проектировался и создавался именно как средство численного решения математических задач, а потому это удается ему особенно хорошо. Решать дифференциальные уравнения в этой мощной математической среде численно ничуть не сложнее, чем аналитически, и сейчас вы сможете в этом воочию убедиться.

Небольшое отступление

Чтобы лучше понимать суть численного решения дифференциальных уравнений, стоит сначала напомнить, что именно представляют собой решения дифференциальных уравнений. Для простоты остановимся на простейшем (простите за тавтологию, но здесь она неизбежна) случае — обыкновенном дифференциальном уравнении с одной переменной первого порядка (т.е. только с первыми производными). Давайте вспомним, что именно мы ищем, решая дифференциальное уравнение? Ищем мы некоторую функцию, которая будет удовлетворять данному уравнению — то есть при подстановке в него превращать его в тождество (верное числовое равенство). Такая функция может существовать, а может и нет. Будем считать, что она существует — ведь в противном случае получается, что дифференциальное уравнение, которое мы пытаемся решить, на самом-то деле нерешаемо. Как мы помним, любое дифференциальное уравнение должно включать в себя хоть одну производную искомой величины — иначе оно не будет дифференциальным, и решать его нужно будет с помощью методов, применяемых к обычным уравнениям. Но, поскольку уравнение содержит производные — значит, его решение верно с точностью до константы. То есть, вообще говоря, решений бесконечное множество, и каждое отличается от другого каким-то постоянным членом. Ведь при дифференцировании любая постоянная обращается в ноль, и, значит, решение с любой константой будет верным.

Если интерпретировать геометрически решения дифференциального уравнения, мы получим семейство кривых, проходящих через все точки плоскости. Для того, чтобы выделить из этих всех кривых какую-то одну, на уравнение накладывают дополнительные ограничения. Формулироваться эти ограничения могут либо в виде задачи Коши, либо в виде граничной задачи. Задача Коши определяет заданную кривую с помощью задания значений самой искомой функции и ее производных (для уравнений высших порядков) в какой-то определенной точке. Граничная же задача формулируется как задание значений функции на границах искомого отрезка. Физическая интерпретация этих двух ограничений такова: задача Коши определяет решение временной задачи, задавая значения переменных в начальный момент времени. Граничная же задача (она также часто называется краевой) нужна для решения пространственных задач: она определяет начальные значения переменных в рамках какой-то пространственной области. Решение этих двух типов задач численно в MathCAD'е отличается, и вы сами сможете убедиться в том, что отличия эти порой довольно-таки существенны. Поэтому мы пойдем, как водится, от простого к сложному и начнем решение дифференциальных уравнений с рассмотрения задачи Коши.

Задача Коши для обыкновенных дифференциальных уравнений

Давайте посмотрим, как можно решать задачу Коши для обыкновенного дифференциального уравнения. В качестве уравнения возьмем простое до ужаса dX(t)/dt + X(t) = 0. Думаю, вы сможете сразу сказать, что за выражение будет решением данного уравнения. Конечно же, это экспонента с показателем минус t. Тем не менее, для того, чтобы удостовериться, что MathCAD правильно решает дифференциальные уравнения численными методами, мы подсунем это простейшее уравнение ему и посмотрим, как он с ним справится. Для того, чтобы показать MathCAD'у, где начинается условие нашей задачи Коши, мы должны воспользоваться ключевым словом MathCAD'а — Given (обязательно писать его с большой буквы, поскольку, как вы помните, среда MathCAD чувствительна к регистру букв в именах переменных, функций и ключевых слов). После того, как записано это слово, мы должны записать начальные условие. Поскольку у нас уравнение первого порядка, то оно у нас будет всего одно — например, можно написать X(0) = 1. Далее (то есть под начальным условием) мы должны записать само дифференциальное уравнение, решением которого мы нагрузим MathCAD. Ну, а для поиска решений мы применим функцию Odesolve. У функции этой предусмотрено два (в нашем случае) параметра. Первый — это имя переменной, по которой будет проводиться интегрирование уравнения (в нашем случае, сами понимаете, выбирать, собственно говоря, не из чего — это будет t), а второй параметр — конечное значение интегрирования, задающее верхнюю границу того интервала, для которого MathCAD будет искать решение нашего уравнения. Собственно, после функции Odesolve уже можно ничего и не писать — если уравнение имеет решения, то оно обязательно будет решено.

Не писать-то, конечно, можно, только это не лучший вариант. Как проверить решение уравнения? Исходя из того, что у нас сейчас простейший одномерный случай, проще всего построить график этого решения. По нему отлично видно, что MathCAD самым что ни на есть замечательным образом справился с поставленной перед ним задачей и решил уравнение именно так, как оно и должно решаться: перед нами — не что иное, как график экспоненциальной функции с отрицательным показателем.

Здесь, правда, возможны некоторые накладки. Совсем недавно мы с вами, если помните, говорили об использовании комплексных чисел в MathCAD'е. При решении дифференциальных уравнений MathCAD также по умолчанию оперирует именно комплексными числами, и это отнюдь не случайно: ведь комплексные решения получаются в дифференциальных уравнениях гораздо чаще, чем действительные. И если у вашего уравнения будут комплексные корни, то MathCAD не сможет построить его график, и тогда нужны будут другие способы знакомства с решением — можно будет, скажем, построить таблицу решения в определенных ключевых точках и посмотреть, какие они имеют значения.

Краевая задача для обыкновенных дифференциальных уравнений

Давайте теперь еще коротко поговорим о решении граничной задачи для обыкновенных дифференциальных уравнений. С помощью функции Odesolve, в общем-то, решать ее нужно будет точно так же, как и задачу Коши — с той только, конечно, разницей, что вместо начального условия нужно записать граничные. В качестве простой иллюстрации рассмотрим дифференциальное уравнение d2X(t)/dt2 + dX(t)/dt + X(t) = 0. Граничные условия будут такими: X(0) = 10, X(10) = 0. Конечно, теперь уже такую простую аналитическую формулу решения, как для первого уравнения, нам подобрать не удастся, однако в этом нет ничего страшного, потому что MathCAD сможет ничуть не хуже построить график решения нашего обыкновенного дифференциального уравнения.

Конечно, использование функции Odesolve — не единственный метод решения обыкновенных дифференциальных уравнений в среде MathCAD, однако он достаточно удобен в силу своей простоты. В следующий раз мы с вами, конечно, познакомимся и с другими способами их решения, которые предлагает пользователю эту мощная математическая среда, но пока что достаточно — нехорошо перегружать читателя информацией, особенно по такому сложному предмету, как дифференциальные уравнения. Пусть даже MathCAD и облегчает их решение, все равно лучше не торопиться с тем, чтобы в них въехать.

Подведем итоги

Что ж, давайте подытожим все то, о чем мы с вами успели сейчас поговорить. Как обычно, итоги будут простыми и жизнеутверждающими. Численное решение дифференциальных уравнений — гораздо более универсальный способ их решения, чем аналитическое решение, поскольку численные методы как раз и создавались для тех случаев, когда искать аналитическое решение не слишком удобно или попросту абсурдно. Правда, конечно, в результате численного решения мы не получим простую и красивую формулу (хотя, когда речь идет о дифференциальных уравнениях, весьма наивно ожидать ее получение и в результате аналитического решения). Зато мы получим хоть какой-то результат — а это, согласитесь, гораздо лучше, чем отсутствие вообще любого результата. То есть, как говорит мудрая пословица, лучше синица в руках, чем журавль в небе. Это как раз таки именно тот самый случай. Решать численно дифференциальные уравнения в MathCAD, как вы могли убедиться, совсем не сложно, однако, естественно, везде есть свои тонкости, и численные методы совсем не панацея. Немного об этом рассказано в справке самого MathCAD'а, и именно ее чтением вы можете заняться, чтобы не терять время зря в ожидании следующей статьи из серии "MathCAD — это просто".

SF, spaceflyer@tut.by


Компьютерная газета. Статья была опубликована в номере 35 за 2008 год в рубрике soft

©1997-2024 Компьютерная газета