Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






ЗАДАНИЕ. 1. В Mathcad’е по заданному из таблицы варианту (см






1. В Mathcad’ е по заданному из таблицы варианту (см. примечание) уравнения построить график в диапазоне значений аргумента и найти значение корня (корней, если их несколько). Затем построить график в диапазоне значений аргумента и нанести на график линии сетки так, чтобы одна из горизонтальных линий проходила через нуль по оси ординат.

Примечание: 1 – метод деления пополам, 2 – метод хорд, 3 – метод касательных, 4 – метод секущих, 5 – метод итераций.

2. Составить алгоритм и написать код для отделения корня (корней) уравнения в диапазоне значений аргумента с шагом

3. Составить алгоритм и написать код для уточнения значения корня (или одного из корней, если их несколько) заданным методом (методами). Получить таблицу и графики зависимостей временных затрат на уточнение корня от задаваемой погрешности e (диапазон изменения ). Пример алгоритма представлен на рис.1.15.

 

Таблица

Вариант Уравнение Используемый метод
  1, 3 (комбинация)
  2, 4 (комбинация)
  1, 4 (комбинация)
  2, 5 (комбинация)
  1, 5 (комбинация)
  1, 3, 5
  2, 4
  1, 2, 3
  2, 3 (комбинация)
  4, 5
  1, 3, 4
  2, 3
  1, 5
  3, 5
  2, 4
  1, 2
  1, 3 (комбинация)
  1, 5 (комбинация)
  2, 3, 5
  1, 4, 5
  2, 3, 4
  1, 3
  2, 4
  1, 4
  2, 5
  1, 3
  2, 4
  1, 2, 3
  2, 4, 5
  1, 3 (комбинация)

 

Рассмотрим пример проектирования приложения для исследования методов деления пополам и секущих при решении нелинейного уравнения . Решение уравнения выполняют в два этапа.

Этап 1. Отделить корень (корни) уравнения в диапазоне значений аргумента с шагом .

Этап 2. Уточнить значение корня (или одного из корней, если их несколько) методами деления пополам и секущих. Получить таблицы и графики зависимостей временных затрат на уточнение корня от задаваемой погрешности (диапазон изменения ).

1. Создайте для проектов приложений по численным методам папку (каталог) с именем ЧИСЛ_МЕТ и запустите C++Builder 6.

2. Создайте новый проект командой Файл/Новый/Приложение.

3. Сохраните файлы модуля и проекта командой Файл / Сохранить все под именами LR1 и PR_LR1. Для этого удобно использовать соответствующую быструю кнопку (Сохранить все). В последующих сеансах работы сохраненный проект можно открыть командой Файл/Открыть проект (или Повторно открыть). Теперь перейдем к проектированию приложения - переносам на форму необходимых компонентов и заданию их свойствам значений, а в обработчиках событий – размещению кодов соответствующих алгоритмов. (Рекомендуется нажимать кнопку Сохранить все по окончании работы с каждым компонентом.) В результате проектирования получим форму, представленную на рис.1.16. Выделите форму, щелкнув на ней левой кнопкой мыши, и в свойство Caption (надпись) впишите МЕТОДЫ РЕШЕНИЙ НЕЛИНЕЙНЫХ УРАВНЕНИЙ.

 

Рис.1.16 – форма по окончании проектирования

 

В левый верхний угол формы поместите метку Label1 (со страницы Стандарт библиотеки компонентов). Выделив метку щелчком на ней, установите свойство Font – жирный, размер 12. В свойство Caption метки впишите.

5. Ниже метки, по горизонтали, расположите на форме три метки: LabeledEdit1, LabeledEdit2 и LabeledEdit3 (страница Дополнительно). Для всех трех меток свойству LabelPosition присвойте значение lpLeft (из выпадающего списка), свойству Font – жирный, размер 10, свойству Text – значения -5; 5; 0, 1 соответственно. Раскрывая свойство EditLabel, для всех трех меток установите подсвойство Font – жирный, размер 10, а в подсвойстве Caption впишите соответственно xn=, xk=, dx=.

6. Ниже меток поместите кнопку Button1 (страница Стандарт), для которой установите свойство Font – жирный, размер 10, а в свойство Caption впишите Отделение корней.

7. Ниже кнопки поместите окно редактирования многострочного текста - компонент Memo1 (страница Стандарт), для которого установите шрифт Font – обычный, размер 10.

8. Двойным щелчком на кнопке Button1 перейдите в обработчик события – щелчка на кнопке. Перед обработчиком впишите определение функции, а в обработчик щелчка на кнопке Button1 поместите код алгоритма отделения корней (курсив):

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

float f(float x)

{return 3*cos(2*x)+exp(-0.5*x)-2; }

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

void __fastcall TForm1:: Button1Click(TObject *Sender)

{

float xn, xk, dx, x, y, y1, a, b;

int m;

xn=StrToFloat(LabeledEdit1-> Text);

xk=StrToFloat(LabeledEdit2-> Text);

dx=StrToFloat(LabeledEdit3-> Text);

x=xn; y=f(x); m=0;

Memo1-> SetFocus();

Memo1-> Clear();

AnsiString s;

P: x+=dx;

s=" ";

if(x> xk){s=s+" Всего корней: " +IntToStr(m);

Memo1-> Lines-> Add(s);

LabeledEdit4-> SetFocus();

return; }

else

{ y1=f(x);

if(y*y1< =0) {m++; b=x; a=b-dx;

s=s+IntToStr(m)+" -й корень: ";

if(a> =0)s=s+" a= ";

else s=s+" a=";

s=s+FloatToStrF(a, ffFixed, 4, 2);

if(b> =0)s=s+" b= ";

else s=s+" b=";

s=s+FloatToStrF(b, ffFixed, 4, 2);

Memo1-> Lines-> Add(s); }}

y=y1; goto P;

}

Кроме того, в этом же файле, файле LR1.cpp, после директивы #include " LR1.h" поместите директиву #include< math.h>.

9. Быстрой кнопкой “ Переключатель Форма/Модуль F12” или клавишей F12 вызовите на экран форму. Ниже окна редактирования Memo1 поместите кнопку Button2, в свойство Caption которой впишите Уточнение корня в промежутке жирным шрифтом размера 10.

10. В обработчике щелчка на кнопке Button2 напишите (курсив):

void __fastcall TForm1:: Button2Click(TObject *Sender)

{

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

StringGrid1-> Cells[1][0]=" корень x";

StringGrid1-> Cells[2][0]=" f(x)";

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

StringGrid2-> Cells[0][0]=" eps";

StringGrid2-> Cells[1][0]=" корень x";

StringGrid2-> Cells[2][0]=" f(x)";

StringGrid2-> Cells[3][0]=" n";

}

11. Под кнопкой Button2 по горизонтали разместите две метки LabeledEdit (4 и 5). Свойству LabelPosition меток присвойте значение lpLeft (из выпадающего списка), свойству Font – жирный, размер 10, свойству Text - значения -5 и 5 соответственно. Раскрывая свойство EditLabel, для обеих меток установите подсвойство Font – жирный, размер 10, а в подсвойстве Caption впишите соответственно а=, b=.

12. Внизу формы, по всей ее ширине, разместите две таблицы - два компонента StringGrid1 и StringGrid2 (страница Дополнительно), а над ними – соответственно – кнопки Button3 и Button4. В свойство Caption кнопок внесите соответственно (шрифт Font – жирный, размер 10) Метод деления пополам и Метод секущих, а в обработчиках щелчка на кнопках напишите коды соответствующих алгоритмов (курсив):

void __fastcall TForm1:: Button3Click(TObject *Sender)

{ double a, b, c, d, eps, x, y, y1;

int n, i;

c=StrToFloat(LabeledEdit4-> Text);

d=StrToFloat(LabeledEdit5-> Text);

Series1-> Clear();

for(eps=0.01, i=1; eps> 0.000001; eps*=0.1, i++)

{ a=c; b=d;

n=0;

A: x=a;

y=f(x); n++;

x=(a+b)/2; y1=f(x); n++;

if(y*y1< =0) {if(fabs(x-a)> =eps){b=x; goto A; }}

else {if(fabs(x-b)> =eps){a=x; goto A; }}

StringGrid1-> Cells[0][i]=FloatToStrF(eps, ffFixed, 5, 5);

StringGrid1-> Cells[1][i]=FloatToStrF(x, ffFixed, 9, 8);

StringGrid1-> Cells[2][i]=FloatToStrF(y1, ffExponent, 5, 2);

StringGrid1-> Cells[3][i]=IntToStr(n);

Series1-> AddXY(eps, n, " ", clBlack);

}

}

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

void __fastcall TForm1:: Button4Click(TObject *Sender)

{ double a, b, eps, x0, x1, y0, y1, t;

int n, i;

a=StrToFloat(LabeledEdit4-> Text);

b=StrToFloat(LabeledEdit5-> Text);

Series2-> Clear();

for(eps=0.01, i=1; eps> 0.000001; eps*=0.1, i++)

{ x0=a; x1=b;

y0=f(x0); y1=f(x1); n=2;

do{

t=y1/((y1-y0)/(x1-x0));

x0=x1; x1-=t;

y0=y1; y1=f(x1); n++;

}while(fabs(t)> =eps);

StringGrid2-> Cells[0][i]=FloatToStrF(eps, ffFixed, 5, 5);

StringGrid2-> Cells[1][i]=FloatToStrF(x1, ffFixed, 9, 8);

StringGrid2-> Cells[2][i]=FloatToStrF(y1, ffExponent, 5, 2);

StringGrid2-> Cells[3][i]=IntToStr(n);

Series2-> AddXY(eps, n, " ", clBlue);

}

}

13. Теперь файл LR1.cpp будет выглядеть следующим образом:

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

#include < vcl.h>

#pragma hdrstop

#include " LR1.h"

#include< math.h>

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

#pragma package(smart_init)

#pragma resource " *.dfm"

TForm1 *Form1;

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

__fastcall TForm1:: TForm1(TComponent* Owner)

: TForm(Owner)

{

}

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

float f(float x)

{return 3*cos(2*x)+exp(-0.5*x)-2; }

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

void __fastcall TForm1:: Button1Click(TObject *Sender)

{float xn, xk, dx, x, y, y1, a, b;

int m;

xn=StrToFloat(LabeledEdit1-> Text);

xk=StrToFloat(LabeledEdit2-> Text);

dx=StrToFloat(LabeledEdit3-> Text);

x=xn; y=f(x); m=0;

Memo1-> SetFocus();

Memo1-> Clear();

AnsiString s;

P: x+=dx;

s=" ";

if(x> xk){s=s+" Всего корней: " +IntToStr(m);

Memo1-> Lines-> Add(s);

LabeledEdit4-> SetFocus();

return; }

else

{ y1=f(x);

if(y*y1< =0) {m++; b=x; a=b-dx;

s=s+IntToStr(m)+" -й корень: ";

if(a> =0)s=s+" a= ";

else s=s+" a=";

s=s+FloatToStrF(a, ffFixed, 4, 2);

if(b> =0)s=s+" b= ";

else s=s+" b=";

s=s+FloatToStrF(b, ffFixed, 4, 2);

Memo1-> Lines-> Add(s); }}

y=y1; goto P;

}

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

void __fastcall TForm1:: Button2Click(TObject *Sender)

{StringGrid1-> Cells[0][0]=" eps";

StringGrid1-> Cells[1][0]=" корень x";

StringGrid1-> Cells[2][0]=" f(x)";

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

StringGrid2-> Cells[0][0]=" eps";

StringGrid2-> Cells[1][0]=" корень x";

StringGrid2-> Cells[2][0]=" f(x)";

StringGrid2-> Cells[3][0]=" n";

}

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

void __fastcall TForm1:: Button3Click(TObject *Sender)

{

double a, b, c, d, eps, x, y, y1;

int n, i;

c=StrToFloat(LabeledEdit4-> Text);

d=StrToFloat(LabeledEdit5-> Text);

Series1-> Clear();

for(eps=0.01, i=1; eps> 0.000001; eps*=0.1, i++)

{ a=c; b=d;

n=0;

A: x=a;

y=f(x); n++;

x=(a+b)/2; y1=f(x); n++;

if(y*y1< =0) {if(fabs(x-a)> =eps){b=x; goto A; }}

else {if(fabs(x-b)> =eps){a=x; goto A; }}

StringGrid1-> Cells[0][i]=FloatToStrF(eps, ffFixed, 5, 5);

StringGrid1-> Cells[1][i]=FloatToStrF(x, ffFixed, 9, 8);

StringGrid1-> Cells[2][i]=FloatToStrF(y1, ffExponent, 5, 2);

StringGrid1-> Cells[3][i]=IntToStr(n);

Series1-> AddXY(eps, n, " ", clBlack);

}

}

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

void __fastcall TForm1:: Button4Click(TObject *Sender)

{ double a, b, eps, x0, x1, y0, y1, t;

int n, i;

a=StrToFloat(LabeledEdit4-> Text);

b=StrToFloat(LabeledEdit5-> Text);

Series2-> Clear();

for(eps=0.01, i=1; eps> 0.000001; eps*=0.1, i++)

{ x0=a; x1=b;

y0=f(x0); y1=f(x1); n=2;

do{

t=y1/((y1-y0)/(x1-x0));

x0=x1; x1-=t;

y0=y1; y1=f(x1); n++;

}while(fabs(t)> =eps);

StringGrid2-> Cells[0][i]=FloatToStrF(eps, ffFixed, 5, 5);

StringGrid2-> Cells[1][i]=FloatToStrF(x1, ffFixed, 9, 8);

StringGrid2-> Cells[2][i]=FloatToStrF(y1, ffExponent, 5, 2);

StringGrid2-> Cells[3][i]=IntToStr(n);

Series2-> AddXY(eps, n, " ", clBlue);

}

}

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

14. Установим в компонентах StringGrid1 и StringGrid2 следующие значения свойств: шрифт Font – обычный, размер 10, ColCount – 4, RowCount – 5, FixedCols – 0, FixedRows – 1, FixedColor – clWhite, ScrollBarsssNone.

15. В правую верхнюю часть формы поместите компонент Chart1 (страница Additional). Установим в нем те значения свойств, которые могут быть заданы или известны к данному моменту времени. Щелкните правой кнопкой мыши на компоненте Chart1 и в появившемся меню выберите Edit Chart …. На экране появится окно Редактора Диаграмм (Editing Chart1) с открытой страницей Chart, которая имеет несколько закладок. На закладке Panel, нажав кнопку Panel Color…, выберите белый цвет. На закладке Series щелкните на кнопке Add… - добавить серию. В появившемся окне выберите тип графика – Line и выключите индикатор 3D. После щелчка на OK снова появится окно Editing Chart1. Перейдите на закладку Titles. В окне редактирования, которое в данный момент соответствует Title – заголовку графика, сотрите TChart и напишите (шрифт Font… - черный, жирный, размер 10) Зависимости временных затрат от ошибки. В группе кнопок Alignment оставьте нажатой кнопку Center. Цвет фона Back Color.. установите белый.В выпадающем списке от окна редактирования Title перейдите в окно редактирования Foot и напишите тем же шрифтом ошибка eps. В группе кнопок Alignment нажмите кнопку Right. Цвет фона Back Color.. также установите белый. Перейдите на закладку Axis для задания координатных характеристик осей. Оставьте в группе Axis нажатой кнопку Left и включенным индикатор Automatic. Затем нажмите в группе Axis кнопку Bottom, выключите индикатор Automatic ивключите индикатор Logarithmic. Нажмите нижнюю кнопку Change… и в окне Value редактора Minimum Bottom Axis впишите значение 0, 00001. Аналогичные действия выполните с верхней кнопкой Change…, но впишите число 0, 01. Затем перейдите на закладку Labels и в окне редактирования Values Format значение # ##0, ### замените, добавив в него справа ##, на значение # ##0, #####. Перейдите на закладку Series, кнопкой Add… добавьте еще один график Line при выключенном индикаторе 3D. Выделив Series 1, кнопкой Title … вызовите Change Series Title, где дайте заголовок первому графику – Метод деления пополам. Действуя подобным образом, т.е. выделив Series 2, дайте заголовок второму графику – Метод секущих. На вкладке Legend нажмите кнопку Top. Перейдите со страницы Chart на страницу Series. Здесь на закладке Format задают параметры линий графиков. Требуемый график (Метод деления пополам, Метод секущих) выбирается из выпадающего списка. В группе Line через кнопку Border… устанавливается толщина (Width) линии графика, а через кнопку Color… - цвет линии графика. Для обоих графиков следует выключить индикатор Color Each. Задайте для первого графика тройную толщину линии черного цвета, для другого – двойную толщину линии черного цвета.

 

Рис.1.17 – результаты выполнения задания

16. Выше на закладке Axis задавались координатные характеристики осей. При этом в группе Axis при нажатой кнопке Left был оставлен включенным индикатор Automatic, поскольку по оси ординат (Left) неизвестен диапазон откладываемых значений n. Чтобы установить его и этим завершить проектирование приложения, запустим приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск. (Забегая вперед, приведем форму по окончании выполнения задания – рис.1.17).

17. После компиляции щелкните на кнопке Отделение корней. Результат отделения корней будет выведен в Memo1. Введите границы промежутка для одного из корней, например, a= 0, 5 b= 0, 6. Щелкните на кнопке Уточнение корня в промежутке, что вызовет появление заголовков таблиц. Затем щелкните на кнопках Метод деления пополам и Метод секущих. Из таблиц видно, что максимальное значение n оказалось равным 28.

18. Щелкните на кнопке формы “ Закрыть ”, чтобы продолжить проектирование приложения. Вернитесь к заданию координатных характеристик осей компонента Chart1 на закладке Axis. В группе Axis при нажатой кнопке Left выключите индикатор Automatic. Нажав нижнюю кнопку Change…, выставите минимальное значение, равное 0, а затем при нажатой верхней кнопке Change… выставите максимальное значение, равное 30. На этом проектирование приложения завершается.

19. Сохранив изменения, запустите проект на выполнение. Результаты выполнения задания представлены на рис.1.17.

20. Для завершения работы щелкните на кнопке формы “ Закрыть ” и выйдите из среды Builder.

 

Содержание отчета

1. Задание.

2. Формулы и иллюстрации методов.

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

4. Блок-схема алгоритма с таблицей идентификаторов.

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

6. Результаты выполнения работы в виде таблицы и графиков.

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

 

Контрольные вопросы

1. Какие виды нелинейных уравнений можно решать численными методами?

2. Расскажите об отделении корней, приведя иллюстрацию для своего задания. Как выбирается величина ?

3. Сравните методы деления пополам и хорд.

4. Сравните методы касательных и секущих.

5. Как перейти от уравнения к равносильному ему уравнению ? Объясните алгоритм метода итераций.

6. Расскажите об условиях применения методов уточнения корней.

7. Как зависит в численных методах значение функции в корне от величины задаваемой ошибки?

8. Приведите примеры комбинации методов. Поясните их целесообразность.

9. Приведите алгоритмы для получения зависимостей затрат машинного времени от ошибки для методов в задании.

10. Объясните полученные результаты.

11. Как построить класс для выполнения задания? В каких файлах и как можно разместить объявление класса и его реализацию?

 


 

ЧИСЛЕННЫЕ МЕТОДЫ ИНТЕРПОЛЯЦИИ И ЭКСТРАПОЛЯЦИИ

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.