Опубликован: 03.12.2012 | Доступ: свободный | Студентов: 1143 / 280 | Длительность: 16:43:00
Лекция 9:

Уравнения. Системы уравнений

8.4. Нахождение численных решений дифференциальных уравнений

Численные решения дифференциальных уравнений в Mathematica находятся при помощи функции NDSolve. Задаётся она также, по крайней мере, тремя аргументами: NDSolve[{eqn,initialcond},f,{t,tmin,tmax}], где eqnдифференциальное уравнение относительно функции f, аргумент которой t меняется от tmin до tmax. Третий обязательный аргумент функции NDSolve всегда задаётся списком из трёх элементов. Если быть точным, NDSolve предназначена для решения задач Коши, поскольку в первый аргумент функции в обязательном порядке входят само уравнение и начальные или граничные условия initialcond (пример In[1] на рис. 8.17).

NDSolve всегда возвращает решения в виде интерполяционных функций или InterpolationFunction-объектов (Out[1] на рис. 8.17), которые представляют собой таблицу значений функции f[t] при разных значениях t из промежутка от tmin до tmax; значения функции в точках, не содержащихся в этой таблице, могут быть найдены интерполяцией табличных данных (А. Н. Прокопеня и А. В. Чичурин [5, с. 20–21]).

Как правило, при выводе результатов интерполяционная функция принимает вид InterpolationFunction[{tmin,tmax},<>], т.е., явно указывается только диапазон определения интерполяционной функции {tmin,tmax}, а таблица значений обозначается условно символом <>. В таком виде результаты вычисления совершенно непригодны для анализа решений дифференциального уравнения или системы уравнений. Однако с интерполяционной функцией можно обращаться так же, как и с любой иной функцией в Mathematica, т.е., осуществлять с ней операции математического анализа, визуализировать и т.д., что позволяет извлечь пользу из результатов расчётов. Так в примере In[2] на рис. 8.17 мы визуализировали полученную в результате решения уравнения в In[1] зависимость.

Нахождение численных решений дифференциальных уравнений

Рис. 8.17. Нахождение численных решений дифференциальных уравнений

NDSolve ищет решения итерационным методом: вычисление начинается от значения x, соответствующего частным решениям, следующими шагами охватывается весь отрезок от tmin до tmax.

В примере In[1] на рис. 8.18 мы задали левую часть дифференциального уравнения (притом, что правая часть уравнения — 0). В In[2] мы решили дифференциальное уравнение при двух разных наборах начальных условий. В In[6] мы построили графики найденных зависимостей на одном рисунке. Как мы видим, решения отличаются друга от друга лишь фазой, которая и определяется начальными условиями.

Влияние начальных условий на численное решение дифференциальных уравнений

Рис. 8.18. Влияние начальных условий на численное решение дифференциальных уравнений

Функция NDSolve позволяет также решать системы связанных уравнений (рис. 8.19).

Нахождение численных решений систем дифференциальных уравнений

Рис. 8.19. Нахождение численных решений систем дифференциальных уравнений

Как уже было сказано выше, функция NDSolve ищет решения итерационным методом. Интервал варьирования независимых переменных разбивается на отрезки, и значение функции вычисляется в точках на концах отрезков. Размер отрезков не является постоянным в процессе вычисления, а динамически меняется с каждым шагом для поиска более точного значения функции. Однако в процессе вычислений может возникнуть следующая проблема: решение может иметь сингулярность, и в этом случае NDSolve, тщетно стараясь найти решение в сингулярной точке, от шага к шагу будет уменьшать отрезок и в конечном итоге зависнет. Для того чтобы избежать этой проблемы, количество шагов для поиска решения в Mathematica ограничивается. Для ОДУ оно по умолчанию равно 10000. Самостоятельно задать число шагов можно при помощи опции MaxSteps. На рис. 8.20 мы приводим пример In[1] такой ситуации, когда поиск решения приостанавливается самостоятельно после заданного числа шагов. Mathematica в этом случае выдаёт предупреждение, что самостоятельно остановила поиск решения на некотором шаге.

Если пользователь уверен том, что NDSolve сможет найти решение уравнения без необходимости искусственного прерывания, то число шагов можно установить бесконечным — пример In[2] на рис. 8.20.

Подробней о численном решении дифференциальных уравнений см. книги Е. М. Воробьёва [1, с. 58–64] и А. Н. Прокопени и А. В. Чичурина [5, с. 20–22].

Изменение числа итераций для нахождения решения дифференциального уравнения

Рис. 8.20. Изменение числа итераций для нахождения решения дифференциального уравнения