Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

отчёт 8

.docx
Скачиваний:
14
Добавлен:
02.06.2015
Размер:
84.19 Кб
Скачать

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

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

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

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

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

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

Лабораторная работа №8

ИССЛЕДОВАНИЕ МЕТОДОВ ИНТЕГРИРОВАНИЯ ОДУ

И СИСТЕМ ОДУ

Вариант №27

Студент: гр. УТ – 21 Петухов П.А.

Преподаватель: Чуркин В.В.

Киров

2013 год

1.Задание.

    1. Исследовать метод прогноза и коррекции, а конкретно, формулу первого варианта метода Адамса с разгоном четырехточечным методом Рунге-Кутта. Исходные данные: ДУ: y’’-8y’+16y-4e4x ; начало интервала интегрирования: x0=0, y0=0; конец интервала интегрирования: xk=2; шаг выдачи результатов:

∆x =0,01

    1. Выполнить задание в Mathcad’e.

    2. Составить алгоритм и написать код для численного интегрирования указанным методом ОДУ или системы ОДУ. Шаг интегрирования выбирается самостоятельно Результаты интегрирования сводятся в таблицу решений и представляются также в виде графиков функций

2. Математическая часть.

Разрешаем уравнение относительно старшей производной

,

вводим новые переменные и исходное уравнение сводим к нормальной системе ДУ первого порядка:

Разгон выполняется однократным использованием формул РК4:

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

В начальных условиях имена переменных заменим на . Результаты разгона переименуем в

Теперь формулы для прогноза и коррекции будут иметь вид:

  1. Результаты выполнения задания в Mathcad’е.

  1. Алгоритм численного интегрирования ДУ второго порядка методом прогноза и коррекции(первый вариант метода Адамса) с разгоном методом РК4.

5. Таблица идентификаторов.

Имя переменной

Тип переменной

Диапазон

Назначение

Алгоритм

Программа

i

I

int

От -2 147 483 648 до 2 147 483 647

Переменная цикла

j

j

int

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

Переменная цикла

i

i

int

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

Счётчик

h

h

double

От ±5.0 × 10−324 до ±1.7 × 10308

Элемент массива

dx

dx

double

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

Шаг интегрирования

x

x

double

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

Переменная интегрирования

xk

xk

double

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

Конец промежутка

y0

y0

double

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

Начальные условия

y00

y00

double

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

Рез-т разгона

y000

y000

double

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

Переменная формул для прогноза и корр.

y1

y1

double

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

Начальные условия

y10

y10

double

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

Рез-т разгона

y01

y01

double

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

Переменная формул для прогноза и корр.

y100

y100

double

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

Переменная формул для прогноза и корр.

y11

y11

double

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

Переменная формул для прогноза и корр.

l1

l1

double

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

Для рассчёта рез-тов разгона

l2

l2

double

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

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

l3

l3

double

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

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

l4

l4

double

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

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

k1

k1

double

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

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

k2

k2

double

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

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

k3

k3

double

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

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

k4

k4

double

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

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

6.Исходный код

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

#include <vcl.h>

#pragma hdrstop

#include<math.h>

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{}

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

double h;

void __fastcall TForm1::icx_danClick(TObject *Sender)

{ LineSeries1->Clear();

LineSeries2->Clear();

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

StringGrid1->Cells[1][0]=" y(x0)";

StringGrid1->Cells[2][0]=" y`(x0)";

StringGrid1->Cells[3][0]=" xk";

StringGrid1->Cells[4][0]=" dx";

StringGrid1->Cells[5][0]=" h";

StringGrid1->Cells[0][1]=FloatToStr(0);

StringGrid1->Cells[1][1]=FloatToStr(0);

StringGrid1->Cells[2][1]=FloatToStr(1);

StringGrid1->Cells[3][1]=FloatToStr(2.0);

StringGrid1->Cells[4][1]=FloatToStr(0.1);

StringGrid1->Cells[5][1]=FloatToStr(0.01);

LabeledEdit1->Text=StringGrid1->Cells[5][1];

metod->Enabled=false;

for(int j=0;j<StringGrid3->ColCount;j++)

for(int i=0;i<StringGrid3->RowCount;i++){

StringGrid3->Cells[j][i]="";}}

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

void __fastcall TForm1::na_metodClick(TObject *Sender)

{ metod->Enabled=true;

StringGrid3->Cells[0][0]=" x";

StringGrid3->Cells[0][1]=" y";

StringGrid3->Cells[0][2]=" y'";}

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

void __fastcall TForm1::pol_hClick(TObject *Sender)

{ LabeledEdit1->Text=FloatToStr(0.5*StrToFloat(LabeledEdit1->Text));}

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

void __fastcall TForm1::dva_hClick(TObject *Sender)

{ LabeledEdit1->Text=FloatToStr(2*StrToFloat(LabeledEdit1->Text));}

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

void __fastcall TForm1::ich_hClick(TObject *Sender)

{ LabeledEdit1->Text=StringGrid1->Cells[5][1];}

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

void __fastcall TForm1::Ad_RK4Click(TObject *Sender)

{ double y0,y00,y000,y01,y1,y10,y100,y11,x,xk,dx,k1,k2,k3,k4,l1,l2,l3,l4;

int i=1,f=0;

LineSeries1->Clear();

LineSeries2->Clear();

h=StrToFloat(LabeledEdit1->Text);

y0=StrToFloat(StringGrid1->Cells[1][1]);

y1=StrToFloat(StringGrid1->Cells[2][1]);

x=StrToFloat(StringGrid1->Cells[0][1]);

dx=StrToFloat(StringGrid1->Cells[4][1]);

xk=StrToFloat(StringGrid1->Cells[3][1]);

StringGrid3->Cells[i][0]=FloatToStrF(x,ffFixed,3,2);

StringGrid3->Cells[i][1]=FloatToStrF(y0,ffExponent,3,2);

StringGrid3->Cells[i][2]=FloatToStrF(y1,ffExponent,3,2);

LineSeries1->AddXY(x,y0,"",clBlack);

LineSeries2->AddXY(x,y1,"",clBlack);

i++;

k1=y1;

l1=8*y1-16*y0+exp(4*x);

k2=y1+h/2*l1;

l2=8*(y1+h/2*l1)-16*(y0+h/2*k1)+exp(4*(x+h/2));

k3=y1+h/2*l2;

l3=8*(y1+h/2*l2)-16*(y0+h/2*k2)+exp(4*(x+h/2));

k4=y1+h*l3;

l4=8*(y1+h*l3)-16*(y0+h*k3)+exp(4*(x+h));

y00=y0+h/6*(k1+2*k2+2*k3+k4);

y10=y1+h/6*(l1+2*l2+2*l3+l4);

x+=h;

do{

if(f){y0=y00;y1=y10;y00=y01;y10=y11;}

f=1;

if(fmod(x,dx)<h){

StringGrid3->Cells[i][0]=FloatToStrF(x,ffFixed,3,2);

StringGrid3->Cells[i][1]=FloatToStrF(y00,ffExponent,3,2);

StringGrid3->Cells[i][2]=FloatToStrF(y10,ffExponent,3,2);

LineSeries1->AddXY(x,y0,"",clBlack);

LineSeries2->AddXY(x,y1,"",clBlack);

i++;}

y000=y00+h/2*(3*y10-y1);

y100=y10+h/2*(3*(8*y10-16*y00+exp(4*x))-(8*y1-16*y0+exp(4*(x-h))));

y01=y00+h/2*(y100+y10);

y11=y10+h/2*((8*y100-16*y000+exp(4*(x+h)))+(8*y10-16*y00+exp(4*x)));

x+=h;}

while(x<=xk+h);

}

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

void __fastcall TForm1::outClickClick(TObject *Sender)

{

Close();

}

7.Результаты выполнения работы в Builder .

8.Библиографический список

В.В.ЧУРКИН ЧИСЛЕННЫЕ МЕТОДЫ (с алгоритмами и программами в среде C++Builder) Учебно-методическое пособие. 2013.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]