отчёт 8
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ
РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ
БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
Лабораторная работа №8
ИССЛЕДОВАНИЕ МЕТОДОВ ИНТЕГРИРОВАНИЯ ОДУ
И СИСТЕМ ОДУ
Вариант №27
Студент: гр. УТ – 21 Петухов П.А.
Преподаватель: Чуркин В.В.
Киров
2013 год
1.Задание.
-
Исследовать метод прогноза и коррекции, а конкретно, формулу первого варианта метода Адамса с разгоном четырехточечным методом Рунге-Кутта. Исходные данные: ДУ: y’’-8y’+16y-4e4x ; начало интервала интегрирования: x0=0, y0=0; конец интервала интегрирования: xk=2; шаг выдачи результатов:
∆x =0,01
-
Выполнить задание в Mathcad’e.
-
Составить алгоритм и написать код для численного интегрирования указанным методом ОДУ или системы ОДУ. Шаг интегрирования выбирается самостоятельно Результаты интегрирования сводятся в таблицу решений и представляются также в виде графиков функций
2. Математическая часть.
Разрешаем уравнение относительно старшей производной
,
вводим новые переменные и исходное уравнение сводим к нормальной системе ДУ первого порядка:
Разгон выполняется однократным использованием формул РК4:
Теперь необходимо перейти к методу прогноза и коррекции, где в прогнозе используются начальные условия и узел с решением, полученным в результате разгона. Для этого нужно соответствующим образом переименовать переменные, что позволит связать разгон с методом прогноза и коррекции и построить алгоритм.
В начальных условиях имена переменных заменим на . Результаты разгона переименуем в
Теперь формулы для прогноза и коррекции будут иметь вид:
-
Результаты выполнения задания в Mathcad’е.
-
Алгоритм численного интегрирования ДУ второго порядка методом прогноза и коррекции(первый вариант метода Адамса) с разгоном методом РК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.