Программирование и исследование алгоритмов решения неленейных уравнений. Метод секущихся (хорд)
Уфимский государственный авиационный
технический университет
Филиал в
городе Стерлитамак
Кафедра
естественнонаучных и общепрофессиональных дисциплин
Пояснительная
записка к курсовой работе
Программирование
и исследование алгоритмов решения неленейных уравнений. Метод секущихся (хорд)
Студент
Харисов А.И.
Группа ЭЭ и ЭС-103д
Проверил
Консультант Карасева Л.М.
Стерлитамак
2013 г.
Содержание
Введение
.
Теоретическая часть
.1
Математическая модель метода
1.2 Блок-схема алгоритма метода
. Практическая
часть
.1 Создание
интерфейса приложения
.2
Кодирование метода
.3
Визуализация
.4
Вычислительный эксперимент
.5 Сравнение
результатов
Заключение
Список
литературы
Введение
Актуальность: в связи с развитием новой вычислительной техники инженерная
практика наших дней все чаще и чаще встречается с математическими задачами,
точное решение которых получить весьма сложно или невозможно. В этих случаях
обычно прибегают к тем или иным приближенным вычислениям. Вот почему
приближенные и численные методы математического анализа получили за последние
годы широкое развитие и приобрели исключительно важное значение.
Цель: реализация численных методов решения нелинейных уравнений на языке
программирования в соответствии с заданным вариантом; графическая иллюстрация
данного метода с последовательным уточнением корня; сравнение полученного
результата с решением в математическом пакете.
Задача: создать в IDE Lazarus приложение, которое будет находить решение
нелинейного уравнения 2ln2x+6lnx-5=0 на интервале [1;3]. Пользователь
должен будет вводить исходный интервал и точность определения корня уравнения.
Для расчёта использовать метод секущихся (хорд). Результат вычисления
сохранить в текстовый файл. Иллюстрировать данный метод графически с
последовательным уточнение корня.
Выполнить решение в математическом пакете и сравнить полученный результат
с результатом работы созданного приложения.
Приложение должно содержать не менее трёх окон, а также текстовое меню в
главном окне, позволяющее выполнить основные действия.
1. Теоретическая часть
.1
Математическая модель метода
Идея метода хорд состоит в том, что можно, с известным приближением,
допустить, что функция f(x) на достаточно малом участке [a,b] изменяется
линейно, т.е. кривую y=f(x) на этом участке можно заменить хордой.
Тогда начальное приближение корня x=c будет находиться в точке
пересечения отрезка [a,b] хордой, проходящей через точки (a,f(a)) и (b,f(b)).
Далее, применяя этот прием к тому из отрезков (a, c) или (c,b), на котором
функция имеет разные знаки, получим следующее приближение корня (см. Рисунок
1).
Рисунок 1-Графическая интерпретация метода секущихся (хорд)
Уравнение хорды записывается как уравнение прямой проходящей через точки
с координатами:
(a,f(a)) и (b,f(b)) имеет вид:
(1)
Прямая, заданная уравнением (1), пересекает ОХ при условии у=0. Тогда
точка пересечения хорды с OX находится по формуле:
Отсюда
обозначим через с
(2)
Алгоритм, реализующий метод секущихся (хорд), можно представить так:
По формуле (2) найти точку c.
Если < 0, то корень лежит на участке [a,c], если нет, то корень
лежит на участке [c,b].
Если абсолютное значение f(c) не превышает некоторое достаточное малое
число e, то найден корень с точностью e, иначе возвращаемся в пункт 1.
1.2
Блок-схема алгоритма метода
Рисунок 2 - Блок-схема метода
2.
Практическая часть
.1 Создание
интерфейса приложения
Создадим первую форму. Она будет являться главным окном программы поэтому
с помощью свойства Caption зададим название "Главная". Разместим на
главном окне меню с помощью которого сможем переходить на другие формы. Для
этого на панели Standard выберем MainMenu и щёлкнем по главной форме. В
редакторе меню создадим три пункта: решение, об авторе, выход. В пункте решение
создадим подменю состоящее из: ввод данных, решение уравнения, иллюстрация. Для
каждого пункта кроме "Выход", создадим формы с такими же названиями.
Для того, чтобы придать форме интересный фон, достаточно вставить
картинку. Для этого нужно воспользоваться объектом Image. Заходим в свойства
данного объекта- Picture, и загружаем нужное нам изображение.
На форме "Главная" вводим информацию об авторе данной работы и,
непосредственно, название темы, воспользовавшись объектом Label .
На рис. 3 представлено изображение первой формы "Главная".
Рисунок 3 - Вид главной формы
На форме "Ввод данных" создадим три поля для
ввода начала отрезка, конца отрезка и точность вычисления. Для этого
воспользуемся объектом label:a ,b ,e и объектом edit, для ввода этих значений .
Так же создадим две кнопки "ОК", при нажатии которой будет переход на
форму "Решение уравнения", и кнопку "Закрыть" для закрытия
формы "Ввод данных".
Затем, в левый нижний угол помещаем еще один объект Label, чтобы ввести
необходимую информацию о задании и об авторе.
На рис. 4 представлено изображение второй формы "Ввод данных".
Рисунок 4 - Вид формы "Ввод данных"
На форме "Решение уравнения" создаём объект
label "x=", объект edit для вывода ответа, три объекта Button
"Решить", "Сохранить", "Закрыть".
Затем, в левый нижний угол помещаем еще один объект Label, чтобы ввести
необходимую информацию о задании и об авторе.
На рис. 5 представлено изображение третьей формы "Решение
уравнения".
Рисунок 5 - Вид формы "Решение уравнения"
На форме "Иллюстрация" помещаем объект Chart, для представления
иллюстрации метода хорд, объект Edit для ввода шага табуляции (h), объект Label
(h), и два объекта Button "Иллюстрировать" и BitBtn "Закрыть".
Затем, в левый нижний угол помещаем еще один объект Label, чтобы ввести
необходимую информацию о задании и об авторе.
На рис. 6 представлено изображение четвертой формы
"Иллюстрация".
Рисунок 6 - Вид формы "Иллюстрация"
Рисунок 7 - Вид формы "Об авторе"
Далее создаем связь между формами и пунктами меню, в
инспекторе объектов в Unit1:
implementationunit2,Unit3,unit4,unit5;TForm1.MenuItem6Click(Sender:
TObject);
form1.close;
end;
приложение нелинейный уравнение хорда
Нажатие на пункт меню "Выход" закрывает форму.
TForm1.MenuItem2Click(Sender:
TObject);.show;;
Щелкнув на пункт меню "Ввод данных", открывается
форма "Ввод данных";
procedure TForm1.MenuItem3Click(Sender: TObject);
begin.show;;
Нажатие на кнопку "Решение уравнения" вызывает форму
"Решение уравнений";
procedure TForm1.MenuItem4Click(Sender: TObject);
begin.show;;
При нажатии в главном меню на пункт "Иллюстрация" появляется
окно "Иллюстрация";
procedure TForm1.MenuItem5Click(Sender: TObject);.show;;
Щелкнув на пункт меню "Об авторе", открывается
форма "Об авторе";
procedure TForm2.Button1Click(Sender: TObject);.Close;.show;
end;
При нажатии кнопки "ОК" во второй форме происходит закрытие
формы "Ввод данных" и открытие формы "Решение уравнения";
Таким образом, нажав на один из пунктов меню, будет открываться
определенная форма, а при нажатии на пункт меню "Выход", программа
закроется.
2.2
Кодирование метода
Так как функция F=2ln2(x)+6ln(x)-5 будет использоваться в нескольких
формах, опишем её глобально.
Подпрограмма функции:
{ TForm1 }TForm1.F(x: real) :real;:=2*sqr(ln(x))+6*ln(x)-5;
end;
В редакторе исходного кода в Unit 3 вводим текст программы для решения
данного нелинейного уравнения.
procedure
TForm3.Button2Click(Sender: TObject); var a,b,c,e:real;
|
В разделе var описываем
переменные;
|
begin
a:=StrToFloat(Form2.Edit1.Text); b:=StrToFloat(Form2.Edit2.Text);
e:=StrToFloat(Form2.Edit3.Text);
|
Присваиваем переменным
a,b,e значения, введенные во второй форме в Edit1, Edit2,Edit3;
|
repeat
c:=a-((Form1.F(a))/(Form1.F(b)-Form1.F(a)))*(b-a); if Form1.F(c)=0 then break
else begin if (Form1.F(c))*(Form1.F(a))<0 then b:=c else a:=c end; until
abs(Form1.F(c))<e ;
|
Начало цикла с
постусловием. Вычисление приближенного значения. Form1.F(c)=0-условие для
выхода из цикла, нахождение корня. Проверка условия, в результате которого
выбирается иной промежуток приближения корня. Условие выхода из цикла: F(c)
по модулю будет больше достаточно малого числа е.
|
edit1.text:=floattostr(c);
end;
|
Полученный ответ выводим в
Edit1 на третьей форме.
|
Далее, вводим программу для создания текстового файла 'Kharisov.txt' и
сохранения в него полученного результата.
procedure TForm3.Button3Click(Sender: TObject); var F:TextFile
|
|
begin
AssignFile(F,'Kharisov.txt');
|
Название файла;
|
Rewrite(F);
|
Команда создает новый файл
F и открывает его;
|
Writeln(F,Edit1.Text); CloseFile(F); end;
|
Запись результата; Закрытие
файла.
|
2.3
Визуализация
В Unit4 в подразделе uses подключаем математический модуль Math. В
подразделе uses вводим unit2.
var H, a, b, c,
x: real;
|
В разделе var описываем
переменные;
|
begin
a:=StrToFloat(Form2.Edit1.Text); b:=StrToFloat(Form2.Edit2.Text); x:=a;
H:=strtofloat(form4.edit1.text); chart1lineSeries1.Clear;
chart1lineSeries2.Clear; chart1lineSeries3.Clear; chart1lineSeries4.Clear;
|
Присваиваем переменным a и
b значения, введенные во второй форме в Edit1 и Edit2. Для каждой серии
вводим Chart1LineSeries1.Clear., чтобы при введении последующего значения
h,предыдущие очищались, т.е. строился новый график;
|
while x<=b do
begin chart1lineseries1.addxy(x,Form1.F(x)); x:=x+H; end;
|
Цикл с предусловием, для
построения графика функции;
|
chart1lineseries2.addxy(a,Form1.F(a));
chart1lineseries2.addxy(b,Form1.F(b)); c:=
a-((Form1.F(a))/(Form1.F(b)-Form1.F(a)))*(b-a); if
(Form1.F(a))*(Form1.F(c))<0 then b:=c else a:=c;
chart1lineseries3.addxy(a,Form1.F(a)); chart1lineseries3.addxy(b,Form1.F(b));
c:= a-((Form1.F(a))/(Form1.F(b)-Form1.F(a)))*(b-a); if
(Form1.F(a))*(Form1.F(c))<0 then b:=c else a:=c;
chart1lineseries4.addxy(a,Form1.F(a)); chart1lineseries4.addxy(b,Form1.F(b));
end;
|
Построение первой хорды;
Вычисление приближенного значения. Проверка условия для выбора промежутка;
Построение второй хорды для нахождения приближенного значения. Проверка
условия для выбора промежутка; Построение третьей хорды для нахождения
приближенного значения.
|
2.4
Вычислительный эксперимент
Запускаем созданное приложение. На главном окне щелкаем по пункту меню
"Ввод данных", открывается соответствующая форма.
Рисунок 8 - "Главная"
На форме "Ввод данных" вводим значения начала (a) и конца (b)
промежутка, точность (e).
Рисунок 9 - "Ввод данных"
Затем, щелкнув на кнопку "ОК" мы переходим на следующую форму
"Решение уравнения". В открывшейся форме нажимаем на кнопку
"Решить", в окне появляется ответ. При нажатии на кнопку
"Сохранить", данное решение будет сохранено в текстовом документе.
Рисунок 10 - "Решение уравнения"
Щелкаем по пункту меню "Иллюстрация", открывается нужное нам
окно. Вводим определенный шаг табуляции (H) и нажимаем на кнопку
"Иллюстрировать". Выполняется построение графика и три
соответствующие хорды.
Рисунок 11 - "Иллюстрация"
Щелкаем по следующему пункту меню, открывается окно "Об
авторе", где дана информация о курсовой работе.
Рисунок 12 - "Об авторе"
Щелкнув по пункту меню "Выход", закрывается главное окно и все
приложение целиком.
2.5 Сравнение
результатов
При решение данного уравнения в математическом пакете Maxima получили
следующий результат:
Рисунок 14 - Решение в приложении при е=0,01
Рисунок 15 - Решение в приложении при е =0,0001
Вывод: Таким образом, с помощью данного приложения мы можем получить
решение уравнения. Точность решения тем больше, чем меньше число е.
Заключение
Закрепили и углубили теоретические и практические навыки работы на
компьютере, умения решать инженерные задачи в изучаемой среде программирования,
реализовали численные методы решения нелинейных уравнений на языке
программирования в соответствии с заданным вариантом.
Изучили метод хорд, и решили нелинейное уравнение 2ln2x+6lnx-5=0 с его
помощью. Создали приложение в IDE Lazarus, которое находит решение данного
нелинейного уравнения, сохраняет результат в текстовый документ, а также иллюстрирует
метод решения с последовательным уточнением корня. Выполнили решение в
математическом пакете Maxima и сравнили полученный результат с результатом
работы созданного приложения.
Список
литературы
1. Голицина
О.Л., Партыка Т.Л., Попов И.И. Языки программирования. - М.: Инфра-М, 2008.
. Макарова
Н.В., Волков В.Б. Информатика. - М.: Питер, 2011.
. Постовалов
С.Н., Постовалова А.Ю. Уроки программирования. Москва, БХВ-Петербург, 2006.
. Кашаев
С.М. Учимся программировать на примерах. - Санкт-Петербург, БХВ-Петербург,
2010.
. Степанов
А. Информатика: базовый курс. - М.: Питер, 2010.
. Филимонова
Е.В. Практический самоучитель. - Санкт-Петербург, Феникс, 2007.
. Острейковский
В.А. Информатика. - М.: Высшая школа, 2007. - 512 с.