Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений


Министерство  образования и науки Российской Федерации

 

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ

ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО  ОБРАЗОВАНИЯ

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

Факультет информационных технологий

 

Кафедра программного обеспечения вычислительной техники

и автоматизированных систем

КУРСОВАЯ РАБОТА

 

по дисциплине «Численные методы»:

 

Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений

 

ОГУ 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.

 

 

  1. Постановка задания

Изучить метод Адамса для решения обыкновенных дифференциальных

уравнений, выполнить его программную реализацию.

 Рассмотрим простую экосистему, состоящую из кроликов, для которых имеется неограниченный запас пищи, и лис, которые для пропитания охотятся за кроликами. Классическая математическая модель, принадлежащая Вольтерра, описывает эту систему двумя нелинейными уравнениями первого порядка:

 

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, при которых вымирают оба вида.

(в) Может ли какая-либо компонента точного решения стать отрицательной? Может ли стать отрицательным численное решение? Что произойдет в этом случае? (На практике ответы на последние два вопроса могут зависеть от заданных вами границ погрешностей.)

 

  1. Теоретические предпосылки

 

    1.  Дифференциальные уравнения и методы их решения

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

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

Методы их решения подразделяются на два класса:

  1. аналитические методы, в которых решение получается в виде аналитических функций;
  2. численные (приближенные) методы, где искомые интегральные кривые получают в виде таблиц их численных значений.

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

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

 

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

Конкретная  прикладная задача может приводить  к дифференциальному уравнению  любого порядка или системе уравнений  любого порядка. Однако обыкновенные дифференциальные уравнения n-го порядка можно с  помощью замены свести к эквивалентной  системе n уравнений первого порядка.

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

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

 

(1.1)

 

и начальное условие

 

(1.2)

 

Задача  Коши состоит в том, чтобы найти  функцию

 

,

 

являющуюся решением уравнения (1.1) и удовлетворяющую условию (1.2).

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

 

    1. Метод Адамса для решения систем обыкновенных дифференциальных уравнений

Этот  метод разработан Адамсом в 1855 г. по просьбе известного английского артиллериста Башфорта, занимавшегося внешней баллистикой. Впоследствии этот метод был забыт и вновь открыт в начале века норвежским математиком Штермером.

Пусть для задачи Коши найдены каким-либо способом (например, методом Эйлера или Рунге-Кутта) три последовательных значения искомой функции,

 

где h – шаг изменения .

Вычислим величины

 

,

,

,

.

 

Метод Адамса позволяет найти решение  задачи, то есть функцию в виде таблицы. Продолжение вычисленный функции из четырех точек осуществляется по экстраполяционной формуле Адамса, в данном случае 3 порядка: 

            (1.3)

 

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

 

(1.4)

 

Метод Адамса легко распространяется на системы дифференциальных уравнений.

    1. Анализ погрешности метода Адамса

Из теории приближенных методов известно, что  при шаге интегрирования h имеет место оценка

 

,

так что погрешность одного шага вычислений имеет порядок . Суммарная погрешность за n шагов будет порядка . Отсюда, если увеличить n в два раза. То погрешность уменьшиться примерно в 16 раз. Поэтому для оценки приближенного решения , полученного с шагом h, повторяют вычисление с шагом 2h и за абсолютную погрешность принимают число

,

где – приближенное решение с шагом 2h.

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

  1. Тестирование

Программа протестирована на различных наборах входных  данных.

Первый пункт задания: 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.

 

  1. Блок-схемы

Рисунок 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<<"____________________________"<<endl;

                           b=0;

                          

                            while (b<5) {

                                         file<<"|"<<setw(8)<<"r"<<"|"<<setw(8)<<"f";

                                          b++;

                                           }

                                          

                              file<<endl<<"_______________________________";

                               file<<"_______________________________";

                                file<<"___________________________"<<endl;

                                   

                                 while (k<41) {

                                               file<<"|"<<setw(8)<<r[i]<<"|"<<setw(8)<<f[i];

                                                file<<"|"<<setw(8)<<r[i+40]<<"|"<<setw(8)<<f[i+40];

                                                 file<<"|"<<setw(8)<<r[i+80]<<"|"<<setw(8)<<f[i+80];

                                                  file<<"|"<<setw(8)<<r[i+120]<<"|"<<setw(8)<<f[i+120];

                                                   file<<"|"<<setw(8)<<r[i+160]<<"|"<<setw(8)<<f[i+160]<<endl;

                                                    k++;

                                                     i++;

                                                      }

                                   i+=160;           

                                  }

                                  file.close();

                   }

                  

//_________________________________________________//

//_______________График____________________________//

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*func_dr(r[i-1],f[i-1],a)+5*func_dr(r[i-2],f[i-2],a))/12);

      

       }

 

//_________________________________________________//

//_______________Функция экстраполяционная II________________//       

double p_df (int i,double *r,double *f,double a) {

      

       return ((23*func_df(r[i],f[i],a)-16*func_df(r[i-1],f[i-1],a)+5*func_df(r[i-2],f[i-2],a))/12);

      

       }

                    

//_______________ Функция интерполяционная I __________________________________//

//_______________________________//       

double u_dr (int i,double *r,double *f,double a) {

      

       return ((5*func_dr(r[i+1],f[i+1],a)+8*func_dr(r[i],f[i],a)-2*func_dr(r[i-1],f[i-1],a))/12);

      

       }

 

//_________________________________________________//

//_______________Функция интерполяционная II_______________//       

double u_df (int i,double *r,double *f,double a) {

      

       return ((5*func_df(r[i+1],f[i+1],a)+8*func_df(r[i],f[i],a)-2*func_df(r[i-1],f[i-1],a))/12);

      

       }      

                               

 

 

 

//_________________________________________________//

//_______________Основная функция__________________//

int main() {

   

    setlocale(LC_CTYPE, "Russian");

      

    double a=0.01,h=0.1,k1,k2,k3,k4,tmp1,tmp2;

    double r[10000], f[10000],_r,_f,t=0;

     cout<<"//_______________Модель хищник-жертва________________//\n";

      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) {

                                     r[i+1]=r[i]+h*p_dr(i,r,f,a);

                                      f[i+1]=f[i]+h*p_df(i,r,f,a);

                                       tmp1=r[i]+h*u_dr(i,r,f,a);

                                        tmp2=f[i]+h*u_df(i,r,f,a);

                                         r[i+1]=tmp1;  

                                          f[i+1]=tmp2;

                                           i++;    

                                            }   

     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;

    }


Исследование и решение задачи Коши для обыкновенных дифференциальных уравнений