Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений
Министерство образования и науки Российской Федерации
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Факультет информационных технологий
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем
КУРСОВАЯ РАБОТА
по дисциплине «Численные методы»:
Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений
ОГУ 231000.62.5012.129 ПЗ
Руководитель проекта
______________Тишина Н.А.
«__»____________________2012г.
Исполнитель
студент гр.11Пинж(б)РПИС
______________ Лапшин А.А.
«__»____________________2012г.
Оренбург 2012
Министерство образования и науки Российской Федерации
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ОРЕНБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Факультет информационных технологий
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем
Задание на курсовую работу
Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений
Реализовать один из методов решения задачи Коши для обыкновенных дифференциальных уравнений
Входные данные: ввод с клавиатуры координат начальной точки и шага.
Дата выдачи задания “___ ”____________2012г.
Руководитель
Исполнитель
Студент группы 11ПИНЖ(б)РПИС Лапшин А.А.
Срок защиты работы “___”______________2012г.
Оренбург
2012
Содержание
Введение………………………………………………………… |
4 | |
1 2 |
Постановка задачи………………………………… Теоретические предпосылки………………………………………… |
5 7 |
3 |
Тестирование……………………………………………… |
11 |
4 |
Блок схема…………………………………………………… |
14 |
Приложение А Текст программы…………………………………... |
16 |
Введение
Курсовая работа написана на языке программирования C++, с использованием стандартного модуля “math.h”, в котором собраны математические функции, необходимые для функционирования программы, дополнительного модуля “graphics.h”, необходимого для построения графика, и модуля “iomanip.h”, отвечающего за форматированный ввод файлового потока.
Программа начинает свое действие с ввода первоначальных данных, а точнее с ввода координат начальных точек и шага.
Работа продолжается после нажатия любой клавиши. Выполняется расчет первых 2 точек методом Рунге-Кутта 4 порядка и координаты точек передаются в неявный метод Адамса 3 порядка. Вычисляются первые 400 точек и строятся графики функций r(t) и f(t). Клавиша Enter является сигналом для продолжения вычислений, после нажатия которой вычисляются следующие 400 точек и строятся графики.
Выход осуществляется посредством нажатия клавиши Esc, после нажатия которой, все найденные координаты записываются в файл Результат.txt.
- Постановка задания
Изучить метод Адамса для решения обыкновенных дифференциальных
уравнений, выполнить его программную реализацию.
Рассмотрим простую экосистему, состоящую из кроликов, для которых имеется неограниченный запас пищи, и лис, которые для пропитания охотятся за кроликами. Классическая математическая модель, принадлежащая Вольтерра, описывает эту систему двумя нелинейными уравнениями первого порядка:
dr/dt = 2r -αrf, r (0) = r0,
df/dt=-f + αrf, f(0) = f0.
Здесь t-время, r = r (t) - число кроликов, f = f(t)- число лис и α - положительная константа. При α = 0 две популяции не взаимодействуют, и кролики делают то, что у кроликов получается лучше всего, а лисы вымирают от голода. При α > 0 лисы встречают кроликов с вероятностью, пропорциональной произведению числа тех и других. В результате таких встреч число кроликов убывает, а число лис (по менее очевидным причинам) возрастает.
Исследуйте поведение этой системы для α = 0.01 и различных значений r0 и f0, простирающихся от 2 или 3 до нескольких тысяч. Нарисуйте графики наиболее интересных решений. Начертите также график с осями r и f. Поскольку мы умалчиваем о единицах измерения, нет причин ограничивать r и f только целыми значениями.
(а) Вычислите решение для r0 = 300 и f0 = 150. Вы должны обнаружить, что поведение системы периодично с периодом, очень близким к 5 единицам времени. Иными словами, r(0) ≈ r(5) и f (0) ≈ f(5).
(б) Вычислите решение для r0 = 15 и f0 = 22. Вы должны получить, что число кроликов в конечном счете становится меньше 1. Это можно интерпретировать так, что кролики вымирают. Найдите начальные условия, которые обрекают на вымирание лис. Найдите начальные условия с r0 = f0, при которых вымирают оба вида.
(в) Может ли какая-либо компонента точного решения стать отрицательной? Может ли стать отрицательным численное решение? Что произойдет в этом случае? (На практике ответы на последние два вопроса могут зависеть от заданных вами границ погрешностей.)
- Теоретические предпосылки
- Дифференциальные уравнения и методы их решения
Многие инженерные задачи приводят к необходимости поиска решения дифференциальных уравнений, удовлетворяющих определенным условиям. Однако получить точное решение дифференциального уравнения удается лишь в отдельных случаях, но даже при этом часто получают выражение, содержащее искомую функцию в неявном виде, что затрудняет ее использование. Поэтому в данной работе рассматривается один из способов решение дифференциальных уравнений – метод Адамса.
Дифференциальные уравнения
Методы их решения подразделяются на два класса:
- аналитические методы, в которых решение получается в виде аналитических функций;
- численные (приближенные) методы, где искомые интегральные кривые получают в виде таблиц их численных значений.
Применение аналитических
- Общая постановка задачи решения обыкновенных дифференциальных уравнений
Обыкновенными дифференциальными уравнениями описывают задачи движения системы взаимодействующих материальных точек, сопротивление материалов и многое другое. Ряд важных задач для уравнений в частных производных также сводятся к задачам для обыкновенных дифференциальных уравнений. Таким образом, решение обыкновенных дифференциальных уравнений занимает важное место среди прикладных задач физики, химии, техники.
Конкретная прикладная задача может приводить к дифференциальному уравнению любого порядка или системе уравнений любого порядка. Однако обыкновенные дифференциальные уравнения n-го порядка можно с помощью замены свести к эквивалентной системе n уравнений первого порядка.
Различают три основных типа задач для решения обыкновенных дифференциальных уравнений: задачи Коши, краевые задачи и задачи на собственные значения. В этой курсовой работе будут рассматриваться методы решения задач Коши.
Пусть задано дифференциальное уравнение первого порядка в виде
(1.1)
и начальное условие
(1.2)
Задача Коши состоит в том, чтобы найти функцию
,
являющуюся решением уравнения (1.1) и удовлетворяющую условию (1.2).
методы решения можно условно разбить на точные, приближенные и численные. К точным относятся методы, с помощью которых можно выразить решение дифференциального уравнения через элементарные функции. Приближенные методы – это методы, в которых решение получается как придел некоторой последовательности. Численные методы – это алгоритмы вычисления приближенных значений искомого решения на некоторой выбранной сетке значений аргумента. Решение при этом получается в виде таблицы.
- Метод Адамса для решения систем обыкновенных дифференциальных уравнений
Этот метод разработан Адамсом в 1855 г. по просьбе известного английского артиллериста Башфорта, занимавшегося внешней баллистикой. Впоследствии этот метод был забыт и вновь открыт в начале века норвежским математиком Штермером.
Пусть для задачи Коши найдены каким-либо способом (например, методом Эйлера или Рунге-Кутта) три последовательных значения искомой функции,
где h – шаг изменения .
Вычислим величины
,
,
,
.
Метод Адамса позволяет найти решение задачи, то есть функцию в виде таблицы. Продолжение вычисленный функции из четырех точек осуществляется по экстраполяционной формуле Адамса, в данном случае 3 порядка:
(1.3)
затем уточнение проводится по интерполяционной формуле Адамса 3 порядка:
(1.4)
Метод Адамса легко распространяется на системы дифференциальных уравнений.
- Анализ погрешности метода Адамса
Из теории приближенных методов известно, что при шаге интегрирования h имеет место оценка
,
так что погрешность одного шага вычислений имеет порядок . Суммарная погрешность за n шагов будет порядка . Отсюда, если увеличить n в два раза. То погрешность уменьшиться примерно в 16 раз. Поэтому для оценки приближенного решения , полученного с шагом h, повторяют вычисление с шагом 2h и за абсолютную погрешность принимают число
,
где – приближенное решение с шагом 2h.
Приведенная оценка является оценкой метода и не учитывает погрешность при округлении.
- Тестирование
Программа протестирована на различных наборах входных данных.
Первый пункт задания: r0=300, f0=150, a=0.01, t=0, t=t+h, h=0.1
Рисунок 1 Таблица значений r и f
Рисунок 2 График r(t) и f(t)
Было подтверждено периодичность системы с периодом. То есть r(t)≈r(t+const) и f(t)≈f(t+const)
Пример 2: r0=20, f0=30, h=0.1
Рисунок 3 Таблица значений r и f
Рисунок 4 - График r(t) и f(t)
Пример 3: r0=40, f0=3, h=0.01
Рисунок 5 Таблица значений r и f
Рисунок 6 График r(t) и f(t)
При r0=15, f0=22, h=0.1, a=0.01 наблюдается падение r, то есть r принимает значения меньше 1. Это говорит о том, что жертва, в данном случае кролик, вымирает. При r0=2, f0=3, а=0.01, h=0.1 наблюдается обратная ситуация.
Не исключено, что компонента может
принять отрицательное
Погрешность вычислений определяется по формуле Δy=1/15*|yi-yh|, где yi значение вычисленное с шагом h, а yh значение вычисленное с шагом 2h.
- Блок-схемы
Рисунок 7 Основная функция main()
Рисунок 8 Функция p_dr (int i,double *r,double *f,double a)
Рисунок 9 Функция ratio_f (int i,double *r, double *f,double a,double h)
Приложение А
Текст программы
#include <iostream>
#include <conio.h>
#include <fstream>
#include <math.h>
#include <windows.h>
#include <graphics.h>
#include <iomanip.h>
#define eps 0.001
using namespace std;
double func_dr (double r, double f,double a);
double func_df (double r, double f,double a);
double ratio_r (int i,double *r, double *f,double a,double h);
double ratio_f (int i,double *r, double *f,double a,double h);
double p_dr (int i,double *r,double *f,double a);
double p_df (int i,double *r,double *f,double a);
double u_dr (int i,double *r,double *f,double a);
double u_df (int i,double *r,double *f,double a);
void graphik (int i,int key,double *r, double *f);
void file_write (int step,double *r,double *f);
//____________________________
//_______________Запись в файл____________________//
void file_write (int step,double *r,double *f) {
ofstream file("Результат.txt");
int k=0,i=0,b=0;
while (i<step) {
k=0;
file<<"_______________________
file<<"_______________________
file<<"_______________________
b=0;
while (b<5) {
file<<endl<<"_________________
file<<"_______________________
}
//____________________________
//_______________График_______
void graphik (int i,int key,double *r, double *f) {
int m=30,j=0,n=28;
setcolor(15);
setbkcolor(15);
bar(0,0,1000,200);
moveto(30,20);
setcolor(0);
lineto(30,150);
lineto(830,150);
setcolor(2);
line(5,25,12,25);
setcolor(12);
line(5,35,12,35);
setcolor(0);
outtextxy(13,16,"r(t)");
outtextxy(13,30,"f(t)");
outtextxy(28,151,"t0");
outtextxy(825,151,"t");
// setbkcolor(15);
while (j<key) {
m+=2;
n+=2;
setcolor(2);
// outtextxy(m,450-r[i],".");
moveto(n,150-r[i]/10);
lineto(m,150-r[i+1]/10);
setcolor(12);
// outtextxy(m,450-f[i],".");
moveto(n,150-f[i]/10);
lineto(m,150-f[i+1]/10);
j++;
i++;
}
}
//____________________________
//_______________Функция I____________________//
double func_dr (double r, double f,double a) {
return (2 * r - a * r * f);
}
//____________________________
//_______________Функция II____________________//
double func_df (double r, double f,double a) {
return (- f + a * r * f);
}
//____________________________
//_______________Коэффициенты для I________________//
double ratio_r (int i,double *r, double *f,double a,double h) {
double k1,k2,k3,k4;
k1=func_dr (r[i],f[i],a);
k2=func_dr (r[i]+(h/2),(f[i]+h/2*k1),a);
k3=func_dr (r[i]+(h/2),(f[i]+h/2*k2),a);
k4=func_dr ((r[i]+h),(f[i]+h*k3),a);
return ((h/6)*(k1+(2*k2)+(2*k3)+k4));
}
//____________________________
//_______________Коэффициенты для II_______________//
double ratio_f (int i,double *r, double *f,double a,double h) {
double k1,k2,k3,k4;
k1=func_df (r[i],f[i],a);
k2=func_df (r[i]+(h/2),(f[i]+h/2*k1),a);
k3=func_df (r[i]+(h/2),(f[i]+h/2*k2),a);
k4=func_df ((r[i]+h),(f[i]+h*k3),a);
return ((h/6)*(k1+(2*k2)+(2*k3)+k4));
}
//____________________________
//_______________ Функция экстраполяционная I ________________//
double p_dr (int i,double *r,double *f,double a) {
return ((23*func_dr(r[i],f[i],a)-16*
}
//____________________________
//_______________Функция экстраполяционная II________________//
double p_df (int i,double *r,double *f,double a) {
return ((23*func_df(r[i],f[i],a)-16*
}
//_______________ Функция интерполяционная
I ______________________________
//____________________________
double u_dr (int i,double *r,double *f,double a) {
return ((5*func_dr(r[i+1],f[i+1],a)+
}
//____________________________
//_______________Функция интерполяционная II_______________//
double u_df (int i,double *r,double *f,double a) {
return ((5*func_df(r[i+1],f[i+1],a)+
}
//____________________________
//_______________Основная функция__________________//
int main() {
setlocale(LC_CTYPE, "Russian");
double a=0.01,h=0.1,k1,k2,k3,k4,tmp1,
double r[10000], f[10000],_r,_f,t=0;
cout<<"//_______________Модель
хищник-жертва________________/
cout<<"//______Ввод начальных данных(решение задачи Коши)___//\n";
cout<<"В данный момент времени:";
cout<<"\nR(t0) = "; cin>>r[0];
cout<<"\nF(t0) = "; cin>>f[0];
cout<<"\nШаг H = "; cin>>h;
cout<<"\nКоэффициент а= "; cin>>a;
cout<<"\nРасчет будет происходить по нажатию Enter (Esc - выход)";
cout<<"\nЧтобы продолжить нажмите любую клавишу";
_getch();
//________Первые 2 точки методом Рунге-Кутта 4 порядка
int i=0;
while (i<2) {
_r=ratio_r (i,r,f,a,h);
_f=ratio_f (i,r,f,a,h);
r[i+1]=r[i]+_r;;
f[i+1]=f[i]+_f;
i++;
}
i=2;
//_______Метод Адамса
int ch,step=0;
initwindow(1000,200);
while (ch=13) {
step+=400;
while (i<step) {
graphik (i-400,400,r,f);
up: ch=_getch();
if (ch!=13) {
if (ch=27) break;
goto up;
}
}
//______Запись
file_write (step,r,f);
system("notepad.exe Результат.txt");
cout<<endl;
system("pause");
return 0;
}

- Исследование и синтез системы автоматического управления
- Исследование и совершенствование корпоративного имиджа компании (на примере ООО «Хлебный Дом», г. Санкт-Петербург)
- Исследование и совершенствование системы управления персоналом
- Исследование и совершенствование ценовой политики предприятия
- Исследование использование чувства страха в социальной рекламе правил дорожного движения на прмере социального ролика «DON'T DRINK AND DRIVE»
- Исследование использования методов силовой тренировки на осанку младших школьников
- Исследование используемых в ООО «ПЖТ» форм и типов власти и оценка их эффективности
- Исследование и разработка конструкции наконечника фурмы
- Исследование и разработка методов повышения конкурентоспособности страховой компании
- Исследование и разработка предложений по совершенствованию системы управления в организации ООО «Новый Свет»
- Исследование и разработка рекомендаций по совершенствованию маркетинговой деятельности организации ООО «Иркутская Энергосбытовая Комп
- Исследование и разработка стратегии предприятия ООО «Автомиг»
- Исследование и расчёт системы управления динамическим объектом с П-регулятором
- Исследование и решение задачи выбора тарифного плана оператора сотовой связи Мегафон методами системного анализа