Реализация некоторых численных методов
8.5 Решение обыкновенных дифференциальных уравнений
8.5.1 Методы решения задачи Коши
Среди задач, с которыми приходится иметь дело в вычислительной практике, значительную часть составляют различные задачи, сводящиеся к решению обыкновенных дифференциальных уравнений. Обычно приходится прибегать к помощи приближенных методов решения подобных задач. В случае обыкновенных дифференциальных уравнений в зависимости от того, ставятся ли дополнительные условия в одной или нескольких точках отрезка изменения независимой переменной, задачи обычно подразделяются на одноточечные (задачи с начальными условиями или задачи Коши) и многоточечные. Среди многоточечных задач наиболее часто в прикладных вопросах встречаются так называемые граничные задачи, когда дополнительные условия ставятся на концах рассматриваемого отрезка.
В дальнейшем ограничимся рассмотрением численных методов решения задачи Коши. Для простоты изложения методов решения задачи будем рассматривать случай одного обыкновенного дифференциального уравнения первого порядка.
Пусть на отрезке требуется найти решение дифференциального уравнения
( 8.6) |
Будем считать, что условия существования и единственности решения поставленной задачи Коши выполнены.
На практике найти общее либо частное решение задачи Коши удается для весьма ограниченного круга задач, поэтому приходится решать эту задачу приближенно.
Отрезок накрывается сеткой (разбивается на интервалы) чаще всего с постоянным шагом (), и по какому- то решающему правилу находится значение . Таким образом, результатом решения задачи Коши численными методами является таблица, состоящую из двух векторов: — вектора аргументов и соответствующего ему вектора значений искомой функции .
Численные методы (правила), в которых для нахождения значения функции в новой точке используется информация только об одной (предыдущей) точке, называются одношаговыми.
Численные методы (правила), в которых для нахождения значения функции в новой точке используется информация о нескольких (предыдущих) точках, называются многошаговыми.
Из общего курса обыкновенных дифференциальных уравнений широкое распространение получил аналитический метод, основанный на идее разложения в ряд решения рассматриваемой задачи Коши. Особенно часто для этих целей используется ряд Тейлора. В этом случае вычислительные правила строятся особенно просто.
Приближенное решение исходной задачи ищут в виде
( 8.7) |
Здесь , а значения находят по формулам, полученным последовательным дифференцированием заданного уравнения:
( 8.8) |
Для значений , близких к , метод рядов (8.7) при достаточно большом значении дает обычно хорошее приближение к точному решению задачи (8.6). Однако с ростом расстояния погрешность приближения искомой функции рядом возрастает по абсолютной величине (при одном и том же количестве членов ряда), и правило (8.7) становится вовсе неприемлемым, когда x выходит из области сходимости соответствующего ряда (8.7) Тейлора.
Если в выражении (8.7) ограничиться , то для вычисления новых значений нет необходимости пересчитывать значение производной, правда и точность решения будет невысока.
При использовании системы компьютерной алгебры более естественным выглядит метод последовательных приближений Пикара.
Рассмотрим интегрирование единичного дифференциального уравнения на отрезке с начальным условием . При формальном интегрировании получим:
Процедура последовательных приближений метода Пикара реализуется согласно следующей схемеВ качестве примера рассмотрим решение уравнения , при :
(%i1) rp:-y$ y0:1$ x0:0$ /*rp-правая часть уравнения */ (%i4) y1:y0+integrate(subst(y0,y,rp),x,x0,x); /* y1 - первое приближение */
(%i5) y2:y0+integrate(subst(y1,y,rp),x,x0,x); /* y2 - второе приближение */
(%i6) y3:y0+integrate(subst(y2,y,rp),x,x0,x);
(%i7) expand(%); /* Очевидное решение рассматриваемого ОДУ - экспонента y=exp(-x). В результате использование метода Пикара получаем решение в виде ряда Тейлора */
8.5.2 Метод рядов, не требующий вычисления производных правой части уравнения
Естественно поставить задачу о таком усовершенствовании приведенного выше одношагового метода, которое сохраняло бы основные его достоинства, но не было бы связано с нахождением значений производных правой части уравнения
( 8.9) |
Чтобы выполнить это условие (последнее), производные y, , входящие в правую часть уравнения (8.9), можно заменить по формулам численного дифференцирования их приближенными выражениями через значение функции и учесть, что .
8.5.2.1 Метод Эйлера
В случае приближенное равенство (8.9) не требует вычисления производных правой части уравнения и позволяет с погрешностью порядка находить значение решения этого уравнения по известному его значению . Соответствующее одношаговое правило можно записать в виде
( 8.10) |
Это правило (8.10) впервые было построено Эйлером и носит его имя. Иногда его называют также правилом ломаных или методом касательных. Метод Эйлера имеет относительно низкий порядок точности — на одном шаге. Практическая оценка погрешности приближенного решения может быть получена по правилу Рунге.
Пример реализации метода Эйлера средствами Maxima приведён в следующем примере:
(%i1) euler1(rp,fun,y0,x0,xend,h):=block([OK,_x,_y,_y1,rez], _x:x0, _y:y0, rez:[_y], OK:-1, eps:0.1e-7, while OK<0 do ( if ((_x+h>xend) or (abs(_x+h-xend)<eps)) then (h:xend-_x,_x:xend, OK:1) else (_x:_x+h), _y1:makelist(float(_y[i]+h*subst([fun[i]=_y[i],x=_x], rp[i])),i,1,length(_y)),rez:append(rez,[_y1]), _y:_y1 ), rez )$
Правые части решаемых дифференциальных уравнений передаются в функцию в списке . По умолчанию предполагается, что список имён зависимых переменных — , имя независимой переменной — . Начальные значения независимой и зависимых переменных — список и скалярная величина , граница интервала интегрирования — величина , шаг интегрирования — .
Следующий пример — обращение к функции . Приведено решение системы из трёх дифференциальных уравнений на интервале [0, 1] с шагом :
С начальными условиями , решением уравнений данной системы будут функции:
(%i2) euler1([-2*y,-5*v,3*x],[y,v,z],[1,1,0],0,1,0.1);
Проверить решение можно сравнивая графики точного решения и множества вычисленных приближенных значений. Пример последовательности команд, позволяющих выделить отдельные компоненты решения системы ОДУ и построить график точного и приближенного решения третьего уравнения системы, представлен ниже (точные решения — списки ; приближенные решения — списки список значений независимой переменной — ).
(%i3) rez:euler1([-2*y,-5*v,3*x],[y,v,z],[1,1,0],0,1.0,0.1)$ n:length(rez)$ yr:makelist(rez[k][1], k, 1, n)$ vr:makelist(rez[k][2], k, 1, n)$ zr:makelist(rez[k][3], k, 1, n)$ xg:makelist(0.1*(k-1),k,1,n)$ yf:makelist(exp(-2*xg[k]), k, 1, n)$ vf:makelist(exp(-5*xg[k]), k, 1, n)$ zf:makelist(3*xg[k]^2/2, k, 1, n)$ plot2d ([[discrete, xg,zr],[discrete, xg,zf]], [style, points, lines])$
Уменьшение шага приводит к уменьшению погрешности решения (в данном примере — шаг 0.1).