Решение дифференциальных уравнений первого порядка методом эйлера
Дифференциальным уравнением первого порядка называется уравнение вида F(x,y,у’)=0 или у’=f(x,y). Функция y(x), при подстановке которой уравнение обращается в тождество, называется решением дифференциального уравнения.
Рассмотрим несколько численных методов решения дифференциальных уравнений первого порядка. Описание численных методов приводится для уравнения в виде у’=f(x,y).
Рассмотрим два варианта вывода расчетных формул
Задачи с начальными условиями для систем обыкновенных дифференциальных уравнений
Рассмотрим задачу Коши для системы обыкновенных дифференциальных уравнений $$ \begin
Используя векторные обозначения, задачу (1), (2) можно записать как задачу Коши $$ \begin
Численные методы решения задачи Коши
Существует большое количество методов численного решения задачи (3), (4). Вначале рассмотрим простейший явный метод Эйлера и его программную реализацию. Затем будут представлены методы Рунге—Кутта и многошаговые методы.
При построении численных алгоритмов будем считать, что решение этой дифференциальной задачи существует, оно единственно и обладает необходимыми свойствами гладкости.
Идея численных методов решения задачи (3), (4) состоит из четырех частей:
1. Вводится расчетная сетка по переменной \( t \) (время) из \( N_t + 1 \) точки \( t_0 \), \( t_1 \), \( \ldots \), \( t_
2. Предполагаем, что дифференциальное уравнение выполнено в узлах сетки.
3. Аппроксимируем производные конечными разностями.
4. Формулируем алгоритм, который вычисляет новые значения \( \pmb
Явный метод Эйлера
Проиллюстрируем указанные шаги. Для начала введем расчетную сетку. Очень часто сетка является равномерной, т.е. имеет одинаковое расстояние между узлами \( t_n \) и \( t_
Затем, предполагаем, что уравнение выполнено в узлах сетки, т.е.: $$ \pmb^\prime (t_n) = \pmb
Заменяем производные конечными разностями. С этой целью, нам нужно знать конкретные формулы, как производные могут быть аппроксимированы конечными разностями. Простейший подход заключается в использовании определения производной: $$ \pmb^\prime(t) = \lim_ <\tau \to 0>\frac<\pmb(t+\tau) — \pmb(t)><\tau>. $$
В произвольном узле сетки \( t_n \) это определение можно переписать в виде: $$ \begin
Четвертый шаг заключается в получении численного алгоритма. Из (5) следует, что мы должны знать значение \( y^n \) для того, чтобы решить уравнение (5) относительно \( y^
При условии, что у нас известно начальное значение \( \pmb
Программная реализация явного метода Эйлера
Выражение (6) может быть как скалярным так и векторным уравнением. И в скалярном и в векторном случае на языке Python его можно реализовать следующим образом
При решении системы (векторный случай), u[n] — одномерный массив numpy длины \( m+1 \) (\( m \) — размерность задачи), а функция F должна возвращать numpy -массив размерности \( m+1 \), t[n] — значение в момент времени \( t_n \).
Таким образом численное решение на отрезке \( [0, T] \) должно быть представлено двумерным массивом, инициализируемым нулями u = np.zeros((N_t+1, m+1)) . Первый индекс соответствует временному слою, а второй компоненте вектора решения на соответствующем временном слое. Использование только одного индекса, u[n] или, что то же самое, u[n, :] , соответствует всем компонентам вектора решения.
Функция euler решения системы уравнений реализована в файле euler.py:
Строка F_ = lambda . требует пояснений. Для пользователя, решающего систему ОДУ, удобно задавать функцию правой части в виде списка компонент. Можно, конечно, требовать чтобы пользователь возвращал из функции массив numpy , но очень легко осуществлять преобразование в самой функции решателе. Чтобы быть уверенным, что результат F будет нужным массивом, который можно использовать в векторных вычислениях, мы вводим новую функцию F_ , которая вызывает пользовательскую функцию F «прогоняет» результат через функцию assaray модуля numpy .
Неявный метод Эйлера
При построении неявного метода Эйлера значение функции \( F \) берется на новом временном слое, т.е. для решении задачи (5) используется следующий метод: $$ \begin
Таким образом для нахождения приближенного значения искомой функции на новом временном слое \( t_
Для решения уравнения (8) можно использовать, например, метод Ньютона.
Программная реализация неявного метода Эйлера
Функция backward_euler решения системы уравнений реализована в файле euler.py:
Отметим, что для нахождения значения u[n+1] используется функция fsolve модуля optimize библиотеки scipy . В качестве начального приближения для решения нелинейного уравнения используется значение искомой функции с предыдущего слоя u[n] .
Методы Рунге—Кутта
Одношаговый метод Рунге—Кутта в общем виде записывается следующим образом: $$ \begin
Одним из наиболее распространенных является явный метод Рунге-Кутта четвертого порядка: $$ \begin
Многошаговые методы
В методах Рунге—Кутта в вычислениях участвуют значения приближенного решения только в двух соседних узлах \( \pmb
Различные варианты многошаговых методов (методы Адамса) решения задачи с начальными условиями для систем обыкновенных дифференциальных уравнений могут быть получены на основе использования квадратурных формул для правой части равенства $$ \begin
Для получения неявного многошагового метода используем для подынтегральной функции интерполяционную формулу по значениям функции \( \pmb
Для интерполяционного метода Адамса (15) наивысший порядок аппроксимации равен \( m+1 \).
Для построения явных многошаговых методов можно использовать процедуру экстраполяции подынтегральной функции в правой части (14). В этом случае приближение осуществляется по значениям \( \pmb
Для экстраполяционного метода Адамса (16) погрешность аппроксимации имеет \( m \)-ый порядок.
На основе методов Адамса строятся и схемы предиктор–корректор. На этапе предиктор используется явный метод Адамса, на этапе корректора — аналог неявного метода Адамса. Например, при использовании методов третьего порядка аппроксимации в соответствии с (18) для предсказания решения положим $$ \frac<\pmb
Жесткие системы ОДУ
При численном решении задачи Коши для систем обыкновенных дифференциальных уравнений (3), (4) могут возникнуть дополнительные трудности, порожденные жесткостью системы. Локальные особенности поведения решения в точке \( u = w \) передаются линейной системой $$ \begin
Пусть \( \lambda_i(t) \), \( i = 1, 2, \ldots, m \) — собственные числа матрицы $$ \begin
Для численное решения жестких задач используются вычислительные алгоритмы, которые имеют повышенный запас устойчивости. Необходимо ориентироваться на использование \( A \)-устойчивых или \( A(\alpha) \)-устойчивых методов.
Метод называется \( A \)-устойчивым, если при решении задачи Коши для системы (3) область его устойчивости содержит угол $$ \begin
Реферат: Решение дифференциальных уравнений 1 порядка методом Эйлера
Название: Решение дифференциальных уравнений 1 порядка методом Эйлера Раздел: Рефераты по информатике Тип: реферат Добавлен 10:57:58 05 марта 2011 Похожие работы Просмотров: 360 Комментариев: 24 Оценило: 2 человек Средний балл: 5 Оценка: неизвестно Скачать | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Наименование | Тип | Описание |
Входные данные | ||
Xi | double | Начальное значение (x) интервала вычисления |
Xkon | double | Конечное значение (x) интервала вычисления |
n | integer | Количество шагов |
Yi | double | Начальное значение y |
kx | double | Коэффициент при переменой x |
ky | double | Коэффициент при переменной y |
Выходные данные | ||
h | double | Фиксированное приращение аргумента (x) |
res | double | Расчётное значение уравнение y’=F(x,y) в точке (x) |
Промежуточные | ||
i | integer | Счётчик цикла |
Yprom | double | Промежуточное значение y в точке Xprom |
Xprom | double | Промежуточное значение x при h/2 |
a | double | Решение уравнения в точках f(Xprom,Yprom) |
f1 | double | Функция f(x,y) |
3.2. Блок- схема главного модуля
3.3 Описание алгоритма главной программы.
Номер блока | Описание |
1 | Ввод начального и конечного значений интервала вычисления уравнения, количество шагов, начальное значение у, а также коэффициенты при kxи ky. |
2 | Вычисление фиксированного приращения аргумента х |
3 | Цикл с шагом 1 и конечным значением не превышающим количество шагов, который высчитывает значение yна определённом интервале |
4 | Функция для расчёта уравнения вида y’=f(x,y); |
Описание | |
1 | Вычисление: функции f1 с подстановкой начальных значений; промежуточных значений Yprom и Xprom, значения aдля вычисления f(Xprom,Yprom) и расчёт результатов функции и переход на следующий шаг. |
2 | Приращение аргумента xна h |
3 | Вывод результатов уравнения и интервала |
*Реализация алгоритма на языке программирования C++ представлена в приложении .
4.Описание программного обеспечения.
4.1 Описание операционной системы
Основное требование к операционной системе (ОС), предъявляемое поставленной задачей, это наличие ANSI или POSIX совместимого компилятора языка C++.
Для реализации задачи была выбрана последняя клиентская версия операционной системы Microsoft, основанная на ядре NT – MicrosoftWindowsXPProfessional.
Указанная операционная система обладает рядом преимуществ:
· наличие достаточного количество ANSI или POSIX совместимых компиляторов языка C++, разработанных для данной ОС, а именно –
o Microsoft C++ (version 2-6)
· достаточная управляемость, надежность и безопасность;
· широкое распространение основанных на ядре NT операционных систем Microsoft, совместимых по программному обеспечению с WindowsXPProfessional (NT/2000/XP/2003 – client & server);
· высокая скорость работы приложений, разработанных для данной ОС с использованием компиляторов C++.
Исходный код программы может быть откомпилирован и под другой операционной системой, если для таковой имеется ANSI или POSIX совместимый компилятор языка C++.
Программа была протестирована на операционной системе MicrosoftWindowsXPProfessionalSP1.
· Процессор x86 Family 15 Model 2 Stepping 7 GenuineIntel
· Версия BIOS Award Software International, Inc. F4, 06.03.2003
· Аппаратно-зависимый уровень (HAL) Версия = «5.1.2600.1106 (xpsp1.020828-1920)»
· Полный объем физической памяти 256,00 МБ
· Доступно физической памяти 29,97 МБ
· Всего виртуальной памяти 873,69 МБ
· Доступно виртуальной памяти 350,04 МБ
· Файл подкачки 618,21 МБ
4.2 Описание языка программирования
Язык программирования С++
С++ — это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на лег ко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.
В С++ нет типов данных высокого уровня и нет первичных операций высокого уровня. В нем нет, например, матричного типа с операцией обращения или типа строка с операцией конкатенации. Если пользователю понадобятся подобные типы, их можно определить в самом языке. По сути дела, основное, чем занимается программирование на С++ — это определение универсальных и специально-прикладных типов. Хорошо разработанный тип, определяемый пользователем, отличается от встроенного типа только способом определения, но не способом использования.
Реализация С++ очень легко переносима. Однако есть полные основания использовать С++ в среде, где имеется гораздо более существенная поддержка. Такие средства, как динамическая загрузка, пошаговая трансляция и база данных определений типов могут с пользой применяться без воздействия на язык.
Типы и средства сокрытия данных в С++ опираются на проводимый во время компиляции анализ программ с целью предотвращения случайного искажения данных. Они не обеспечивают секретности или защиты от умышленного нарушения правил. Однако эти средства можно использовать без ограничений, что не приводит к дополнительным расходам времени на выполнение или пространства памяти.
Компилятор MicrosoftC++ и среда разработки MicrosoftVisualStudio
В качестве компилятора для разработки приложения был выбран MicrosoftC++ по следующим причинам:
· практически полная совместимость со стандартом ANSIC++;
· наличие удобной среды разработки MicrosoftVisualStudio;
· наличие отличной документации;
· высокая скорость работы результирующих приложений;
· совместимость разработанных приложений с большим количеством широко распространенных операционных систем;
· достаточная скорость компиляции.
4.3 Описание программы
Разработанное приложение поставляется в виде 2-ух файлов:
1. methodEulera.cpp – исходный код программы на языке C++;
2. methodEulera.exe – исполняемый файл.
Для выполнения исполняемого файла необходима одна из ниже перечисленных операционных систем:
· Microsoft Windows 3.11+Win32s;
· Microsoft Windows 95/98/Me;
· MicrosoftWindowsNT/2000/XP/2003 – клиентская или серверная версия.
Программа не требует предварительной установки и может быть сразу же запущена на выполнение.
Исходный код приложения может быть откомпилирован в любом ANSI или POSIX совместимом компиляторе С++ для получения выполнимой программы. Для успешной компиляции требуется наличие стандартной библиотеки «iostream».
5. Контрольный пример
Данный метод протестирован на контрольном примере и реализован с помощью языка программирования С++.
В результате вычислений контрольного примера вида y’=2 x+ y с интервалом [0,1],
количеством шагов равному 5 и начальным условием у равным 1 , с помощью программы, получились следующие результаты:
Рис. 2. Экран с результатами выполнения программы.
Как видно, при вычислении программа на первом шаге берёт начальные значения для вычисления, а на последующих берёт значения полученные с предыдущих шагов. Можно сделать вывод, что точность вычисления данного метода зависит от количества выбранных шагов: чем больше шагов, тем меньше фиксированное приращение , а следовательно она более точно вычисляет значение всего интервала.
По работе программы стало видно, что с её использованием намного упростилась работа пользователя. Пользователь просто вводит интервал на котором должен вычисляться пример, количество шагов и начальное значения и программа выдаёт уже готовое решение данного примера.
6.Анализ полученных результатов.
По результатам программы можно составить таблицу сравнения результатов полученных при использовании программы и результатов, полученных ручным способом:
Ручной способ вычисления | Программный способ вычисления | ||
Х | Y | X | Y |
0 | 0,82 | 0 | 0,82 |
0,2 | 0,75 | 0,2 | 0,7516 |
0,4 | 0,77 | 0,4 | 0,770248 |
0,6 | 0,85 | 0,6 | 0,856793 |
0,8 | 0,99 | 0,8 | 0,996299 |
Из приведенного сравнения можно сделать вывод, что один результат отличается от другого тем, что в примере, решенном программным способом ответ вычисляется с наибольшей точностью, чем при ручном способе. Это может быть связано с тем, что в ручном способе результат округляется для удобства вычисления примера.
Решение дифференциальных уравнений методом Эйлера можно также отобразить в графическом виде:
Рис.3.Графическое изображение решения примера y’=2x+y
Как видно из рис.3 графиком решения уравнения является кривая , форма которой зависит от количества разбиений интервала.
По результатам выполненной работы можно сделать вывод, что решение дифференциальных уравнений методом Эйлера является методом вычисления со средней точностью и точность вычисления данного метода зависит от количества разбиений интервала интегрирования. При сравнении результатов решенными разными способами можно сказать, что данный метод был верно реализован на языке программирования MicrosoftVisualC++. Полученные результаты сходятся с небольшой погрешностью.
1. Численные методы (анализ, алгебра, обыкновенные дифференциальные уравнения), Н.С. Бахвалов. Главная редакция физико- математической литературы изд-ва «Наука», М., 1975г.
2. Методы, теории обыкновенных дифференциальных уравнений. Н.И. Гаврилов . Государственное издательство «Высшая школа» Москва-1962г.
3. В.В.Пак., Ю.Л. Носенко. Высшая математика: Учебник.- Д.: Сталкер, 1997г.
4. Б. П. Демидович, И. А. Марон Основы вычислительной математике. – М., 1966
5. Загускин В. Л. – Справочник по численным методам решения уравнений. – М.: ФИЗМАТГИЗ, 1960. – 216 с.
6. Либерти, Джесс.
Освой самостоятельно С++ за 21 день, 4-е издание.:Пер с англ.-М.: Издательский дом «Вильямс», 2003.-832с.
7. П.Нортон, П.Иао «Программирование на С++ в среде Windows» («Диалектика» Киев 2003г.)
8. Янг М. Microsoft Visual C++ — М.:ЭНТРОП, 2000.
9. Марченко А.И., Марченко Л.А. – Программирование в среде
Turbo Pascal 7.0 – К.: ВЕК+, М.: Бином Универсал, 1998. – 496 с.
10. Высшая математика: Справ. материалы: Книга для учащихся .- М.:
http://slemeshevsky.github.io/num-mmf/ode/html/._ode-FlatUI001.html
http://www.bestreferat.ru/referat-274013.html