БлогNot. MathCAD: решаем дифференциальное уравнение 1 порядка

MathCAD: решаем дифференциальное уравнение 1 порядка

Как обычно, даю ссылку на теорию и несколько реализаций самых распространённых методов решения.

Итак, дано уравнение вида dy/dx=D(x,y), интервал поиска решения x∈[a,b] с начальным условием y(а)=const. Интервал будем разбивать с шагом h=(b-a)/n, где n - число значений, которые принимает дискретизованная переменная x.

Сначала определим функцию, задающую производную, начальное условие, интервал поиска решения и количество узлов сетки - эти данные понадобятся всем методам. Так как задача - учебная, добавим и определение функции точного решения:

Постановка задачи решения дифференциального уравнения
Постановка задачи решения дифференциального уравнения

Метод Эйлера легче всего запрограммировать, ведь он состоит в простейшем линейном приближении производной: из исходного уравнения, по определению производной, получаем (y[i+1]-y[i])/(x[i+1]-x[i])=D(x,y), откуда, при постоянном шаге по x, равном h=x[i+1]-x[i], имеем y[i+1]=y[i]+h*D(x,y).

Метод Эйлера в MathCAD
Метод Эйлера в MathCAD

Метод возвращает то же, что стандартная функция для решения дифференциального уравнения (см. ниже) - матрицу из 2 столбцов, первый из которых - значения x[i] в узлах сетки, а второй - вычисленные значения y[i].

Для проверки полученного решения оценим норму разности между вычисленными подпрограммой значениями y[i] и значениями, полученными функцией точного решения f(x) в тех же значениях аргумента x[i]. Также построим график.

Иллюстрация решения методом Эйлера
Иллюстрация решения методом Эйлера

Этот метод имеет первый порядок точности, о методике практической оценки порядков точности см. здесь.

Модифицированный метод Эйлера, он же метод "предиктор-корректор", он же метод Эйлера-Коши, имеет второй порядок точности и умеет уточнять решение, полученное обычным методом Эйлера, за счёт дополнительного вычисления значений D(x,y) "между" узлами сетки:

Модифицированный метод Эйлера в MathCAD
Модифицированный метод Эйлера в MathCAD

Наконец, наиболее популярный на практике метод Рунге-Кутты 4 порядка реализован в стандартной функции MathCAD, воспользуемся ей вместо "ручного" программирования:

Метод Рунге-Кутты 4 порядка в MathCAD
Метод Рунге-Кутты 4 порядка в MathCAD

Не сложнее было бы запрограммировать метод Рунге-Кутты 4 порядка и "вручную":

Метод Рунге-Кутты 4 порядка в MathCAD (программа)
Метод Рунге-Кутты 4 порядка в MathCAD (программа)

В приложенном документе видно, что все результаты совпали.

Увеличивая n, например, до 20 и 40, можно проверить, соблюдаются ли теоретические порядки точности методов.

 Скачать документ MathCAD 15 (.xmcd) в архиве .zip с этими расчётами (50 Кб)

P.S. По просьбам трудящихся: как проверить, является ли известная функция u(x) решением дифференциального уравнения dy/dx=D(x,y) ?

В нашем случае, так как функции D(x,y) и u(x) уже определены в документе, зададим и символьно оценим функцию первой производной от u(x), обозначим её, например, z(x).

Затем перепишем уравнение в виде z(x)-D(x,u(x))=0 (подставили вместо y возможное решение u(x) и перенесли D(x,y) в левую часть уравнения) и символьно оценим его оператором simplify с панели инструментов "Символика".

Если результат оценивания равен нулю, уравнение превратилось в тождество и u(x) является его решением, для "неправильной" же u(x) нуля в операторе simplify не получится.

Можно было и сразу записать производную в операторе simplify, воспользовавшись значком производной с панели инструментов "Математический анализ". Оба способа показаны на этой картинке:

Mathcad, как проверить, является ли функция решением дифференциального уравнения
Mathcad, как проверить, является ли функция решением дифференциального уравнения

17.11.2013, 21:57 [60606 просмотров]


теги: алгоритм mathcad

К этой статье пока нет комментариев, Ваш будет первым