![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
4. Для ускорения проектирования контролируйте правильность своих действий по рис.7.11, 7.12 и 7.13, на которых приведены результаты выполнения задания.
5. Для выполнения п.1 задания перенесем на форму компоненты: метку Label1 (страница Стандарт),кнопки Button1 и Button2 (страница Стандарт) и три метки: LabeledEdit1, LabeledEdit2 и LabeledEdit3 (страница Дополнительно). В свойство Caption метки Label1 впишите подынтегральную функцию, метки LabeledEdit1 и LabeledEdit2 служат для задания пределов интегрирования, LabeledEdit3 – для вывода точного значения интеграла.При щелчке на кнопке Button1 (расчет) вычисляется интеграл по формуле Ньютона-Лейбница, щелчок на кнопке Button2 (конец) означает перевод приложения из режима выполнения в режим проектирования. Для свойства Enabled кнопки Button1 установите значение false.
Рис.7.11- форма с результатами (вид 1)
Рис.7.12- форма с результатами (вид 2)
Рис.7.13- форма с результатами (вид 3)
6. Кроме того, для выполнения п.1 задания необходимо в файл реализации LR7.cpp включить директиву #include<math.h>, функцию для вычисления первообразной
double fp(double x)
{return (x*x/2-1)*asin(x/2)+x/4*sqrt(4-x*x);}
и обработчик щелчка на кнопке Button1 (расчет), где вычисляется точное значение интеграла(tin):
void __fastcall TForm1::Button1Click(TObject *Sender)
{
a=StrToFloat(LabeledEdit1->Text);
b=StrToFloat(LabeledEdit2->Text);
tin=fp(b)-fp(a);
LabeledEdit3->Text=FloatToStr(tin);
f1->Enabled=true;
f2->Enabled=true;
f3->Enabled=true;
LabeledEdit1->Enabled=false;
LabeledEdit2->Enabled=false;
Button1->Enabled=false;
}
После щелчка на кнопке Button1 (расчет) компоненты Button1 (расчет), LabeledEdit1 (a=) и LabeledEdit2 (b=) становятся недоступными.
7. Перенесите на форму компонент MainMenu (страница Стандарт), двойным щелчком на нем перейдите в Проектировщик Меню (окно Form1->MainMenu1) и сконструируйте меню с указанными разделами и подразделами; названия записываются в свойство Caption разделов и подразделов:
Ф-ла Ньютона-Лейбница Факт_ош=f1(n) Факт_ош=f2(шаг) Факт_ош,врем_затр=f3(eps),f4(eps)
Ньютон-Котес Ньютон-Котес Ньютон-Котес
Гаусс Гаусс Гаусс
8. Выделите раздел Ф-ла Ньютона-Лейбница. Значения свойств Enabled и Visible оставьте в true. Среда Builder в качестве значения свойства Name разделов и подразделов ставит номера: N1, N2, и т.д. При проектировании рекомендуется присваивать осмысленные имена, поэтому в свойство Name впишите N_L. Обработчик щелчка на этом разделе по окончании проектирования будет содержать (курсив):
void __fastcall TForm1::N_LClick(TObject *Sender)
{ f1->Enabled=false;
f2->Enabled=false;
f3->Enabled=false;
StringGrid1->Visible=false;
PageControl1->Visible=false;
LabeledEdit1->Enabled=true;
LabeledEdit2->Enabled=true;
Button1->Enabled=true;
LabeledEdit3->Text="";
for(int i=0;i<StringGrid1->RowCount;i++)
for(int j=0;j<StringGrid1->ColCount;j++)
StringGrid1->Cells[j][i]="";
for(int i=0;i<StringGrid2->RowCount;i++)
for(int j=0;j<StringGrid2->ColCount;j++)
StringGrid2->Cells[j][i]="";
for(int i=0;i<StringGrid3->RowCount;i++)
for(int j=0;j<StringGrid3->ColCount;j++)
StringGrid3->Cells[j][i]="";
for(int i=0;i<StringGrid4->RowCount;i++)
for(int j=0;j<StringGrid4->ColCount;j++)
StringGrid4->Cells[j][i]="";
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
Series5->Clear();
Series6->Clear();
}
9. Свойству Enabled остальных разделов присвойте значение false, свойству Name остальных разделов и их подразделов присвойте следующие значения соответственно: f1, f1_N_K, f1_G; f2, f2_N_K, f2_G; f3, f3_N_K, f3_G. Выполнение приложения может начаться только с головного раздела меню Ф-ла Ньютона-Лейбница, поскольку остальные разделы меню и кнопка Button1 (расчет) в этот момент недоступны. После щелчка на разделе Ф-ла Ньютона-Лейбница кнопка станет доступной.
10. Раздел меню Факт_ош=f1(n) предназначен для выполнения п.3 примечания; для вывода результатов поместите на форму компонент StringGrid1 (страница Дополнительно). Названия строк n, Н_Л-Н_К, Н_Л-Гаусс будут заданы во время выполнения приложения. Установите следующие значения свойств компонента StringGrid1: ColCount – 9, FixedCols – 1, FixedRows – 1, Font – черный, обычный, размер 8, RowCount – 3, Visible – false.
11. Разделы меню Факт_ош=f2(шаг) и Факт_ош,врем_затр=f3(eps), f4(eps) предназначены для выполнения п.2 и п.3 задания. Для выполнения п.2 и п.3 задания необходимо разместить на форме большое количество компонентов, имеющих значительные размеры. Использование многостраничной панели – компонента PageControl1 (страница Win32) позволяет преодолеть это затруднение. Перенесите компонент PageControl1 на форму. Щелкните на нем правой кнопкой мыши и во всплывшем меню трижды используйте команду Новая страница. В свойство Caption первой страницы впишите Факт_ош=f2(шаг), второй – Факт_ош=f3(eps), третьей – Врем_затр=f4(eps). Установите свойства компонента PageControl1: MultiLine – false, Style – tsTabs, TabPosition – tpTop, Visible – false. Перенесите на первую страницу (Факт_ош=f2(шаг)) компоненты: LabeledEdit4 (n=) - для указания числа узлов интегрирования, StringGrid2 ( страница Дополнительно)– для таблицы с результатами расчетов и компоненты Chart1 и Chart2 (страница Additional) для представления в графическом виде результатов расчетов. В свойство Text компонента LabeledEdit4 занесите число 2.Установите следующие значения свойств компонента StringGrid2: ColCount – 21, FixedCols – 1, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 3.
12. Задайте свойства компонента Chart1. Щелкните правой кнопкой мыши на компоненте Chart1 и в появившемся меню выберите Edit Chart …. На экране появится окно Редактора Диаграмм (Editing Chart1) с открытой страницей Chart,которая имеет несколько закладок. В данный момент открыта закладка Series. Щелкните на кнопке Add… - добавить серию. В появившемся окне выберите тип графика – Line и выключите индикатор 3D. На закладке Panel, нажав кнопку Panel Color…, выберите белый цвет. На закладке Legend выключите индикатор Visible. Перейдите на закладку Titles. В окне редактирования, которое в данный момент соответствует Title – заголовку графика, сотрите TChart и напишите (шрифт Font… - черный, жирный, размер 8) Факт ошибка (Н_Л-Н_К). Цвет фона Back Color.. установите белый.В выпадающем списке от окна редактирования Title перейдите в окно редактирования Foot и напишите тем же шрифтом шаг интегрирования. Цвет фона Back Color.. также установите белый. Перейдите на закладку Axis. В группе кнопок Axis нажата кнопка Left и открыта закладка Scales. Нажмите кнопку Change… и задайте Increment равным 1E-12. На закладке Labels в значение Values Format добавьте справа 9 символов #; оно станет равным # ##0,############. Затем в группе кнопок Axis нажмите кнопку Bottom и задайте Increment равным 0,01.Перейдите со страницы Chart на страницу Series. Здесь на закладке Format в группе Line нажмите Border … и установите Width равным 2. Нажмите кнопку Close и выйдите из режима редактирования компонента Chart1. Свойства компонента Chart2 задаются так же.
13. Перенесите на вторую страницу (Факт_ош=f3(eps)) компоненты: LabeledEdit5 (n=) - для указания числа узлов интегрирования, StringGrid3 ( страница Дополнительно)– для таблицы с результатами расчетов и компоненты Chart3 и Chart4 (страница Additional) для представления в графическом виде результатов расчетов. В свойство Text компонента LabeledEdit5 занесите число 2.Установите следующие значения свойств компонента StringGrid3: ColCount – 6, FixedCols – 1, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 3.
14. Свойства компонентов Chart3 и Chart4 задаются так же, как Chart1 и Chart2. Отличие состоит в задании характеристик оси абсцисс. На закладке Axis в группе кнопок Axis нажмите кнопку Bottom, включите индикатор Logarithmic и установите Minimum – 0,000001; Maximum – 0,01. На закладке Labels в значение Values Format добавьте справа 7 символов #; оно станет равным # ##0,##########.
15. Перенесите на третью страницу (Врем_затр=f4(eps)) компоненты StringGrid4 ( страница Дополнительно)– для таблицы с результатами расчетов и компоненты Chart5 и Chart6 (страница Additional) для представления в графическом виде результатов расчетов. Установите значения свойств компонента StringGrid4 равными значениям свойств компонента StringGrid3: ColCount – 6, FixedCols – 1, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 3. Свойства компонентов Chart5 и Chart6 устанавливаются проще, чем свойства компонентов Chart3 и Chart4 – характеристики оси ординат (нажата кнопка Left) сохраняются заданными по умолчанию.
16. По окончании проектирования файл LR7.cpp может выглядеть так:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "LR7.h"
#include<math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
double a,b,tin;
double nkh[][9]={{0.5,0.5},{0.1666667,0.6666667,0.1666667},
{0.125,0.375,0.375,0.125},{0.0777778,0.3555556,0.1333333,
0.3555556,0.0777778},
{0.0659722,0.2604166,0.1736111,0.1736111,0.2604166,0.0659722},
{0.0488095,0.2571428,0.0321428,0.3238095,0.0321428,0.2571428,
0.0488095},
{0.0434606,0.2070023,0.0765626,0.1729745,0.1729745,0.0765626,
0.2070023,0.0434606},{0.0348853,0.2076895,-0.0327336,
0.3702292,-0.1601410,0.3702292,-0.0327336,0.2076895,0.0348853}};
double gx[][8]={{0.5},{0.2113249,0.7886751},{0.1127017,0.5,0.8872983},
{0.0694318,0.3300095,0.6699905,0.9305682},{0.0469101,0.2307653,0.5,
0.7692347,0.9530899},{0.0337652,0.1693953,0.3806904,0.6193096,
0.8306047,0.9662348},{0.0254460,0.1292344,0.2970774,0.5,0.7029226,
0.8707656,0.9745540},{0.0198551,0.1016668,0.2372338,0.4082827,
0.5917173,0.7627662,0.8983332,0.9801449}};
double ga[][8]={{1.0},{0.5,0.5},{0.2777778,0.4444444,0.2777778},{0.1739274,
0.3260726,0.3260726,0.1739274},{0.1184634,0.2393143,0.2844444,
0.2393143,0.1184634},{0.0856622,0.1803808,0.2339570,0.2339570,
0.1803808,0.0856622},{0.0647425,0.1398527,0.1909150,0.2089796,
0.1909150,0.1398527,0.0647425},{0.0506143,0.1111905,0.1568533,
0.1813419,0.1813419,0.1568533,0.1111905,0.0506143}};
//-----------------------------------------------------------------------------
double fp(double x)
{return (x*x/2-1)*asin(x/2)+x/4*sqrt(4-x*x);}
//---------------------------------------------------------------------------
double f(double x)
{return x*asin(x/2);}
//----------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
a=StrToFloat(LabeledEdit1->Text);
b=StrToFloat(LabeledEdit2->Text);
tin=fp(b)-fp(a);
LabeledEdit3->Text=FloatToStr(tin);
f1->Enabled=true;
f2->Enabled=true;
f3->Enabled=true;
LabeledEdit1->Enabled=false;
LabeledEdit2->Enabled=false;
Button1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N_LClick(TObject *Sender)
{
f1->Enabled=false;
f2->Enabled=false;
f3->Enabled=false;
StringGrid1->Visible=false;
PageControl1->Visible=false;
LabeledEdit1->Enabled=true;
LabeledEdit2->Enabled=true;
Button1->Enabled=true;
LabeledEdit3->Text="";
for(int i=0;i<StringGrid1->RowCount;i++)
for(int j=0;j<StringGrid1->ColCount;j++)
StringGrid1->Cells[j][i]="";
for(int i=0;i<StringGrid2->RowCount;i++)
for(int j=0;j<StringGrid2->ColCount;j++)
StringGrid2->Cells[j][i]="";
for(int i=0;i<StringGrid3->RowCount;i++)
for(int j=0;j<StringGrid3->ColCount;j++)
StringGrid3->Cells[j][i]="";
for(int i=0;i<StringGrid4->RowCount;i++)
for(int j=0;j<StringGrid4->ColCount;j++)
StringGrid4->Cells[j][i]="";
Series1->Clear();
Series2->Clear();
Series3->Clear();
Series4->Clear();
Series5->Clear();
Series6->Clear();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f1Click(TObject *Sender)
{
StringGrid1->Visible=true;
StringGrid1->Cells[0][0]=" n";
StringGrid1->Cells[0][1]="Н_Л-Н_К";
StringGrid1->Cells[0][2]="Н_Л-Гаусс";
for(int n=1;n<9;n++)
StringGrid1->Cells[n][0]=" "+IntToStr(n);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f1_N_KClick(TObject *Sender)
{
double h,y;
for(int n=1;n<9;n++){
h=(b-a)/n;
y=0;
for(int i=0;i<n+1;i++)
y+=nkh[n-1][i]*f(a+i*h);
y*=b-a;
StringGrid1->Cells[n][1]=FloatToStrF(tin-y,ffExponent,4,2);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f1_GClick(TObject *Sender)
{
double y;
for(int n=1;n<9;n++){
y=0;
for(int i=0;i<n;i++)
y+=ga[n-1][i]*f(a+(b-a)*gx[n-1][i]);
y*=b-a;
StringGrid1->Cells[n][2]=FloatToStrF(tin-y,ffExponent,4,2);}
}
//--------------------------------------------------------------------------
void __fastcall TForm1::f2_N_KClick(TObject *Sender)
{
double h1,h,y,x;
Series1->Clear();
int n=StrToInt(LabeledEdit4->Text);
for(int k=1;k<21;k++){
h1=(b-a)/k;
h=h1/n;
y=0;
for(x=a;x<b-h/2;x+=n*h)
for(int i=0;i<n+1;i++)
y+=nkh[n-1][i]*f(x+i*h);
y*=h1;
StringGrid2->Cells[k][0]=FloatToStrF(h1,ffFixed,5,4);
StringGrid2->Cells[k][1]=FloatToStrF(tin-y,ffExponent,4,2);
Series1->AddXY(h1,tin-y,"",clBlack);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f2_GClick(TObject *Sender)
{
double h,y,x;
Series2->Clear();
int n=StrToInt(LabeledEdit4->Text);
for(int k=1;k<21;k++){
h=(b-a)/k;
y=0;
for(x=a;x<b-h/2;x+=h)
for(int i=0;i<n;i++)
y+=ga[n-1][i]*f(x+h*gx[n-1][i]);
y*=h;
StringGrid2->Cells[k][0]=FloatToStrF(h,ffFixed,5,4);
StringGrid2->Cells[k][2]=FloatToStrF(tin-y,ffExponent,4,2);
Series2->AddXY(h,tin-y,"",clBlack);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f2Click(TObject *Sender)
{
PageControl1->Visible=true;
StringGrid2->Cells[0][0]=" шаг h";
StringGrid2->Cells[0][1]="Н_Л-Н_К";
StringGrid2->Cells[0][2]="Н_Л-Гаусс";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f3Click(TObject *Sender)
{ PageControl1->Visible=true;
StringGrid3->Cells[0][0]=" eps";
StringGrid4->Cells[0][0]=" eps";
StringGrid3->Cells[0][1]="Н_Л-Н_К";
StringGrid4->Cells[0][1]="Н_К-время";
StringGrid3->Cells[0][2]="Н_Л-Гаусс";
StringGrid4->Cells[0][2]="Гаусс-время";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f3_N_KClick(TObject *Sender)
{
double h1,h,y,ys,x,eps;
Series3->Clear();
Series5->Clear();
int t,k,n=StrToInt(LabeledEdit5->Text);
for(eps=1E-6,k=1;eps<0.011;eps*=10,k++){
h=(b-a)/n;
ys=0;
M: for(x=a,t=0,y=0;x<b-n*h/2;x+=n*h)
for(int i=0;i<n+1;i++)
{y+=nkh[n-1][i]*f(x+i*h);t++;}
y*=n*h;
if(fabs((y-ys)/y)>=eps) {ys=y; h=h/2; goto M;}
StringGrid3->Cells[k][0]=FloatToStrF(eps,ffFixed,7,6);
StringGrid4->Cells[k][0]=FloatToStrF(eps,ffFixed,7,6);
StringGrid3->Cells[k][1]=FloatToStrF(tin-y,ffExponent,4,2);
StringGrid4->Cells[k][1]=IntToStr(t);
Series3->AddXY(eps,tin-y,"",clBlack);
Series5->AddXY(eps,t,"",clBlack);}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::f3_GClick(TObject *Sender)
{
double h,y,x,eps,ys;
Series4->Clear();
Series6->Clear();
int t,k,n=StrToInt(LabeledEdit5->Text);
for(eps=1E-6,k=1;eps<0.011;eps*=10,k++){
h=(b-a);
ys=0;
M: for(x=a,t=0,y=0;x<b-h/2;x+=h)
for(int i=0;i<n;i++)
{y+=ga[n-1][i]*f(x+h*gx[n-1][i]);t++;}
y*=h;
if(fabs((y-ys)/y)>=eps) {ys=y; h=h/2; goto M;}
StringGrid3->Cells[k][2]=FloatToStrF(tin-y,ffExponent,4,2);
StringGrid4->Cells[k][2]=IntToStr(t);
Series4->AddXY(eps,tin-y,"",clBlack);
Series6->AddXY(eps,t,"",clBlack);}
}
//---------------------------------------------------------------------------
17. Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск. В начале выполнения доступны раздел меню Ф-ла Ньютона-Лейбница и окна редактирования, где находятся нижний и верхний пределы интегрирования. После щелчка на разделе меню Ф-ла Ньютона-Лейбница станет доступной кнопка расчет. Щелчок на ней дает точное значение интеграла и делает ее недоступной. Недоступными становятся и окна с пределами интегрирования, а доступными – остальные разделы меню. Теперь пользователь может получить все зависимости согласно заданию. Требуемое значение n можно установить в окне редактирования на первой и второй страницах компонента PageControl1. Щелчок на разделе меню Ф-ла Ньютона-Лейбница приводит к сбросу всех результатов расчетов и позволяет найти точное значение интеграла и получить зависимости для других пределов интегрирования.
18. Щелчком на кнопке конец завершите выполнение задания.
Содержание отчета
1. Задание.
2. Формулы с пояснениями.
3. Результаты выполнения задания в Mathcad ’е.
4. Блок-схемы алгоритмов.
5. Таблица идентификаторов.
6. Код.
7. Результаты выполнения работы в виде таблиц и графиков.
8. Библиографический список.
Контрольные вопросы
1. С какой целью и как интерполируют подынтегральные функции?
2. Как вычисляются и какими свойствами обладают коэффициенты Котеса?
3. Как используются коэффициенты Котеса?
4. Как используются коэффициенты и абсциссы Гаусса?
5. Расскажите о частных случаях формулы Ньютона-Котеса.
6. Приведите иллюстрации вычисления интегралов по частным случаям формулы Ньютона-Котеса.
7. Приведете иллюстрации использования формулы прямоугольников (срединных, левых, правых).
8. Объясните алгоритм вычисления приближенного значения интеграла в вашем задании.
9. Как получить составные формулы в частных случаях методов Ньютона-Котеса и Гаусса?
10. Как сократить затраты машинного времени в алгоритмах на рис. 7.1, 7.3, 7.4, 7.5?
11. Как сократить затраты машинного времени в алгоритмах на рис. 7.7, 7.9?
12. Сравните по затратам машинного времени частные случаи формулы Ньютона-Котеса.
13. Сравните по ошибке интегрирования частные случаи формулы Ньютона-Котеса.
14. Сравните по ошибке интегрирования формулы прямоугольников (срединных, левых, правых).
15. Где, зачем и как используется правило Рунге?
16. Объясните адаптивный алгоритм по методу Ньютона-Котеса.
17. Объясните адаптивный алгоритм по методу Гаусса.
ЧИСЛЕННЫЕ МЕТОДЫ ИНТЕГРИРОВАНИЯ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ (ОДУ) И СИСТЕМ ОДУ
Краткие сведения
Решением обыкновенного дифференциального уравнения (ОДУ)
(1)
называется функция (в графическом варианте её называют также интегральной кривой), определенная в некоторой области
плоскости
, дифференцируемая на некотором интервале
и, следовательно, удовлетворяющая условиям
,
. Задача отыскания решения ОДУ, имеющего начальные значения
,
, называется задачей Коши.
В численных методах решение ОДУ с начальным условием
вычисляется для значений аргумента
Значения
называются узлами, а величина h - шагом интегрирования; через
обозначают значение приближенного решения в узле
.
Дата публикования: 2015-04-07; Прочитано: 281 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!