Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Для создания интерфейса воспользуйтесь компонентом MainMenu (страница Стандарт) – главное меню, и свойствами компонентов Enabled- доступный и Visible –видимый.
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 - шагом интегрирования; через обозначают значение приближенного решения в узле .
|