
- •Содержание
- •1.1 Постановка задачи 3
- •2. Основы векторной и растровой графики 25
- •2.1 Постановка задачи 25
- •3. Заключение 30
- •1. Основы программирования и численных алгоритмов
- •1.1 Постановка задачи
- •1.1.1 Цель работы
- •1.1.2 Обобщённая формулировка задачи
- •1.2. Анализ задачи
- •1.2.1 Метод бисекции
- •1.2.2 Метод Ньютона
- •1.2.3 Математическое решение задачи
- •1.3 Решение путём написания программы
- •1.3.1 Блок схема программы и блок-схемы алгоритма поиска
- •1.3.2 Руководство пользователя
- •1.3.3 Тексты программы
- •1.3.4 Тестовая задача и результаты прогона тестовой задачи
- •1.4 Решение таблицей в Excel
- •1.4.1 Структура таблицы
- •1.4.2 Таблица в виде формул
- •1.4.3 Макрос
- •1.4.4 Таблица результатов
- •Стоит отметить, что 10 значений явно недостаточно для определения точного результата, который, судя по таблице, расположен в диапазоне [-7.8; -7.72].
- •1.4.5 График результатов
- •1.4.6 Методика применения таблицы
- •1.5. Выводы
- •1.5.1 Сравнение результатов
- •1.5.2 Сравнение методов решения
- •1.5.3 Рекомендации по области применения методов
- •2. Основы векторной и растровой графики
- •2.1 Постановка задачи
- •2.1.1 Цель работы
- •2.1.2 Обобщённая формулировка задачи
- •2.2 Векторная 2d графика
- •2.2.1 Анализ чертежа
- •2.2.2 Описание построения чертежа
- •2.2.3 Чертёж, вставленный в формате gif
- •2.2.4 Чертёж вставленный в Word, в формате wmf
- •2.2.5 Сравнительный анализ качества преобразования изображения
- •2.3 Векторная 3d графика
- •2.3.1 Анализ формы модели
- •2.3.2 Описание построения модели
- •3. Заключение
1.3.2 Руководство пользователя
Программа реализована с использование графического интерфейса вид которого представлен на рис. 1.
Рис. 1. Вид окна программы
Рассмотрим её поподробнее. Окно интерфейса представляет собой две части – панель управления (слева) и область вывода результатов (справа).
На панели управления имеются поля ввода нижней и верхней границы поиска решения, а также позволяется указать результирующую точность, от которой зависит то, как долго будет выполняться алгоритм.
Также программа через выпадающий список позволяет выбрать несколько способов решения:
методом бисекций;
методом Ньютона;
обоими методами одновременно;
Поиск решения сразу двумя методами удобен в случае если необходимо сравнить оба метода (количество затраченных итерация, а значит трудоёмкость и время выполнения).
Стандартные поля ввода чисел среды 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.