Численные методы решения дифференциальных уравнений

Автор работы: Пользователь скрыл имя, 24 Июня 2013 в 09:49, курсовая работа

Краткое описание

Целью курсовой работы является разработка программ:
Численных методов интегрирования функции;
Численных методов дифференцирования функции;
Численных методов решения дифференциального уравнения;
Для достижения данной цели есть необходимость выделить следующие основные задачи:
Практически закрепить и повторить знания основ языка C++Builder 6, для успешного программирования;
Повторить теоретический материал по численным методам;
Написать программы численных методов соответственно заданию;
Сравнить методы и сделать выводы по проделанной работе.

Содержание

Введение 3
Теоретическая часть 4
1. Численные методы интегрирования функций 4
1.2 Формула Ньютона – Котеса: метод трапеций. 5
1.3 Формула Ньютона – Котеса: метод Симпсона. 6
1.4 Метод Лежандра – Гаусса. 7
1.5 Метод Монте-Карло. 8
2. Численные методы дифференцирования функций 9
2.1 Интерполяционная формула Ньютона 10
3. Численные методы решения дифференциальных уравнений 11
3.1 Метод Эйлера 11
3.2 Методы Рунге-Кутты 12
Практическая часть 14
Заключение 21
Список использованных источников 22

Вложенные файлы: 1 файл

теория.docx

— 1.25 Мб (Скачать файл)

19

 

КП.230100. 08 .ПЗ


ти следует увеличить количество шагов.

 

 




Изм.


Лист

№ докум.

Подпись

Дата

Лист

20

 

КП.230100. 08 .ПЗ


Заключение


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

Лист

№ докум.

Подпись

Дата

Лист

21

 

 

КП.230100. 08 .ПЗ


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

Список использованных источников

  1. Амосов А.А., Дубинский Ю.А., Копченова Н.В. «Вычислительные методы для инженеров». - М.:Высшая школа, 1994.
  2. Бахвалов Н..С., Лапин А.В., Чижонков Е.В. Численные методы в задачах и упражнениях. Учебпособие. /Под ред. В.А.Садовничего. – М.: Высшая школа, 2000.
  3. Воробьева Г.Н., Данилова А.Н. Практикум по вычислительной математике.- М.: Высш. шк., 1990
  4. Лапчик М.П., Рагулина М.И., Стукалов В.А. Численные методы: Учеб. пособие для пед. вузов.-М.: Академия, 2001.
  5. Ракитин В.И., Первушкин В.Е. Практическое руководство по методам вычислений с приложением программ для персональных компьютеров: Учеб. пособие.- М.: Высш. шк., 1998.
  6. Сборник задач по методам вычислений: Учеб. пособие: Для вузов/Под ред. П.И. Монастырного.-М.: Физматлит, 1994.
  7. http://window.edu.ru/resource/314/52314/files/m11.pdf
  8. http://www.sgu.ru/files/nodes/19138/Sorokina_Parfenova.pdf
  9. http://padaread.com/?book=26512
  10. http://vm.psati.ru/online-vmath/index.php?page=0


Изм.

Лист

№ докум.

Подпись

Дата

Лист

22

 

КП.230100. 08 .ПЗ


Приложение А

 

Листинг главной страницы:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

Form6->Show();          //Вызов следующего окна

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{       Close();    } //Выход

 

 

Листинг выбора задания курсового  проекта:

void __fastcall TForm6::Button2Click(TObject *Sender)


{Изм.

Лист

№ докум.

Подпись

Дата

Лист

23

 

КП.230100. 08 .ПЗ


 

if (RadioGroup1->ItemIndex==0)   //условие выбора задания

Form2->Show();     //Выбор задания 1

if (RadioGroup1->ItemIndex==1)

Form7->Show();     //Выбор задания 2

if (RadioGroup1->ItemIndex==2)

Form8->Show();     //Выбор задания 3 

}

//---------------------------------------------------------------------------

void __fastcall TForm6::Button1Click(TObject *Sender)

{       Close();    } //Выход

 

Листинг задания 1:

void __fastcall TForm2::Button1Click(TObject *Sender)

{       Close();    } //Выход

//---------------------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)

{

int n,i;

float a, b, h, C1, C2, t=1.09903;      

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

n=StrToFloat(Edit3->Text);

 

float x[100];float y[100],xis[100],yis[100],S1,S2,S3,S4,S5,R;

h=(b-a)/n;

StringGrid1->Cells[0][0] = "Номер узла";

for(i=1;i<=11;i++)

StringGrid1->Cells[0][i]=i;

StringGrid1->Cells[0][0] = "Номер узла";

StringGrid1->Cells[1][0]="x[i]";

StringGrid1->Cells[2][0]="y[i]";

StringGrid1->Cells[3][0]="x[середина]";

StringGrid1->Cells[4][0]="y[середина]";

x[0]=a; y[0]=(x[0]*x[0]+1)*sin(x[0]-0.5);

StringGrid1->Cells[1][1]=x[0];

StringGrid1->Cells[2][1]=y[0];

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

   {x[i]=x[i-1]+h;

    StringGrid1->Cells[1][i+1]=x[i];

    y[i]=(x[i]*x[i]+1)*sin(x[i]-0.5);

    StringGrid1->Cells[2][i+1]=y[i];

    }

for(i=0;i<n;i++)


   {xis[i]=(x[i]+x[i+1])/2; Изм.

Лист

№ докум.

Подпись

Дата

Лист

24

 

КП.230100. 08 .ПЗ


 

   StringGrid1->Cells[3][i+2]=xis[i];

    yis[i]=(xis[i]*xis[i]+1)*sin(xis[i]-0.5);

    StringGrid1->Cells[4][i+2]=yis[i];}

    S1=S2=S3=0;

for(i=0;i<n;i++)

S1=S1+h*y[i];

Label1->Caption="Метод левых прямоугольников = " + FloatToStr(S1);

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

S2=S2+h*y[i];

Label2->Caption="Метод правых прямоугольников = " + FloatToStr(S2);

for(i=0;i<n;i++)

S3=S3+h*yis[i];

Label3->Caption="Метод средних прямоугольников = " + FloatToStr(S3);

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

    R=R+y[i];

S4=h*((y[0]+y[n])/2+R);

Label4->Caption="Метод трапеций = " + FloatToStr(S4);

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

    {if(i%2==0)

  C2=C2+2*y[i];

     else C1=C1+4*y[i];

     }

S5=h/3*(y[0]+C1+C2+y[n]);

Label5->Caption="Метод Симпсона = " + FloatToStr(S5);

Label19->Caption=S1-t;

Label20->Caption=S2-t;

Label21->Caption=S3-t;

Label22->Caption=S4-t;

Label23->Caption=S5-t;

}

 

Листинг задания 2:

void __fastcall TForm7::Button1Click(TObject *Sender)

{

int i, j;

float a, b, n, h, f, t, s;

float  x[100], y[100], q[100], w[100], e[100], r[100], g[100], u[100], o[100];

 

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

h=StrToFloat(Edit3->Text);

s=StrToFloat(Edit4->Text);

 

n=(b-a)/h;

StringGrid2->Cells[0][0] = "Номер узла";

for(i=0;i<=4;i++)

        StringGrid2->Cells[0][i+1]=i;

StringGrid2->Cells[1][0]="x";

StringGrid2->Cells[2][0]="y";

StringGrid2->Cells[3][0]="y(x)";

StringGrid2->Cells[7][0]="y'(x)";

for(i=4;i<7;i++)

         StringGrid2->Cells[i][0]="dx"+IntToStr(i-3);

 

StringGrid2->Cells[1][1]=0.70;     StringGrid2->Cells[2][1]=0.64422;

StringGrid2->Cells[1][2]=0.75;     StringGrid2->Cells[2][2]=0.68164;

StringGrid2->Cells[1][3]=0.80;     StringGrid2->Cells[2][3]=0.71736;

StringGrid2->Cells[1][4]=0.85;     StringGrid2->Cells[2][4]=0.75128;

StringGrid2->Cells[1][5]=0.90;     StringGrid2->Cells[2][5]=0.78333;


Изм.

Лист

№ докум.

Подпись

Дата

Лист

25

 

КП.230100. 08 .ПЗ


 

for(i=0;i<5;i++)

    { x[i]=StrToFloat(StringGrid2->Cells[1][i+1]);

      y[i]=StrToFloat(StringGrid2->Cells[2][i+1]);  }

 

for (i=0;i<10;i++)

       q[i]=w[i]=e[i]=0;

for(i=0;i<4;i++)

       {q[i]=y[i+1]-y[i];

       StringGrid2->Cells[4][i+1]=q[i];

       }

for(i=0;i<4-1;i++)

       {w[i]=q[i+1]-q[i];

       StringGrid2->Cells[5][i+1]=w[i];

       }

for(i=0;i<4-2;i++)

       {e[i]=w[i+1]-w[i];

       StringGrid2->Cells[6][i+1]=e[i];

       }

i=0;

do  i++;

while(s>x[i]) ;

u[0]=(y[i]-y[i-1])/(x[i]-x[i-1]) ;

o[0]=y[i-1]-u[0]*x[i-1];

g[0]=u[0]*s+o[0];

StringGrid2->Cells[3][1]=g[0];

h=x[i+1]-x[i];  t=(s-x[0])/h;

f=(1/h)*((q[i]+(2*t-1)*w[i]/2+(3*pow(t,2)-6*t+2)*e[i]/6 ))  ;  //интерполяционная формула

StringGrid2->Cells[7][1]=f;

}

//---------------------------------------------------------------------------

void __fastcall TForm7::Button2Click(TObject *Sender)

{     Close();        }

 

Листинг задания 3:

void __fastcall TForm8::Button1Click(TObject *Sender)

{ int i,n,j,k;

float a, c, b, h, x[100], y[100], q[100],w[100],e[100],r[100],z[100],f[100],s[100];

a=StrToFloat(Edit1->Text);

b=StrToFloat(Edit2->Text);

c=StrToFloat(Edit3->Text);

n=StrToFloat(Edit4->Text);

 

StringGrid1->Cells[0][0] = "i";

StringGrid2->Cells[0][0] = "i";

StringGrid3->Cells[0][0] = "Погрешность"  ;

 

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

        { StringGrid1->Cells[0][i+1]=i;

          StringGrid2->Cells[0][i+1]=i;   }

StringGrid1->Cells[1][0]="x";

StringGrid1->Cells[2][0]="y";

StringGrid1->Cells[3][0]="y'";

 

StringGrid2->Cells[1][0]="x";

StringGrid2->Cells[2][0]="ki(0)";

StringGrid2->Cells[3][0]="ki(1)";

StringGrid2->Cells[4][0]="ki(2)";

StringGrid2->Cells[5][0]="ki(3)";

StringGrid2->Cells[6][0]="y";


Изм.

Лист

№ докум.

Подпись

Дата

Лист

26

 

КП.230100. 08 .ПЗ


 

h=(b-a)/n;  //метод эйлера

StringGrid1->Cells[2][1]=c;

x[0]=a;        y[0]=c;     k=0;

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

       { StringGrid1->Cells[1][i+1]=x[i];

         x[i+1]=x[i]+h;}

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

        {

        StringGrid1->Cells[2][i+1]=y[i];

        z[i]=2.5*x[i]+cos(y[i]+0.6);

        y[i+1]=y[i]+h*z[i];

         if(k<n)   {k++;

        StringGrid1->Cells[3][i+1]=z[i];}

        }

 

s[0]=a;        f[0]=c;  //  метод рунге-кутта

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

       { StringGrid2->Cells[1][i+1]=s[i];

         s[i+1]=s[i]+h;}

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

       { q[i]=2.5*s[i]+cos(f[i]+0.6);

         w[i]=2.5*(s[i]+h/2)+cos(f[i]+q[i]/2+0.6);

         e[i]=2.5*(s[i]+h/2)+cos(f[i]+w[i]/2+0.6);

         r[i]=2.5*(s[i]+h)+cos(f[i]+e[i]/2+0.6);

         f[i+1]=f[i]+(h/6)*(q[i]+w[i]*2+e[i]*2+r[i]);

         StringGrid2->Cells[2][i+1]=q[i];

         StringGrid2->Cells[3][i+1]=w[i];

         StringGrid2->Cells[4][i+1]=e[i];

         StringGrid2->Cells[5][i+1]=r[i];

         StringGrid2->Cells[6][i+1]=f[i]; }

 

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

          StringGrid3->Cells[0][i+1]=fabs(y[i]-f[i]);

}

//---------------------------------------------------------------------------

void __fastcall TForm8::Button2Click(TObject *Sender)

{    Close();   }

Приложение Б


Изм.

Лист

№ докум.

Подпись

Дата

Лист

27

 

КП.230100. 08 .ПЗ


 

Рис.8. Главное окно программы

Рис.9. Выбор задания курсового  проекта


Информация о работе Численные методы решения дифференциальных уравнений