Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Выделите форму, щелкнув на ней левой кнопкой мыши, и в свойство Caption (надпись) впишите методы интегрирования дифференциальных уравнений.⇐ ПредыдущаяСтр 37 из 37
В правый верхний угол формы поместите метку Label1 (страница Стандарт). Выделив метку щелчком на ней, установите свойство Font – жирный, размер 10. В свойство Caption метки впишите уравнение. 4. Ниже метки Label1 расположите на форме метку LabeledEdit1 (страница Дополнительно). В свойство Text впишите значение 0, 01. Раскрыв свойство EditLabel, установите подсвойство Font – жирный, размер 8, а в подсвойстве Caption впишите соответственно шаг интегрирования.
Рис.8.9 – форма по окончании проектирования (вид 1)_
Рис.8.10 – форма по окончании проектирования (вид 2)
Рис.8.11 – результаты в виде таблиц
Рис.8.12 – результаты в виде графиков
5. Для размещения исходных данных используйте в качестве таблицы компонент StringGrid1 (страница Дополнительно). Установите следующие значения свойств компонента StringGrid1: ColCount – 6, DefaultColWidth - 48, FixedCols – 0, FixedRows – 1, Font – черный, обычный, размер 8, RowCount – 2. Раскрыв свойство Options, установите значение подсвойства goEditing – true, что даст возможность редактировать содержимое таблицы в StringGrid1. 6. Для вывода результатов в таблицы и графики перенесите на форму многостраничную панель – компонент PageControl1 (страница Win32). Щелкните на нем правой кнопкой мыши и во всплывшем меню дважды используйте команду Новая страница. В свойство Caption первой страницы впишите Таблицы, второй – Графики. Установите свойства компонента PageControl1: MultiLine – false, Style – tsTabs, TabPosition – tpTop. Перенесите на первую страницу (Таблицы) метки Label1 и Label2, в свойство Caption которых впишите соответственно метод РК3 и метод Адамса+РК4, и компоненты StringGrid2 и StringGrid3 (страница Дополнительно), в которых установите: ColCount – 22, DefaultColWidth - 48, FixedCols – 1, FixedRows – 0, Font – черный, обычный, размер 8, RowCount – 3. Перенесите на вторую страницу (Графики) компоненты Chart1 и Chart2 (страница Additional). Свойства компонентов задайте согласно рис.8.10. 7. Перенесите на форму (в правый верхний угол) компонент MainMenu (страница Стандарт), двойным щелчком на нем перейдите в Проектировщик Меню (окно Form1-> MainMenu1) и сконструируйте меню с указанными головными разделами и подразделами; названия записываются в свойство Caption разделов и подразделов: исходные данные шаг интегрирования методы выход методы h/2 РК3 2*h Адамс+РК4 исходный шаг 8. Не выходя из Проектировщика Меню (окно Form1-> MainMenu1), выделите головной раздел исходные данные и в свойство Name впишите icx_dan. В обработчик щелчка на этом разделе впишите (курсив): void __fastcall TForm1:: icx_danClick(TObject *Sender) { Series1-> Clear(); Series2-> Clear(); Series3-> Clear(); Series4-> 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< StringGrid2-> ColCount; j++) for(int i=0; i< StringGrid2-> RowCount; i++){ StringGrid2-> Cells[j][i]=" "; StringGrid3-> Cells[j][i]=" "; } } Выделите подраздел методы и в свойство Name впишите na_metod. В обработчик щелчка на этом разделе впишите (курсив): void __fastcall TForm1:: na_metodClick(TObject *Sender) { metod-> Enabled=true; StringGrid2-> Cells[0][0]=" x"; StringGrid2-> Cells[0][1]=" y"; StringGrid2-> Cells[0][2]=" y'"; StringGrid3-> Cells[0][0]=" x"; StringGrid3-> Cells[0][1]=" y"; StringGrid3-> Cells[0][2]=" y'"; } 9. Заданные имена остальных разделов меню и обработчики щелчков на них нетрудно видеть из приведенного ниже файла LR8.cpp; но следует отметить, что раздел методы имеет имя metod, его свойству Enabled присвоено значение false, а обработчик щелчка на нем отсутствует. //---------------------------------------------------------------------------
#include < vcl.h> #pragma hdrstop
#include " LR8.h" #include< math.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource " *.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1:: TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1:: outClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- double h; void __fastcall TForm1:: icx_danClick(TObject *Sender) { Series1-> Clear(); Series2-> Clear(); Series3-> Clear(); Series4-> 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< StringGrid2-> ColCount; j++) for(int i=0; i< StringGrid2-> RowCount; i++){ StringGrid2-> Cells[j][i]=" "; StringGrid3-> Cells[j][i]=" "; } } //---------------------------------------------------------------------------
void __fastcall TForm1:: na_metodClick(TObject *Sender) { metod-> Enabled=true; StringGrid2-> Cells[0][0]=" x"; StringGrid2-> Cells[0][1]=" y"; StringGrid2-> Cells[0][2]=" y'"; StringGrid3-> Cells[0][0]=" x"; StringGrid3-> Cells[0][1]=" y"; StringGrid3-> Cells[0][2]=" y'"; } //--------------------------------------------------------------------------- void __fastcall TForm1:: dva_hClick(TObject *Sender) { LabeledEdit1-> Text=FloatToStr(2*StrToFloat(LabeledEdit1-> Text)); } //--------------------------------------------------------------------------- void __fastcall TForm1:: pol_hClick(TObject *Sender) { LabeledEdit1-> Text=FloatToStr(0.5*StrToFloat(LabeledEdit1-> Text)); } //--------------------------------------------------------------------------- void __fastcall TForm1:: ich_hClick(TObject *Sender) { LabeledEdit1-> Text=StringGrid1-> Cells[5][1]; } //----------------------------------------------------------------------- void __fastcall TForm1:: RK3Click(TObject *Sender) { double y0, y1, x, xk, dx, k1, k2, k3, l1, l2, l3; int i=1; Series1-> Clear(); Series2-> 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]); do{ if(fmod(x, dx)< h){ StringGrid2-> Cells[i][0]=FloatToStrF(x, ffFixed, 3, 2); StringGrid2-> Cells[i][1]=FloatToStrF(y0, ffExponent, 3, 2); StringGrid2-> Cells[i][2]=FloatToStrF(y1, ffExponent, 3, 2); Series1-> AddXY(x, y0, " ", clBlack); Series2-> AddXY(x, y1, " ", clBlack); i++; } k1=y1; l1=y1-16*y0+exp(-x); k2=y1+h/2*l1; l2=(y1+h/2*l1)-16*(y0+h/2*k1)+exp(-(x+h/2)); k3=y1-h*l1+2*h*l2; l3=(y1-h*l1+2*h*l2)-16*(y0-h*k1+2*h*k2)+exp(-(x+h)); y0=y0+h/6*(k1+4*k2+k3); y1=y1+h/6*(l1+4*l2+l3); x+=h; } while(x< =xk+h);
} //---------------------------------------------------------------------------
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; Series3-> Clear(); Series4-> 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); Series3-> AddXY(x, y0, " ", clBlack); Series4-> AddXY(x, y1, " ", clBlack); i++; k1=y1; l1=y1-16*y0+exp(-x); k2=y1+h/2*l1; l2=(y1+h/2*l1)-16*(y0+h/2*k1)+exp(-(x+h/2)); k3=y1+h/2*l2; l3=(y1+h/2*l2)-16*(y0+h/2*k2)+exp(-(x+h/2)); k4=y1+h*l3; l4=(y1+h*l3)-16*(y0+h*k3)+exp(-(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); Series3-> AddXY(x, y0, " ", clBlack); Series4-> AddXY(x, y1, " ", clBlack); i++; } y000=y00+h/2*(3*y10-y1); y100=y10+h/2*(3*(y10-16*y00+exp(-x))-(y1-16*y0+exp(-(x-h)))); y01=y00+h/2*(y100+y10); y11=y10+h/2*((y100-16*y000+exp(-(x+h)))+(y10-16*y00+exp(-x))); x+=h; } while(x< =xk+h); } 10. Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск. После щелчка на разделе меню исходные данные станет доступным раздел методы и подразделы РК3 и Адамс+РК4. После щелчков на них получим результаты в виде таблиц и графиков (рис.8.11, рис.8.12). 11. Исследуйте влияние шага интегрирования на результаты, изменяя шаг с помощью меню. 12. Исследуйте влияние начальных условий и соотношения шага выдачи результатов к шагу интегрирования на результаты. 13. Щелчком на пункте меню выход завершите выполнение задания.
Содержание отчета 1. Задание. 2. Формулы с пояснениями. 3. Результаты выполнения задания в Mathcad ’е. 4. Блок-схема алгоритма. 5. Таблица идентификаторов. 6. Код. 7. Результаты выполнения работы в виде таблиц и графиков. 9. Библиографический список. Контрольные вопросы 1. Как сравниваются методы интегрирования ДУ? 2. Приведите иллюстрации метода Эйлера и модифицированных методов Эйлера. 3. Приведите пример алгоритма метода РК3. 4. Приведите пример алгоритма метода РК4. 5. Приведите иллюстрацию метода прогноза и коррекции. 6. Как получить оценку ошибки ограничения в методе прогноза и коррекции? 7. Как скорректировать решение ДУ? 8. Приведите пример алгоритма метода прогноза и коррекции. 9. Сравните одношаговые и многошаговые методы интегрирования ДУ. 10. Объясните адаптивный алгоритм интегрирования ДУ методом прогноза и коррекции. 11. Как практически сравнить методы интегрирования ДУ? Что для этого нужно иметь?
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
1. Амосов А.А., Дубинский Ю.А., Копченова Н.В. Вычислительные методы для инженеров: Учеб. пособие.-2-е изд., доп. – М.: Издательство МЭИ, 2003.-596 с. 2. Вержбицкий В.М. Основы численных методов: Учебник для вузов. / В.М. Вержбицкий. - 2-е изд., перераб. - М.: Высш. шк., 2005. - 840 с. 3. Киреев В.И. Численные методы в примерах и задачах: Учеб. пособие / В.И. Киреев, А.В. Пантелеев. - М.: Высш. шк., 2004. - 480 с. 4. Турчак Л.И., Плотников Л.В. Основы численных методов: Учеб. пособие. - М.: ФИЗМАТЛИТ, 2003.- 304 с. 5. Чуркин В.В. Сборник заданий по вычислительным методам / В.В. Чуркин. - Киров: Изд-во ВятГУ, 2009. - 64 с. 6. Чуркин В.В. Лабораторные работы по вычислительным методам в среде C++ Builder 6 / В.В.Чуркин. – Киров: Изд-во ВятГУ, 2010. – 66 с. 7. Гурский Д.А. Вычисления в MathCAD / Д.А. Гурский. - Минск.: Новое знание, 2003. - 814 с. 8. Кирьянов Д.В. Самоучитель Mathcad 11. - СПб.: БХВ-Петербург, 2004. - 560 с. 9. Плис А.И., Сливина Н.А. Mathcad. Математический практикум для инженеров и экономистов: Учеб. пособие. – 2-е изд., перераб. и доп. – М.: Финансы и статистика, 2003. – 656 с. 10. Макаров Е. Инженерные расчеты в Mathcad 14 (+CD) – СПб.: Питер, 2007. – 592 с.
|