МІНІСТЕРСТВО ОСВІТИ
Державна освітня установа вищої
НАУКИ «Кемеровський
ДЕРЖАВНИЙ УНІВЕРСИТЕТ »
Математичний факультет
Кафедра автоматизації досліджень і технічної кібернетики
Реферат
"Рішення нелінійних рівнянь методом поділу відрізка навпіл"
студента 3 курсу
Ткаченко Івана Сергійовича
Спеціальність 010501
«Прикладна математика та інформатика»
Викладач:
Преслер В.Т.
КЕМЕРОВО 2009
Зміст
1 Формулювання завдання
2 Математична постановка задачі
2.1 Метод рішення задачі
2.2 Способи введення, виведення та організації даних
2.3 Виняткові ситуації і реакція на них
2.4 Модульна організація програми
2.5 Специфікація даних
2.6 Організація обчислювального процесу
3 Розробка блок-схеми алгоритму завдання
4 Створення програми на алгоритмічній мові
5 побудованих тестів та налагодження програми
1 Формулювання завдання
Знайти корені нелінійного рівняння . Значення коефіцієнтів , Межі відрізка інтегрування і значення допустимої похибки задаються користувачем.
2 Математична постановка задачі
2.1 Метод рішення задачі
Обчислення кореня функції методом ділення відрізка навпіл.
Корінь функції F (x) - це таке значення її аргументу х *, при якому виконується умова F (x *) = 0. Відомо, що для вирішення такого рівняння необхідно задати інтервал [a, b], на якому відбуватиметься пошук рішення. Якщо рішення дійсно існує, є на цьому інтервалі єдиним, належить заданому інтервалу і функція F (x) приймає на кордонах інтервалу значення протилежних знаків. Іншими словами, твір значень функції на кордонах інтервалу негативно: F (a) F (b) <0. Далі вихідний інтервал ділиться середньої точкою з = (а + b) / 2 на дві рівні частини, з яких вибирається лише та, яка містить рішення рівняння. Процедура розподілу відрізка навпіл повторюється до тих пір, поки корінь функції не буде знайдений із заданою точністю. Оцінкою похибки в даному випадку може бути величина останнього інтервалу | а-b | або значення | F (x) |.
2.2 Способи введення, виведення та організації даних
Вихідні дані в цьому завданні - це коефіцієнти рівняння, точність рішення і відрізок [a, b], на якому шукається рішення рівняння.
Під внутрішньою формою будемо розуміти організацію даних в оперативній пам'яті. При цьому будемо використовувати два типи цієї організації - явного відображення допомогою вікна виведення повідомлень і неявного розміщення в пам'яті у формі простих змінних.
Результат цього завдання, тобто корінь будемо відображати відразу в цьому вікні виводу відразу після його знаходження.
Обчислювальний процес цієї задачі базується на координатах відрізка [a, b], точності e дійсного типу і функцие .
2.3 Виняткові ситуації і реакція на них
Виняткові ситуації можуть виникнути тоді, коли введені коефіцієнти рівняння, при яких немає дійсних коренів. При виникненні цієї ситуації програма припиняє роботу, виводить повідомлення про те, що у цього рівняння немає дійсних коренів. Також виняткова ситуація виникає тоді, коли відрізок, на якому шукається рішення рівняння не має коренів або має два корені. У цьому випадку програма припиняє роботу і виводить повідомлення про те, що неправильно заданий відрізок. Для того, щоб правильно поставити відрізок програма виводить корені цього рівняння, знайдені методом розв'язання квадратних рівнянь.
2.4 Модульна організація програми
Рішення поставленої задачі являє форму програмної реалізації алгоритму як цілісна програма і функція, до якої звертається головна програма.
2.5 Специфікація даних
При рекурсивної організації програми маємо стандартний модуль, але містить функцію funct. Функція funct типу real. Функція повертає значення. Всі змінні в програмі глобальні. Значення коефіцієнтів передаються у функцію.
Вихідні дані:
a 0, a 1, a 2 - коефіцієнти рівняння типу Real;
e - точність рішення типу Real;
a, b - координати відрізка типу Real.
Результуючі дані:
x - змінна зберігає значення точки (I ітерація, корінь) типу Real;
i - лічильник ітерацій типу Integer.
Проміжні дані:
x _ pre - змінна, що зберігає попереднє значення точки (i -1 ітерація) типу Real;
d - дискримінант типу Real;
x 1-перший корінь рівняння, знайдений методом розв'язання квадратних рівнянь через дискримінант типу Real;
x 2 - другий корінь рівняння, знайдений методом розв'язання квадратних рівнянь через дискримінант типу Real;
2.6 Організація обчислювального процесу
Обчислювальний процес базується на наступному підході. Перевіряємо чи є у заданого рівняння дійсні корені за формулою: D = a 1 ^ 2 - a 0 * a 2. Якщо D <0, значить дійсних коренів немає і вирішити таку систему у нас не вийде. Якщо дійсні корені є, то знайдемо їх методом розв'язання квадратних рівнянь через дискримінант. Перевіримо єдиність кореня на заданому відрізку [a, b]. Якщо на цьому відрізку існує не один корінь або взагалі не існує коренів, то треба задати інший відрізок. Потім ділимо відрізок навпіл і перевіряємо на який його половині лежить корінь. Для цього значення функції повинна бути різного знака на кінцях відрізка. Отриманий відрізок ми знову ділимо навпіл. Цей ітераційний процес ми продовжуємо до тих пір поки модуль різниці між точкою, отриманої на i-й ітерації і точкою, отриманої на (i -1) ітерації не буде менше заданої точності. Це і буде коренем рівняння.
3 Розробка блок-схеми алгоритму завдання
Блок-схема рішення задачі представлена нижче
4 Створення програми на алгоритмічній мові
Для реалізації програми вирішення поставленого завдання використаний алгоритмічну мову VBA, можливості якого достатні для реалізації завдань подібного типу. Для відображення результатів (корені рівняння) використано Windows-вікно для виведення повідомлень. Результат, виведений через це вікно, зберігається лише на час його існування. Нижче представлений лістинг варіанту програми, розроблений згідно з поданою розрахункової схеми і графічному алгоритму.
Private a0, a1, a2, e, a, b, x, i
Private Sub CommandButton1_Click ()
a0 = CDbl (TextBox2.Text)
a1 = CDbl (TextBox3.Text)
a2 = CDbl (TextBox4.Text)
e = CDbl (TextBox5.Text)
a = CDbl (TextBox9.Text)
b = CDbl (TextBox10.Text)
d = a1 ^ 2 - 4 * a0 * a2
TextBox14.Text = d
If d <0 Then
Label16.Visible = True
TextBox7.Text = ""
TextBox8.Text = ""
TextBox11.Text = ""
TextBox12.Text = ""
TextBox13.Text = ""
Exit Sub
Else
Label16.Visible = False
End If
x1 = (-a1 - d ^ (1 / 2)) / 2 * a0
x2 = (-a1 + d ^ (1 / 2)) / 2 * a0
TextBox12.Text = x1
TextBox13.Text = x2
t = 0
If (a <x1) And (a <x2) And (b> x1) And (b> x2) Then t = 1
If (a <x1) And (a <x2) And (b <x1) And (b <x2) Then t = 1
If (a> x1) And (a> x2) And (b> x1) And (b> x2) Then t = 1
If (a> x1) And (a <x2) And (b> x1) And (b <x2) Then t = 1
If t = 1 Then
Label14.Visible = True
TextBox7.Text = ""
TextBox8.Text = ""
TextBox11.Text = ""
Exit Sub
Else
Label14.Visible = False
Label16.Visible = False
i = 0
x = a
Do
i = i + 1
x_pre = x
x = (a + b) / 2
If funct (a) * funct (x)> 0 Then
a = x
Else
b = x
End If
Loop While (Abs (x - x_pre)> e)
TextBox7.Text = x
TextBox8.Text = i
TextBox11.Text = funct (x)
End If
End Sub
Private Sub CommandButton3_Click ()
UserForm1.Hide
End Sub
Function funct (x)
funct = a0 * x ^ 2 + a1 * x + a2
End Function
5 побудованих тестів та налагодження програми
В програмі завжди виводяться коріння, отримані методом вирішення квадратного рівняння, щоб порівняти їх з отриманими результатами, знайденими за допомогою методу розподілу відрізка навпіл. У ході тестування програми помилок виявлено не було. Результати завжди перебувають з точність до заданого ε.