Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая Кочурова Н.СЭ-11.docx
Скачиваний:
1
Добавлен:
21.09.2019
Размер:
505.45 Кб
Скачать

1.3.2 Руководство пользователя

Программа реализована с использование графического интерфейса вид которого представлен на рис. 1.

Рис. 1. Вид окна программы

Рассмотрим её поподробнее. Окно интерфейса представляет собой две части – панель управления (слева) и область вывода результатов (справа).

На панели управления имеются поля ввода нижней и верхней границы поиска решения, а также позволяется указать результирующую точность, от которой зависит то, как долго будет выполняться алгоритм.

Также программа через выпадающий список позволяет выбрать несколько способов решения:

  1. методом бисекций;

  2. методом Ньютона;

  3. обоими методами одновременно;

Поиск решения сразу двумя методами удобен в случае если необходимо сравнить оба метода (количество затраченных итерация, а значит трудоёмкость и время выполнения).

Стандартные поля ввода чисел среды PascalABC не позволяют вводить пользователю символы не соответствующие формату вещественного числа. Таким образом реализована защита от ввода некорректных данных. Тем не менее, пользователь по-прежнему может допустить ошибку, введя в поле «нижняя граница» значение превышающее содержимое поля «верхняя граница». На данный случай предусмотрена программная проверка введённых значений и в случае ошибки в область результатов выводится сообщение об ошибке: «ОШИБКА! Левая граница больше или равна правой границе. Поиск решения невозможен.».

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

1.3.3 Тексты программы

uses FormsABC;

var

text_common := new TextLabel('Границы поиска');

f1 := new FlowBreak(4);

text_a := new RealField('нижняя:');

text_b := new RealField('верхняя:');

f2 := new FlowBreak();

text_e := new RealField('точность:');

cb := new ComboBox;

but := new Button('Вычислить');

tb: TextBox;

s: string;

// F(x) = sin(x)/cos(x) - 2*x

function CalcF(x: real): real;

begin

CalcF := sin(x)/cos(x)-2*x;

end;

// F'(x) = 1/cos(x)^2 - 2;

function CalcFDer(x: real): real;

begin

CalcFDer := 1/(cos(x)*cos(x)) - 2;

end;

function Sign(x: real): boolean;

begin

if x<0 then

Sign := true

else Sign := false;

end;

function AlgBi(l: real; r: real; e: real): real;

var

dx: real;

m: real;

fl: real;

fr: real;

fm: real;

i: integer;

begin

dx := r-l;

i:=0;

tb.AddLine('Начало поиска решения функции "tan(x) - 2*x = 0" методом бисекций');

tb.AddLine('На интервале ['+l.ToString()+'; '+r.ToString()+'] и с точностью e = '+ e.ToString());

tb.AddLine('------------------------');

while dx > e do

begin

i := i+1;

dx := r-l;

m := l+dx/2;

fl := CalcF(l);

fr := CalcF(r);

fm := CalcF(m);

if Sign(fl) <> Sign(fm) then

r := m

else

l := m;

tb.AddLine('Шаг '+ i.ToString()+ ': x = '+ m.ToString()+' y = ' + fm.ToString());

end;

AlgBi := m;

tb.AddLine('------------------------');

tb.AddLine('Ответ: x = '+ m.ToString()+' y = ' + fm.ToString());

tb.AddLine('Количество итераций:'+i.ToString());

end;

function AlgNuton(l: real; r: real; e: real): real;

var

xn: real;

yn: real;

i: integer;

begin

xn := l;

tb.AddLine('Начало поиска решения функции "tan(x) - 2*x = 0" методом Ньютона');

tb.AddLine('На интервале ['+l.ToString()+'; '+r.ToString()+'] и с точностью e = '+ e.ToString());

tb.AddLine('------------------------');

i:=0;

yn := CalcF(xn);

while abs(yn)>e do

begin

i := i+1;

xn := xn - CalcF(xn)/CalcFDer(xn);

yn := CalcF(xn);

tb.AddLine('Шаг '+ i.ToString()+ ': x = '+ xn.ToString()+' y = ' + yn.ToString());

end;

tb.AddLine('------------------------');

tb.AddLine('Ответ: x = '+ xn.ToString()+' y = ' + yn.ToString());

tb.AddLine('Количество итераций:'+i.ToString());

end;

procedure MyClick;

begin

tb.Text := '';

if text_a.Value >= text_b.Value then

tb.AddLine('ОШИБКА! Левая граница больше или равна правой границе. Поиск решения невозможен.')

else

if cb.SelectedIndex = 0 then

AlgBi(text_a.Value,text_b.Value, text_e.Value)

else

if cb.SelectedIndex = 1 then

AlgNuton(text_a.Value,text_b.Value, text_e.Value)

else

begin

AlgBi(text_a.Value,text_b.Value, text_e.Value);

tb.AddLine(' ');

AlgNuton(text_a.Value,text_b.Value, text_e.Value);

end;

end;

begin

MainForm.Title := 'Расчетно-графическая работа по курсу "Информатика"';

MainForm.SetSize(900,650);

MainForm.SetPos(50,50); //CenterOnScreen;

MainPanel.Dock := DockStyle.Left;

mainPanel.Width := 150;

text_a.Value := -1.5;

text_b.Value := -1;

text_e.Value := 0.001;

cb.Items.Add('Бисекция');

cb.Items.Add('Метод Ньютона');

cb.Items.Add('Оба метода');

cb.SelectedIndex := 0;

but.Click += MyClick;

ParentControl := MainForm;

tb := new TextBox;

tb.Dock := DockStyle.Fill;

end.