Вы находитесь на странице: 1из 21

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ

РОССИЙСКОЙ ФЕДЕРАЦИИ

ИВАНОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ


ФАКУЛЬТЕТ МАТЕМАТИКИИ КОМПЬЮТЕРНЫХ НАУК

КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ И КОМПЬЮТЕРНЫХ НАУК

КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ


МАТЕМАТИЧЕСКАЯ ЛОГИКА И ТЕОРИЯ АЛГОРИТМОВ

Методы численного решения задачи Коши для ОДУ первого порядка

Направление подготовки: 02.03.02 Фундаментальная информатика


и информационные технологии

Курсовую работу выполнил: студент 3 курса очной формы обучения

_______ Ле Вьет Хоанг

Курсовую работу проверил: доцент

_______ Андрей Владимирович Гурьянов

Дата сдачи, оценка

Иваново, 2019
Оглавление

Терминология ............................................................................................................4

1. Задача Коши для ОДУ (постановка задачи) ........................................................5

2. Методы решения задачи Коши для ОДУ первого порядка ................................8

2.1. Численные методы решения задачи Коши для ОДУ первого порядка. .......9

2.1.1 Метод Эйлера. .......................................................................................... 10

2.1.2. Метод Эйлера-Коши. .............................................................................. 13

2.1.3. Метод Рунге-Кутты. ................................................................................ 16

Заключение .............................................................................................................. 20

Список литературы ................................................................................................. 21


Введение

Дифференциальные уравнения имеют огромное прикладное значение. Это не


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

3
Терминология
Дифференциальное уравнение (ДУ) – это уравнение, содержащее производные
функции y(х), саму функцию, независимые переменные и иные параметры в
различных комбинациях.

Существует множество видов дифференциальных уравнений: обыкновенные


дифференциальные уравнения, линейные и нелинейные, однородные и
неоднородные, дифференциальные уравнения первого и высших порядков,
дифференциальные уравнения в частных производных и так далее.

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


его в тождество. Существуют общие и частные решения ДУ.

Общим решением ДУ является общее множество решений, обращающих


уравнение в тождество. Частным решением дифференциального уравнения
называется решение, удовлетворяющее дополнительным условиям, заданным
изначально.

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


производных, входящих в него.

4
1. Задача Коши для ОДУ (постановка задачи)
К обыкновенным дифференциальным уравнениям сводится изучение
многообразных задач в математике и в различных предметных областях (в
физике, химии, биологии, медицине, технике и т.д.).

Конкретная задача может приводить к дифференциальному уравнению любого


порядка, или к системе уравнений различных порядков. Но известно, что
уравнение n-го порядка

𝑢(𝑛) (𝑡) = 𝑓(𝑡, 𝑢′, 𝑢′′, . . . , 𝑢(𝑛−1) )

при введении новых неизвестных 𝑢𝑖 (𝑡) = 𝑢(𝑖)(𝑡) можно свести к


эквивалентной системе n уравнений первого порядка

𝑢𝑖′ (𝑡) = 𝑢𝑖+1 , 𝑖 = 0, 1, . . . , 𝑛 − 2,


𝑢𝑛−1 (𝑡) = 𝑓(𝑡, 𝑢0 , 𝑢1 , . . . , 𝑢𝑛−1),

где 𝑢0 (𝑡) = 𝑢(𝑡) . Аналогично, произвольную систему дифференциальных


уравнений любого порядка можно заменить эквивалентной системой уравнений
первого порядка

𝑢𝑖′ (𝑡) = 𝑓𝑖 (𝑡, 𝑢1, 𝑢2 , . . . , 𝑢𝑛 ), 𝑖 = 1, 2, . . . , 𝑛, (1)

записывая их для краткости в векторной форме

𝑢′(𝑡) = 𝑓(𝑡, 𝑢(𝑡)), (2)

где 𝑢 и 𝑓 векторы столбцы

𝑢 = (𝑢1 , 𝑢2 , . . . , 𝑢𝑛 ), 𝑓 = (𝑓1, 𝑓2, . . . , 𝑓𝑛 ).

Известно, что система (1) имеет множество решений, которое в общем случае
зависит от 𝑛 параметров 𝑐 = (𝑐1 , 𝑐2, . . . , 𝑐𝑛 ) и может быть записано в форме

5
𝑢 = 𝑢(𝑡; 𝑐 ). Для выделения нужного решения надо наложить 𝑛
дополнительных условий на функции 𝑢𝑖 (𝑡).

Различают три типа задач для обыкновенных дифференциальных уравнений:


задачи Коши, краевые задачи и задачи на собственные значения. В случае задачи
Коши (задачи с начальными условиями) дополнительные условия имеют вид

𝑢𝑖 (𝑎) = 𝑢𝑎𝑖 , 𝑖 = 1, 2, . . . , 𝑛, (3)

т.е. заданы значения всех функций 𝑢𝑖 в одной и той же точке 𝑡 = 𝑎. Решение


при этом обычно требуется найти на некотором отрезке
𝑎 ≤ 𝑡 ≤ 𝑏 (или 𝑏 ≤ 𝑡 ≤ 𝑎),
так что точку 𝑡 = 𝑎 можно считать начальной точкой этого отрезка. Условия (3)
в векторной записи имеют вид 𝑢(𝑎) = 𝑢𝑎 . Условия (3) можно рассматривать как
задание координат начальной точки (𝑎, 𝑢𝑎1 , . . . , 𝑢𝑎𝑛 ) интегральной кривой в n+1-
мерном пространстве (𝑡, 𝑢1, . . . , 𝑢𝑛 ).

Хорошо известны условия, гарантирующие существование и единственность


решения задачи Коши. Предположим, что 𝑎 = 0, все функции 𝑓𝑖 непрерывны
по всем аргументам в замкнутой области

𝐷 = { |𝑡| ≤ 𝑏, |𝑢𝑖 − 𝑢𝑎𝑖 | ≤ 𝑐, 𝑖 = 1, 2, . . . , 𝑛}.

Из непрерывности функций 𝑓𝑖 следует их ограниченность, т.е. существование


такой постоянной 𝑀 > 0 , что всюду в 𝐷 выполняются неравенства | 𝑓𝑖 | ≤
𝑀 , 𝑖 = 1, 2, . . . , 𝑛. Предположим, кроме того, что в 𝐷 функци 𝑓𝑖 удовлетворяют
условию Липшица по аргументам 𝑢1 , 𝑢2 , . . . , 𝑢𝑛 , т.е.

|𝑓𝑖 (𝑡, 𝑢1, 𝑢2 , . . . , 𝑢𝑛 ) − 𝑓𝑖 (𝑡, 𝑦1 , 𝑦2 , . . . , 𝑦𝑛 )| ≤ 𝐿(|𝑢1 − 𝑦1 | + |𝑢2 − 𝑦2 |+ . . .

+ |𝑢𝑛 − 𝑦𝑛 |)

для любых точек (𝑡, 𝑢1 , 𝑢2 , . . . , 𝑢𝑛 ) и (𝑡, 𝑦1 , 𝑦2 , . . . , 𝑦𝑛 ) области 𝐷.


6
Если выполнены эти предположения, то существует единственное решение
системы (1), определенное при |𝑡| ≤ 𝑚𝑖𝑛{𝑏, 𝑐/𝑀} и принимающее при 𝑡 = 0
заданные значения (3). Это решение непрерывно зависит от координат начальной
точки (т.е. задача корректно поставлена). Если вдобавок правые части 𝑓𝑖 имеют
непрерывные производные по всем аргументам до порядка m включительно, то
решение 𝑢(𝑡) имеет имеет 𝑚 + 1 непрерывную производную по 𝑡.

7
2. Методы решения задачи Коши для ОДУ первого порядка
Методы решения задачи Коши можно условно разбить на точные, приближенно-
аналитические и численные.

К точным относятся методы, позволяющие выразить решение через


элементарные функции, либо представить его при помощи интегралов от
элементарных функций.

Однако классы уравнений, для которых разработаны методы получения точных


решений, сравнительно узки и охватывают только малую часть возникающих на
практике задач. Например, доказано, что решение первого из уравнений

𝑢′ (𝑡) = 𝑡 2 + 𝑢2 (𝑡), 𝑢′(𝑡) = (𝑢(𝑡) − 𝑡)/(𝑢(𝑡) + 𝑡)

не выражается через элементарные функции, а общее решение второго имеет вид


0.5 𝑙𝑛(𝑡 2 + 𝑢2 ) + 𝑎𝑟𝑐𝑡𝑔(𝑢/𝑡) = 𝑐.

Однако для того, чтобы воспользоваться этой формулой и вычислить 𝑢(𝑡) при
конкретном 𝑡 , надо численно решить это трансцендентное уравнение, что
нисколько не проще, чем численно решить само дифференциальное уравнение.

К приближенно-аналитическим относятся методы, в которых решение


получается, как предел 𝑢(𝑡) некоторой последовательности функций 𝑢𝑘 (𝑡) ,
причем 𝑢𝑘 (𝑡) выражается через элементарные функции или интегралы от них.
Ограничиваясь конечным значением 𝑘, получаем приближенное выражение для
𝑢(𝑡) . Примером может служить метод разложения решения в обобщенный
степенной ряд, метод Пикара, метод малого параметра. Однако эти методы
удобны лишь в том случае, когда большую часть промежуточных выкладок
удается провести точно. Это выполнимо для сравнительно простых задач, что
сильно сужает область применения приближенно-аналитических методов.

Численные методы — это методы вычисления приближенных значений искомого


8
решения 𝑢(𝑡) на некотором заданном или генерируемом в ходе решения задачи
множестве точек 𝑡1, 𝑡2, . . . , 𝑡𝑁 , называемом сеткой узлов. Решение при этом
получается в виде таблицы.

2.1. Численные методы решения задачи Коши для ОДУ первого порядка.
Наиболее распространенным численным методом решения дифференциальных
уравнений является метод конечных разностей. Суть метода состоит в
следующем. Область непрерывного изменения аргумента (например, отрезок)
заменяется дискретном множеством точек, называемых узлами. Эти узлы
составляют разностную сетку. Искомая функция непрерывного аргумента
приближенно заменяется функцией дискретного аргумента на заданной сетке.
Эта функция называется сеточной. Исходное дифференциальное уравнение
заменяется разностным уравнением. При этом для входящих в исходное
уравнение производных используются соответствующие конечно-разностные
соотношения. Такая замена дифференциального уравнения разностным
называется его аппроксимацией на сетке (или разностной аппроксимацией).
Совокупность разностных уравнений, аппроксимирующих исходное
дифференциальное уравнение, начальные и граничные условия, называется
разностной схемой. Таким образом, решение дифференциального уравнения
сводится к отысканию значений сеточной функции.

Решение разностной задачи, в результате которого находятся значения сеточной


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

9
Под устойчивостью понимается непрерывная зависимость ее решения от
входных данных (коэффициентов уравнений, правых частей, начальных
граничных условий), т.е. малому изменению входных данных соответствует
малое изменение решения. В противном случае схема называется неустойчивой.

Разностная схема называется корректной, если она устойчива и ее решение


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

В данной работе мы будем рассматривать численные методы, которые в


настоящее время являются основным инструментом при исследовании научно-
технических задач, описываемых дифференциальными уравнениями.

В данной работе мы будем решать одно и то же уравнение


𝑦 ′ = 3𝑠𝑖𝑛2𝑦 + 𝑥, с начальным условием 𝑦(0) = 2 на отрезке [0,1] с шагом ℎ =
0.1.

2.1.1 Метод Эйлера.


Простейшим численным методом решения задачи Коши для ОДУ является метод
Эйлера. Рассмотрим уравнение
𝑦 ′ = 𝑓(𝑥, 𝑦) (1)
в окрестностях узлов 𝑥 = 𝑥𝑖 , (𝑖 = 0,1 … ) и заменим в левой части производную
𝑦 ′ правой разностью. При этом значения функции 𝑦 в узлах 𝑥𝑖 заменим
значениями сеточной функции 𝑦(𝑥𝑖 ) = 𝑦𝑖 :

𝑦𝑖+1 − 𝑦𝑖
= 𝑓 (𝑥𝑖 , 𝑦𝑖 ). (2)
ℎ𝑖

Это уравнение (2) аппроксимирует исходное уравнение (1), так как погрешность
аппроксимации определяется, как 𝑂(ℎ𝑖 ).

10
Рассмотрим равномерную сетку, с узлами, равностоящими друг от друга:

ℎ𝑖 = 𝑥𝑖+1 − 𝑥𝑖 = ℎ = 𝑐𝑜𝑛𝑠𝑡, (𝑖 = 0, 1 … )

Тогда из равенства (2) получаем

𝑦𝑖+1 = 𝑦𝑖 + ℎ𝑓 (𝑥𝑖 , 𝑦𝑖 ), (𝑖 = 0, 1 … ) (3)

Заметим, что из уравнения (2) при ℎ → 0 следует

𝑦 ′ (𝑥𝑖 ) = 𝑓(𝑥𝑖 , 𝑦(𝑥𝑖 )) = 𝑓(𝑥𝑖 , 𝑦𝑖 )

Уравнение (3) позволяет приближенно определить значение функции 𝑦 в точке


𝑥𝑖+1 при помощи разложения в ряд Тейлора с отбрасыванием членов второго и
более высоких порядков. Другими словами, приращение функции полагается
равным её дифференциалу.

Пологая 𝑖 = 0 , с помощью соотношения (3) можно определить значение


сеточной функции 𝑦 при 𝑥 = 𝑥1 , 𝑦1 :

𝑦1 = 𝑦0 + ℎ𝑓(𝑥0 , 𝑦0 )

Требуемое здесь значение 𝑦0 задано начальным условием 𝑦(𝑥0 ) = 𝑦0 .


Аналогично определяются значения сеточной функции в других узлах:

𝑦𝑛 = 𝑦𝑛−1 + ℎ𝑓 (𝑥𝑛−1 , 𝑦𝑛−1) (4)

Построенный алгоритм называется методом Эйлера. Разностная схема этого


метода представлена соотношениями (3), (4). Они имеют вид рекуррентных
формул, с помощью которых значение сеточной функции 𝑦𝑖+1 в любом узле
𝑥𝑖+1 вычисляется по её значению 𝑦𝑖 в предыдущем узле 𝑥𝑖 . В связи с этим метод
Эйлера относится к одношаговым методам.

11
Метод Эйлера на языке C++:

#include <iostream>
#include <math.h>

using namespace std;

// Искомое уравнение y' = 3sin(2y)+x


double func(double x, double y){
return 3 * sin(2 * y) + x;
}

int main(){
// Задаем концы отрезка
double a = 0, b = 1;
// Задаем шаг
double h = 0.1;
// Вычисляем количество итераций
double n = (b - a) / h;

// Создаем массив узлов и массив значений сеточной


функции
double* X = new double[(int)n+1];
double* Y = new double[(int)n+1];

// Задаем начальные значения задачи Коши


X[0] = a; Y[0] = 2;

for (int i = 1; i <= n; i++){


12
// Вычисляем узел
X[i] = a + i * h;
// Вычисляем значение сеточной функции
Y[i] = Y[i - 1] + h * func(X[i - 1], Y[i - 1]);
}
// Выводим результат
for (int i = 0; i <= n; i++)
{
cout << "X[" << i << "]= " << X[i];
cout << " Y[" << i << "]= " << Y[i] << endl;
}
delete[]X; delete[]Y;
return 0;
}
2.1.2. Метод Эйлера-Коши.
Метод Эйлера-Коши позволяет уточнить метод Эйлера. Он основан на том, что
половину шага совершается с тангенсом угла наклона касательной в предыдущей
точке, а вторую – с тангенсом угла наклона в последующей точке.

Пусть опять решаем уравнение 𝑦 ′ = 𝑓 (𝑥, 𝑦), 𝑦(𝑥0 ) = 𝑦0 Решение ищем на


отрезке [𝑥0 , 𝑥𝑛 ].

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


решению (𝑥𝑖 , 𝑦𝑖 ). Найдем средний тангенс угла наклона касательной для двух
точек (𝑥𝑖 , 𝑦𝑖 ) и (𝑥𝑖 + ℎ, 𝑦𝑖 + ℎ𝑦̃𝑖 ).

Последняя точка, есть та самая, которую в методе Эйлера мы обозначаем


(𝑥𝑖+1, 𝑦𝑖+1), но здесь эта точка будет вспомогательной.

13
Рис. 1. Графическая интерпретация метода Эйлера-Коши

Итак, сначала по методу Эйлера находится точка 𝐴 , лежащая на прямой 𝐿1 ,


тангенс угла наклона которой

𝑡𝑔𝛼1 = 𝑓 (𝑥𝑖 , 𝑦𝑖 ).

В этой точке снова вычисляется тангенс угла наклона касательной 𝐿2 :

𝑡𝑔𝛼2 = 𝑓 (𝑥𝑖 + ℎ, 𝑦𝑖 + ℎ𝑦̃𝑖 ).

Затем через точку (𝑥𝑖 , 𝑦𝑖 ) проводим прямую 𝐿, тангенс угла наклона которой
равен

(𝑡𝑔𝛼1 + 𝑡𝑔𝛼2)
.
2

Точка, в которой 𝐿 пересечется с прямой 𝑥 = 𝑥𝑖+1 и будет искомой


(𝑥𝑖+1, 𝑦𝑖+1). Таким образом 𝑦𝑖+1 искомое приближение значения функции на
данном шаге интегрирования.

Следовательно, расчетные формулы метода Эйлера-Коши следующие:

14

𝑥𝑖+1 = 𝑥𝑖 + ℎ, 𝑦̃𝑖+1 = 𝑦𝑖 + ℎ𝑓 (𝑥𝑖 , 𝑦𝑖 ), 𝑦𝑖+1 = 𝑦𝑖 + ∗ (𝑓 (𝑥𝑖 , 𝑦𝑖 ) + 𝑓(𝑥𝑖+1, 𝑦̃𝑖+1))
2

Метод Эйлера-Коши на языке C++:

#include <iostream>
#include <math.h>

using namespace std;

// Искомое уравнение y'


double func(double x, double y){
return 3 * sin(2 * y) + x;
}

int main()
{
// Задаем концы отрезка
double a = 0, b = 1;
// Задаем шаг
double h = 0.1;
// Вычисляем количество итераций
double n = (b - a) / h;

// Создаем массив узлов и массив значений сеточной


функции
double* X = new double[(int)n+1];
double* Y = new double[(int)n+1];

// Создаем массив вспомогательных точек

15
double* Y1 = new double[(int)n+1];

// Задаем начальные значения задачи Коши


X[0] = a; Y[0] = 2;

for (int i = 1; i <= n; i++){


// Вычисляем узел
X[i] = a + i * h;
// Вычисляем значение вспомогательной точки
Y1[i] = Y[i - 1] + h * func(X[i - 1], Y[i - 1]);
// Вычисляем значение сеточной функции
Y[i] = Y[i - 1] + h * (func(X[i - 1], Y[i - 1]) +
func(X[i], Y1[i])) / 2;
}

// Выводим результат
for (int i = 0; i <= n; i++){
cout << "X[" << i << "]= " << X[i];
cout << " Y[" << i << "]= " << Y[i] << endl;
}
delete[]X; delete[]Y1; delete[]Y;
return 0;
}
2.1.3. Метод Рунге-Кутты.
Рассмотренные выше метод Эйлера и метод Эйлера-Коши являются частными
случаями методов первого и второго порядка, относящихся к классу методов
Рунге-Кутта. Эти методы применяются для вычисления значения 𝑦𝑖+1 через 𝑦𝑖 и
𝑓(𝑥, 𝑦) , определенных при некоторых специальном образом выбираемых

16
значениях 𝑥 ∈ [𝑥𝑖 , 𝑥𝑖+1 ] и 𝑦(𝑥) . На их основе могут быть построенные
разностные схемы разного порядка точности. Одним из наиболее часто
используемых методов является метод Рунге-Кутта четвертого порядка.
Алгоритм метода записывается в виде:

1
𝑦𝑖+1 = 𝑦𝑖 + (𝑘0 + 2𝑘1 + 2𝑘2 + 𝑘3 ), 𝑖 = 0,1 …
6

𝑘0 = ℎ𝑓 (𝑥𝑖 , 𝑦𝑖 ),

ℎ 𝑘0
𝑘1 = ℎ𝑓 (𝑥𝑖 + , 𝑦𝑖 + ),
2 2

ℎ 𝑘1
𝑘2 = ℎ𝑓 (𝑥𝑖 + , 𝑦𝑖 + ),
2 2

𝑘3 = ℎ𝑓 (𝑥𝑖 + ℎ, 𝑦𝑖 + 𝑘2),

Данный метод требует на каждом шаге четырехкратного вычисления правой


части 𝑓(𝑥, 𝑦) уравнения (1). Суммарная погрешность этого метода есть величина
𝑂(ℎ4 ).

Метод Рунге-Кутта требует большого объема вычислений по сравнению с


методом Эйлера, однако это окупается повышенной точностью, что дает
возможность проводить счет с большим шагом. Другими словами, для получения
результатов с одинаковой точностью в методе Эйлера потребуется значительно
меньший шаг, чем в методе Рунге-Кутта.

Метод Рунге-Кутта четвертого порядка на языке C++:

#include <iostream>
#include <math.h>

using namespace std;

17
// Искомое уравнение y'
double func(double x, double y){
return 3 * sin(2 * y) + x;
}

int main(){
// Задаем концы отрезка
double a = 0, b = 1;
// Задаем шаг
double h = 0.1;
// Вычисляем количество итераций
double n = (b - a) / h;

// Создаем массив узлов и массив значений сеточной


функции
double* X = new double[(int)n+1];
double* Y = new double[(int)n+1];

// Создаем массивы для стадий метода Рунге-Кутты


double* K0 = new double[(int)n+1];
double* K1 = new double[(int)n+1];
double* K2 = new double[(int)n+1];
double* K3 = new double[(int)n+1];

// Задаем начальные значения задачи Коши


X[0] = a; Y[0] = 2;

for (int i = 1; i <= n; i++)

18
{
// Вычисляем узел
X[i] = a + i * h;
// Вычисляем значения стадий
K0[i] = h * func(X[i - 1], Y[i - 1]);
K1[i] = h * func(X[i - 1] + h / 2, Y[i - 1] + K0[i]
/ 2);
K2[i] = h * func(X[i - 1] + h / 2, Y[i - 1] + K1[i]
/ 2);
K3[i] = h * func(X[i - 1] + h, Y[i - 1] + K2[i]);
// Вычисляем значение сеточной функции
Y[i] = Y[i - 1] + ((K0[i] + 2 * K1[i] + 2 * K2[i]
+ K3[i]) / 6);
}
// Выводим результат
for (int i = 0; i <= n; i++){
cout << "X[" << i << "]= " << X[i];
cout << " Y[" << i << "]= " << Y[i] << endl;
}

delete[]X; delete[]Y;
delete[]K0; delete[]K1; delete[]K2; delete[]K3;
return 0;
}

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

20
Список литературы
1. Бабенко К. И. Основы численного анализа. — М.: Наука. 1986.

2. Бахвалов Н. С., Жидков Н. П., Кобельков Г. М. Численные методы. — М.:


Лаборатория Базовых Знаний, 2001.

3. Денисов А.М., Разгулин А.В. Обыкновенные дифференциальные


уравнения. Часть 1. Москва. 2009 г.

21