Рефетека.ру / Информатика и програм-ие

Курсовая работа: Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

ЗМІСТ


Вступ

1. Аналіз завдання та розробка методу вирішення задачі

1.1 Розробка методу виконання основного завдання

1.2 Структура даних і функцій

2. Опис структури програмного проекту

3. Опис алгоритмів розв’язання задачі

4. Розробка та виконання тестового прикладу

5. Інструкція користувача

Висновки

Додатки


ВСТУП


Серед інформаційних технологій, які лежать в основі всіх напрямів підготовки спеціалістів з комп’ютерних технологій, особливе місце займає математичне моделювання. При цьому під математичною моделлю фізичної системи, об’єкта або процесу звичайно розуміють сукупність математичних співвідношень (формул, рівнянь, логічних виразів), які визначають характеристики стану і властивості системи, об’єкта і процесу та їх функціонування залежно від параметрів їх компонентів, початкових умов, вхідних збуджень і часу. Загалом математична модель описує функціональну залежність між вихідними залежними змінними, через які відображається функціонування системи, незалежними (такими, як час) і змінюваними змінними (такими, як параметри компонентів, геометричні розміри та ін.), а також вхідними збудженнями, прикладеними до системи.

Для кожної математичної моделі звичайно формулюється математична задача. У загальному випадку, коли функціональна залежності для множини вхідних даних (значення незалежних та змінюваних змінних і вхідних збуджень), що виступають як множина аргументів, задана неявно, за допомогою математичної моделі необхідно визначити множину вихідних залеж­них змінних, що виступають як множина значень функцій. При цьому відповідно до виду математичної моделі розрізняють такі базові типи математичних задач:

Ё розв’язання системи лінійних (в загальному випадку лінеаризованих) рівнянь;

Ё розв’язання нелінійних алгебраїчних рівнянь;

Ё апроксимація масиву даних або складної функції набором стандартних, більш простих функцій;

Ё чисельне інтегрування і диференціювання;

Ё розв’язання систем звичайних диференціальних рівнянь;

Ё розв’язання диференціальних рівнянь в частинних похідних;

Ё розв’язання інтегральних рівнянь.

Одному з таких типів, а саме розв’язанню нелінійних алгебраїчних рівнянь, і присвячена дана курсова робота. Методом розв’язування обрано метод дихотомії.


1 АНАЛІЗ ЗАВДАННЯ ТА РОЗРОБКА МЕТОДУ ВИРІШЕННЯ ЗАДАЧІ


Розглянемо рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь і нехай Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь- його дійсний корінь, тобто Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь Геометрично рівність Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь означає, що графік функції Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь проходить через точку Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь осі Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Далі ми будемо розв’язувати задачу про знаходження Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь з наперед заданою точністю наближеного значення кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь Спочатку розглянемо питання про відокремлення коренів рівняння.

Корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь відокремлений, якщо знайдено відрізок ( позначимо його Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь ), в якому, крім Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, немає інших коренів цього рівняння.

Задача відокремлення коренів рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь розв’язується просто, якщо побудова графіка функції Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь не є важкою. Дійсно, маючи графік функції Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, легко виділити відрізки, в кожному із яких знаходиться лише один корінь розглядуваного рівняння, або, що те саме, виділити відрізки, на кожному із яких є лише одна точка перетину кривої Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь з віссю Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь.

Відділити корені рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь при умові, що Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь- диференційована функція, можна не лише графічно. Нехай на кінцях деякого відрізка Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь функція Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь має значення різних знаків. Тоді за властивістю неперервних функцій ця функція на інтервалі Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь по меншій мірі один раз обертається в нуль, тобто рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь має по меншій мірі один корінь.

Якщо похідна Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь зберігає знак на відрізку Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то внаслідок монотонності функції Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівняньна інтервалі Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь має єдиний корінь.

У цьому випадку числа Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівняньРозробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь та Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь є наближеними значеннями кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь відповідно з нестачею і з надлишком. Ці інтервали можна звужувати, тоді границі їх будуть давати все точніші наближення для коренів рівняння.

Нехай корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь відокремлений, тобто є відрізок Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, на якому, крім Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, немає інших коренів цього рівняння.

Відшукаємо значення Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь з будь-якою точністю за таких допущень: функція Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь має на відрізку Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь неперервні похідні до другого порядку включно і, крім того, похідні Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь і Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь зберігають знаки на цьому відрізку. Із цих умов випливає, що Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь- монотонна функція на відрізку Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, яка на кінцях має різні знаки, а також, що крива Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь опукла або вгнута (рис. 1.1).


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 1.1 – Варіанти поведінки функції Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


Отже, розглянемо задачу знаходження коренів рівняння


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (1)


де Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь - задана функція дійсного змінного.

Розв’язування даної задачі можна розкласти на декілька етапів:

а) дослідження розташування коренів (в загальному випадку на комплексній площині) та їх кратність;

б) відділення коренів, тобто виділення областей, що містять тільки один корінь;

в) обчислення кореня з заданою точністю за допомогою одного з ітераційних алгоритмів.

Далі розглядаються ітераційні процеси, що дають можливість побудувати числову послідовність xn, яка збігається до шуканого кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння (1).

Метод ділення проміжку навпіл (метод дихотомії)

Нехай Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь і відомо, що рівняння (1) має єдиний корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Покладемо a0=a, b0=b, x0=(a0+b0)/2. Якщо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Якщо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то покладемо


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (2)


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (3)

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (4)


і обчислимо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Якщо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то ітераційний процес зупинимо і будемо вважати, що Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Якщо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то повторюємо розрахунки за формулами (2)-(4).

З формул (2), (3) видно, що Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь і Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Тому Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, а отже шуканий корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь знаходиться на проміжку Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. При цьому має місце оцінка збіжності


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (5)

Звідси випливає, що кількість ітерацій. які необхідно провести для знаходження наближеного кореня рівняння (1) з заданою точністю e задовольняє співвідношенню


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (6)


де [c] - ціла частина числа c.

Серед переваг даного методу слід відзначити простоту реалізації та надійність. Послідовність {xn} збігається до кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь для довільних неперервних функцій f(x). До недоліків можна віднести невисоку швидкість збіжності методу та неможливість безпосереднього узагальнення систем нелінійних рівнянь.

Метод простої ітерації

Метод простої ітерації застосовується до розв’язування нелінійного рівняння виду


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (7)


Перейти від рівняння (1) до рівняння(7) можна багатьма способами, наприклад, вибравши


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (8)


де Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь - довільна знакостала неперервна функція.

Вибравши нульове наближення x0, наступні наближення знаходяться за формулою


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (9)

Наведемо достатні умови збіжності методу простої ітерації.

Теорема 1. Нехай для вибраного початкового наближення x0 на проміжку

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (10)

функція j(x) задовольняє умові Ліпшиця

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (11)

де 0<q<1, і виконується нерівність

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (12)

Тоді рівняння (7) має на проміжку S єдиний корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, до якого збігається послідовність (9), причому швидкість збіжності визначається нерівністю


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (13)


Зауваження: якщо функція j(x) має на проміжку S неперервну похідну Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, яка задовольняє умові


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (14)


то функція j(x) буде задовольняти умові (11) теореми 1.

З (13) можна отримати оцінку кількості ітерацій. які потрібно провести для знаходження розв’язку задачі (7) з наперед заданою точністю e:


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (15)

Наведемо ще одну оцінку. що характеризує збіжність методу простої ітерації:


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (16)


Метод релаксації

Для збіжності ітераційного процесу (9) суттєве значення має вибір функції j(x). Зокрема, якщо в (8) вибрати Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то отримаємо метод релаксації.


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (17)


який збігається при


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (18)


Якщо в деякому околі кореня виконуються умови


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (19)


то метод релаксації збігаються при Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Збіжність буде найкращою при


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (20)


При такому виборі t для похибки Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь буде мати місце оцінка


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (21)

де Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь.


Кількість ітерацій, які потрібно провести для знаходження розв’язку з точністю e визначається нерівністю


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (22)


Зауваження: якщо виконується умова Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, то ітераційний метод (17) потрібно записати у вигляді


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь.


Метод Ньютона

Метод Ньютона застосовується до розв’язування задачі (1), де f(x) є неперервно-диференційованою функцією. На початку обчислень вибирається початкове наближення x0. Наступні наближення обчислюються за формулою


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (23)


З геометричної точки зору xn+1 є значенням абсциси точки перетину дотичної до кривої y=f(x) в точці (xn, f(xn)) з віссю абсцис. Тому метод Ньютона називають також методом дотичних.

Теорема 2. Якщо Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь не змінює знака на [a,b], то виходячи з початкового наближення Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, що задовольняє умові Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, можна обчислити методом Ньютона єдиний корінь Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь рівняння (1) з будь-якою степінню точності.

Теорема 3. Нехай Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь - простий дійсний корінь рівняння (1) і Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, де Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь,


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь, (24)


причому


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (25)


Тоді для Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь метод Ньютона збігається, причому для похибки справедлива оцінка


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (26)


З оцінки (26) видно, що метод Ньютона має квадратичну збіжність, тобто похибка на (n+1)-й ітерації пропорційна квадрату похибки на n-й ітерації.

Модифікований метод Ньютона


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь (27)


дозволяє не обчислювати похідну Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь на кожній ітерації, а отже і позбутися можливого ділення на нуль. Однак цей алгоритм має тільки лінійну збіжність.

Кількість ітерацій, які потрібно провести для знаходження розв’язку задачі (1) з точністю e задовольняє нерівності

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. (28)


1.1 Розробка методу виконання основного завдання


Розглянемо один з найпростіших методів уточнення відділеного кореня – метод половинного ділення.

Обчислюємо значення f(x) в середині відрізка [a;b], тобто в точці Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь. Залежно від значення Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь вибираємо ту частину інтервалу [a;b], де знаки функції f(x) є різними. Отже, інтервал, у якому є корінь, зменшився удвічі. Продовживши процес, ми звужуємо інтервал до такої величини, поки його розмір (який дорівнює абсолютній похибці) не стане меншим від потрібної нам величини.

Зрозуміло, що другий етап наближеного відшукання кореня бажано виконувати за допомогою комп’ютера.

Алгоритм методу половинного ділення, з використанням шкільних конструкцій алгоритмічної мови, можна записати так:


ввід інтервалу (a;b) та потрібної точності (D)

поки |a-b| < D виконувати

пц


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


якщо f(a)Чf(b) > 0

то a:=c

інакше b:=c

кц

вивід значення кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


1.2 Структура даних і функцій


Згідно завдання наш проект складається з 4 додаткових модулів, та основного модуля, в якому міститься головна функція main() нашого проекту.

Коротко охарактеризуємо кожен з модулів. Почнемо з основного. Названий він відповідно - main.cpp. Містить дві функції void avtor() та void main(). Перша з них виводить інформацію про автора проекту, є невеликою, має опис двох локальних змінних int xmax, ymax. Друга функція – головна. Вона є фактично монітором нашого проекту, спочатку запускає електронну титульну сторінку курсової роботи, потім будує графік функції, корені якої нам потрібно знайти, використовуючи метод дихотомії знаходить корінь на вказаному з клавіатури проміжку з вказаною точністю, демонструє метод дихотомії графічно та зрештою виводить головне меню на екран. Всі ці дії, крім виводу головного меню на екран, виконуються лише запуском відповідних функцій з додаткових модулів. Крім того, функція void main() ініціалізує графічний режим, підключаючи BGI драйвер EGAVGA.BGI.

У головному модулі оголошено такі локальні змінні:

int k=0 – для збереження пункту головного меню, яке обирає користувач,

int gdriver = DETECT, gmode, errorcode – додаткові змінні для ініціалізації графічного режиму.

Тепер перейдемо до додаткових модулів.

Модуль tytulka.cpp містить лише одну функцію void tytulka(), що виводить на екран електронну титульну сторінку розробника курсової роботи. Оголошено такі локальні змінні: int a=5 – значення відступів від краю екрану до рамки, xmax=getmaxx(), ymax=getmaxy() – значення роздільної здатності екрану у графічному режимі.

Модуль grafik.cpp містить функцію void grafik(), що будує Декартову систему координат та графік функції на ній. Оголошено такі локальні змінні:

int dec, sign; - допоміжні змінні для виклику функції fcvt – перетворення з дійсного числа у стрічку;

int i; - лічильник циклу;

float x1,x2,y1,y2,xx1,xx2,yy1,yy2; - містять координати точок на площині.

Модуль dyhotom.cpp містить дві функції: double f(double x) – обчислення значення вказаної в завданні функції для певного значення х, void dyhotom() – реалізація чисельного методу знаходження кореня рівняння на вказаному проміжку з вказаною точністю. Оголошено такі локальні змінні:

FILE *fp1,*fp2; - вказівники на файли, що містять проміжні результати обчислень;

int k=0; - лічильник ітерацій;

double a, b, c, epsilon; - межі проміжку, середина проміжку та точність.

Модуль demon.cpp містить одну функцію void demon(), що графічно демонструє роботу функції void dyhotom(). Оголошено такі локальні змінні:

int xmax=getmaxx(),ymax=getmaxy(); - значення роздільної здатності екрану у графічному режимі

FILE *fp1,*fp2; - вказівники на файли, що містять проміжні результати обчислень;

float x, a, b; - значення кореня рівняння та межі проміжку;

int i = 7; - кількість знаків після коми, які виводить функція gcvt();

char *buf; - допоміжна змінна для роботи функції gcvt().


2. ОПИС СТРУКТУРИ ПРОГРАМНОГО ПРОЕКТУ


Як зазначалося вище, наш проект складається з 4 додаткових модулів, та основного модуля, в якому міститься головна функція main() нашого проекту. Додаткові модулі не зв’язані один з одним, а лише з головним модулем.

Єдиним зв’язком (неявним) між модулями dyhotom.cpp та demon.cpp є спільне використання файлів KORENI.TXT та MEGI.TXT.

Загальна схема проекту із способами взаємодії між модулями наведена на рисунку 2.1.


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 2.1 - Загальна схема проекту


Розбиття програми на різні файли визначається логічною структурою програми. Використання додаткових модулів дозволило спростити реалізацію нашого проекту та більш наочно показати взаємодію одних частин проекту з іншими та значно зменшити час на від лагодження та компіляцію цілого проекту.


3. ОПИС АЛГОРИТМІВ РОЗВ’ЯЗАННЯ ЗАДАЧІ


Опишемо алгоритм роботи усіх функцій усіх модулів нашого проекту. Почнемо з основного main.cpp. Містить дві функції void avtor() та void main(). Перша з них виводить інформацію про автора проекту. Алгоритм роботи дуже простий: очистка екрану -> задання кольору -> отримання розмірів екрану -> замальовування екрану вибраним кольором -> задання кольору та стилю тексту -> вивід тексту на екран.

Друга функція – головна. Вона є фактично монітором нашого проекту, спочатку ініціалізує графічний режим, підключаючи BGI драйвер EGAVGA.BGI, потім запускає електронну титульну сторінку курсової роботи, потім будує графік функції, корені якої нам потрібно знайти, використовуючи метод дихотомії знаходить корінь на вказаному з клавіатури проміжку з вказаною точністю, демонструє метод дихотомії графічно та зрештою виводить головне меню на екран. Після цього програма очікує вибору користувача.

Тепер перейдемо до додаткових модулів.

Модуль tytulka.cpp містить лише одну функцію void tytulka(), що виводить на екран електронну титульну сторінку розробника курсової роботи. Алгоритм роботи дуже простий і подібний до алгоритму функції void avtor().

Модуль grafik.cpp містить функцію void grafik(), що будує Декартову систему координат та графік функції на ній. Алгоритм роботи теж подібний до алгоритму функції void avtor(), але є додатково цикл обчислення значення функції для точок з проміжку [-2;2] з кроком 0,01 та побудова кривої, що з’єднує ці точки.

Модуль dyhotom.cpp містить дві функції: double f(double x) – обчислення значення вказаної в завданні функції для певного значення х, void dyhotom() – реалізація чисельного методу знаходження кореня рівняння на вказаному проміжку з вказаною точністю. Проміжні результати виконання записуються у файли KORENI.TXT та MEGI.TXT.

Алгоритм наступний:


ввід інтервалу (a;b) та потрібної точності (D)

поки |a-b| < D виконувати

початок циклу

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

якщо f(a)Чf(с) > 0

то a:=c

інакше b:=c

кінець циклу

вивід значення кореня Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Модуль demon.cpp містить одну функцію void demon(), що графічно демонструє роботу функції void dyhotom(), використовуючи проміжні результати виконання, що записані у файли KORENI.TXT та MEGI.TXT. Алгоритм роботи дуже простий і подібний до алгоритму функцій void avtor() та void tytulka().

Алгоритми всіх функцій у вигляді блок-схем подані в додатку.


4. РОЗРОБКА ТА ВИКОНАННЯ ТЕСТОВОГО ПРИКЛАДУ


Перед нами стоїть задача перевірити вірність виконання поставленого перед нами завдання.

Побудуємо графік функцій Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь та Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь використовуючи математичний пакет MathСad (рисунок 4.1):


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.1 – Зображеня вказаних функцій в середовищі MathCad


Запускаємо на виконання виконавчий файл нашого проекту. Спочатку бачимо зображення електронної титульної сторінки (рисунок 4.2).


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.2 - Зображення електронної титульної сторінки


Програма чекає, поки буде натиснута довільна кнопка. Що ми і робимо. З’являється графік функцій (рисунок 4.3). Порівняємо два рисунки: 4.1 та 4.3. Бачимо повне співпадіння.

Нам потрібні проміжки, де дві функції перетинаються. Таких проміжків є три: окіл нуля, проміжок від -2 до -1, проміжок від 1 до 2.

Знову натискаємо довільну кнопку. З’являється вікно із запитом на введення даних (рисунок 4.4). Вводимо послідовно значення межі проміжка та похибки. Отримаємо:


a=1

b=3

eps=0.2

-------------------------------------------------

korin rivnjannja 1.0625

kilkist iteratsij 4

пробуємо всі проміжки:

a=1

b=2

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.3 - Зображення графіка функції


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.4 - Вікно із запитом на введення даних


eps=0.000001

-------------------------------------------------

korin rivnjannja 1.0625

kilkist iteratsij 4


a=-0.5

b=0.6

eps=0.000001

-------------------------------------------------

korin rivnjannja -2.14577e-07

kilkist iteratsij 21

Спробуємо збільшити точність:

a=-2

b=-1

eps=0.0000001

-------------------------------------------------

korin rivnjannja -1.42167

kilkist iteratsij 24


Як бачимо, кількість ітерацій зросла.

Перевіримо, чи записано у файл проміжні результати:


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


Дані записано нормально.

Після отримання числових результатів натискаємо довільну кнопку і переходимо до наступного вікна (рисунок 4.5), яке демонструє графічно реалізацію метода.


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.5 - Вікно демонстрації реалізації метода дихотомії

Дані для x, a та b завантажуються з текстових файлів KORENI.TXT та MEGI.TXT, точки будуються відповідно до цих даних. Після кожного натиснення будь-якої клавіші зчитуються наступні дані, аж поки не знайдемо значення x із заданою точністю.

Після натискання довільної кнопки переходимо до меню користувача (рисунок 4.6).

При вибору пунктів меню з’являються знайомі нам вже вікна:

1 - Рисунок 4.2;

2 - Рисунок 4.3;

3 або 5 - Рисунок 4.4;

4 - Рисунок 4.5.

Натиснувши 7 – вийдемо з програми, а обравши 6 побачимо вікно з інформацією про автора програми (Рисунок 4.7). На інші кнопки програма не реагує.


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.6 - Вікно меню користувача

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Рисунок 4.7 - Вікно з інформацією про автора програми


Натиснувши довільну кнопку знову переходимо до вікна меню користувача.


5. ІНСТРУКЦІЯ КОРИСТУВАЧА


Для запуску програми потрібно зайти в папку Program і запустити на виконання файл kursova.exe. Для вірної роботи програми у тій же папці має бути файл-драйвер EGAVGA.bgi.

Дана програма може працювати під управлінням операційної системи сімейства Windows, починаючи від версії 95 та під управлінням ОС MS-DOS.

Мінімальні системні вимоги для коректної роботи програми:

- операційна система сімейства Windows або MS-DOS;

- процесор – не менше 80386;

- оперативної пам’яті – 1 Мб;

- відеокарта з якістю кольоропередачі – 16 біт;

- вільного місця на жорсткому диску – 135 кб.

Після запуску програми спочатку бачимо зображення електронної титульної сторінки (рисунок 4.2). Програма чекає, поки буде натиснута довільна кнопка. Що ми і робимо. З’являється графік функцій (рисунок 4.3). Знову натискаємо довільну кнопку. З’являється вікно із запитом на введення даних (рисунок 4.4). Вводимо послідовно значення межі проміжка та похибки. Отримаємо результати: корінь рівняння та кількість ітерацій.

Після отримання числових результатів натискаємо довільну кнопку і переходимо до наступного вікна (рисунок 4.5), яке демонструє графічно реалізацію метода. Дані для x, a та b завантажуються з текстових файлів KORENI.TXT та MEGI.TXT, точки будуються відповідно до цих даних. Після кожного натиснення будь-якої клавіші зчитуються наступні дані, аж поки не знайдемо значення x із заданою точністю. Після натискання довільної кнопки переходимо до меню користувача (рисунок 4.6).

При вибору пунктів меню з’являються знайомі нам вже вікна:

1 - Рисунок 4.2;

2 - Рисунок 4.3;

3 або 5 - Рисунок 4.4;

4 - Рисунок 4.5.

Натиснувши 7 – вийдемо з програми, а обравши 6 побачимо вікно з інформацією про автора програми (Рисунок 4.7). На інші кнопки програма не реагує. Натиснувши довільну кнопку знову переходимо до вікна меню користувача.


ВИСНОВКИ


В ході виконання даної курсової роботи ми вдосконалили свої знання мови С++ та вміння нею користуватися в середовищі Borland C++. Певна частина теоретичного матеріалу була опрацьована самостійно, використовуючи літературні джерела, а також інформаційні ресурси Інтернету. Серед новизни слід відмітити використання багатомодульного проектування.

Серед недоліків програми слід відмітити недостатність у візуальному оформленні, хоча середовище програмування і не дає широких можливостей для цього. Серед переваг помічаємо такі характеристики програми, як швидкодія, легкість у користуванні та невеликі розміри виконавчого файлу..

Створена нами програма проста та інтуїтивно зрозуміла і легка у користуванні.

У пояснювальній записці вповні розглянута проблема пошуку коренів нелінійних рівнянь, наведені необхідні формули та теореми. Крім того, побудовані блок-схеми алгоритмів основних функцій відповідають діючим стандартам і вимогам.

Отже, можемо зробити висновок, що створений нами проект повністю відповідає завданню, а пояснююча записка написана з дотриманням всіх вимог і стандартів.


ПЕРЕЛІК ПОСИЛАНЬ


Глинський Я.М., Анохін В.Є., Ряжська В.А. С++ і С++ Builder. Навч. посібн. 3-тє вид. – Львів: СПД Глинський, 2006. – 192с.

Пахомов Б.И. С/С++ и Borland C++ Builder для студента. – Спб.: БХВ-Петербург, 2006. – 448 с.:ил.

С/С++. Программирование на языке высокого уровня / Т.А. Павловская. СПб.: Питер, 2002. – 464 с

Сборник часто задаваемых вопросов и ответов к ним по компиляторам языков Си и C++ http://soft.munic.msk.su/

Уоррен Г.С. Алгоритмические трюки для программистов. - М.: Изд.дом «Вильямс», 2003

Шилдт Г. Теория и практика С++. — СПб.: BHV, 1996.


Додаток А.

(обов’язковий)

Загальна схема проекту.


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


Додаток Б.

(обов’язковий)


Текст програми


main.cpp

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <dos.h>

#include <stdio.h>

#include <math.h>

#include "tytulka.cpp"

#include "grafik.cpp"

#include "dyhotom.cpp"

#include "demon.cpp"

void avtor()

{

clrscr();

setcolor(10);

int xmax=getmaxx(),ymax=getmaxy();

bar(0,0,xmax,ymax);

setcolor(BLUE);

settextstyle(0,0,2);

outtextxy(175,150,"Kursovu robotu");

outtextxy(230,250,"vykonav");

outtextxy(150,350,"Shypuk Oleksandr");

getch();

}

//===============================================================

void main()

{

clrscr();

int gdriver = DETECT, gmode, errorcode;

initgraph(&gdriver, &gmode,"");

errorcode = graphresult();

if (errorcode != grOk)

{

cout<< "ERROR" << grapherrormsg(errorcode);

cout<< "\n Press any key...";

getch();

exit(1);

}


tytulka();

grafik();

dyhotom();

demon();

int k=0;

while (k!=7)

{

setcolor(10);

int xmax=getmaxx(),ymax=getmaxy();

bar(0,0,xmax,ymax);

setcolor(BLUE);

settextstyle(0,0,2);

outtextxy(75,50,"1 -> Tytulka");

outtextxy(75,85,"2 -> Grafik");

outtextxy(75,120,"3 -> Metod dyhotomiji");

outtextxy(75,155,"4 -> Demonstratsija roboty metodu");

outtextxy(75,190,"5 -> Utochnyty sche odyn korin");

outtextxy(75,225,"6 -> Pro avtora");

outtextxy(75,260,"7 -> Vyhid");

outtextxy(75,300,"Zrobit svij vybir");

settextstyle(0,0,1);

outtextxy(75,400,"PRYMITKA:");

outtextxy(75,425,"Jaksho rivnjannja maje bilshe odnogo korenja,");

outtextxy(75,450,"perejdit poslidovno do punktiv 2,3,4 abo vyberit punkt 5");

cin>>k;

switch (k)

{

case 1: tytulka(); break;

case 2: grafik(); break;

case 3: dyhotom(); break;

case 4: demon(); break;

case 5: dyhotom(); break;

case 6: avtor(); break;

case 7: exit(1); break;

}

}

closegraph();

}


demon.cpp

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <dos.h>

#include <stdio.h>

#include <math.h>

void demon()

{

int xmax=getmaxx(),ymax=getmaxy();

FILE *fp1,*fp2;

float x, a, b;

int i = 7;

char *buf;

buf = (char*)malloc(5);

fp1=fopen("koreni.txt","rt");

fp2=fopen("megi.txt","rt");

while (!feof(fp1))

{

clrscr();

fscanf(fp1,"%f\n",&x);

fscanf(fp2,"%f\n",&a);

fscanf(fp2,"%f\n",&b);

setcolor(WHITE);

bar(0,0,xmax,ymax);

setcolor(RED);

settextstyle(0,0,2);

outtextxy(165,25,"x");

outtextxy(315,25,"a");

outtextxy(455,25,"b");

rectangle(125,55,250,100);

rectangle(275,55,400,100);

rectangle(425,55,550,100);

settextstyle(0,0,1);

setcolor(GREEN);

gcvt(x,i,buf);

outtextxy(140,75,buf);

gcvt(a,i,buf);

outtextxy(290,75,buf);

gcvt(b,i,buf);

outtextxy(440,75,buf);

setcolor(RED);

line(10,240,630,240);

line(620,235,630,240);

line(620,245,630,240);

settextstyle(0,0,1);

outtextxy(620,225,"x");


circle(20+(x+2)*150,240,2);

outtextxy(20+(x+2)*150,225,"x");

circle(20+(a+2)*150,240,2);

outtextxy(20+(a+2)*150,245,"a");

circle(20+(b+2)*150,240,2);

outtextxy(20+(b+2)*150,255,"b");

getch();

free(buf);

}

}


dyhotom.cpp

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <dos.h>

#include <stdio.h>

#include <math.h>

double f(double x)

{

return x*x*x/3-atan(x);

}

//===============================================================

void dyhotom()

{

clrscr();

FILE *fp1,*fp2;

fp1=fopen("koreni.txt","wt");

fp2=fopen("megi.txt","wt");

int k=0;

double a, b, c, epsilon;

cout << "a=";

cin >> a;

cout << "b=";

cin >> b;

cout << "eps=";

cin >> epsilon;

if (f(a)*f(b)>0)

cout << "nemaje koreniv abo bilshe odnogo na tsjomu promizhku" << endl;

else

{

while (b - a > epsilon)

{

c = (a + b) / 2;

fprintf(fp1,"%f\n",c);

fprintf(fp2,"%f\n",a);

fprintf(fp2,"%f\n",b);

if(f(c)==0) break;

if(f(b) * f(c) < 0)

a = c;

else

b = c;

k++;

}

cout << "-------------------------------------------------" << endl;

cout << "korin rivnjannja x=" << (a + b) / 2 << endl;

cout << "kilkist iteratsij n=" << k << endl;

}

fclose(fp1);

fclose(fp2);

getch();

}


grafik.cpp

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <dos.h>

#include <stdio.h>

#include <math.h>

void grafik()

{

clrscr();

setcolor(WHITE);

int xmax=getmaxx(),ymax=getmaxy();

bar(0,0,xmax,ymax);

setcolor(RED);

line(10,240,630,240);

line(620,235,630,240);

line(620,245,630,240);

settextstyle(0,0,1);

outtextxy(620,225,"x");

line(320,10,320,470);

line(320,10,315,20);

line(320,10,325,20);

outtextxy(330,10,"y");

int dec, sign;

int i;

for (i=-2;i<=2;i++)

{

circle(20+((i+2)*150),240,2);

if(i>0)

outtextxy(17+((i+2)*150),250,fcvt(i, 0, &dec, &sign));

else if(i<0)

{

outtextxy(17+((i+2)*150),250,fcvt(i, 0, &dec, &sign));

outtextxy(10+((i+2)*150),250,"-");

}

else outtextxy(25+((i+2)*150),250,fcvt(i, 0, &dec, &sign));

}

for (i=-4;i<=4;i++)

{

circle(320,20+(4+i)*55,2);

if(i<0)

outtextxy(325,20+(4+i)*55,fcvt(-i, 0, &dec, &sign));

else if (i>0)

{

outtextxy(325,20+(4+i)*55,fcvt(-i, 0, &dec, &sign));

outtextxy(310,20+(4+i)*55,"-");

}

}

setcolor(BLUE);

float x1,x2,y1,y2,xx1,xx2,yy1,yy2;

x1=-2;y1=atan(x1);

for (x2=-2;x2<=2;x2+=0.01)

{

y2=atan(x2);

xx1=20+(x1+2)*150;

xx2=20+(x2+2)*150;

yy1=460-(y1+4)*55;

yy2=460-(y2+4)*55;

line(xx1,yy1,xx2,yy2);

x1=x2;y1=y2;

}

outtextxy(520,210,"y(x)=atan(x)");

setcolor(GREEN);

x1=-2;y1=x1*x1*x1/3;

for (x2=-2;x2<=2;x2+=0.01)

{

y2=x2*x2*x2/3;


xx1=20+(x1+2)*150;

xx2=20+(x2+2)*150;

yy1=460-(y1+4)*55;

yy2=460-(y2+4)*55;

line(xx1,yy1,xx2,yy2);

x1=x2;y1=y2;

}

outtextxy(480,120,"y(x)=x*x*x/3");

getch();

}


tytulka.cpp

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <graphics.h>

#include <dos.h>

#include <stdio.h>

void tytulka()

{

clrscr();

setcolor(WHITE);

int a=5,xmax=getmaxx(),ymax=getmaxy();

bar(0,0,xmax,ymax-3*a);

setcolor(GREEN);

rectangle(2*a,a,xmax-a,ymax-4*a);

settextstyle(0,0,1);

outtextxy(190,15,"Ministerstvo osvity i nauky Ukrainy");

outtextxy(160,30,"Lutskij natsionalnyj tehnichnyj universytet");

outtextxy(350,65,"Kafedra kompjuternoji inzheneriji");

setcolor(RED);

settextstyle(0,0,2);

outtextxy(200,190,"Kursova robota");

settextstyle(0,0,1);

outtextxy(265,215,"z dyscypliny");

outtextxy(255,235,"PROGRAMUVANNJA");

outtextxy(280,250,"na temu: ");

outtextxy(120,265,"ROZVJAZUVANNJA NELINIJNYH RIVNJAN METODOM DYHOTOMIJI ");

setcolor(GREEN);

outtextxy(350,350,"Vykonav st.gr.KSMS-13");

outtextxy(350,365,"Kostenko Vasyl");

outtextxy(350,380,"Pereviryv asystent");

outtextxy(350,395,"Lavrenchuk S.V.");


outtextxy(275,445,"Lutsk 2010");

setcolor(RED);

outtextxy(260,470,"Press any key... ");

getch();

}


Додаток В

(обов’язковий)


Блок-схеми алгоритмів

void avtor()

Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

void main()

void grafik()


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

void dyhotom()


Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь

Похожие работы:

  1. Рішення систем нелінійних рівнянь. Метод ітерацій ...
  2. • Програмування мовою С++ з використанням об"єктно ...
  3. • Мова програмування C++ та середовище розробки Microsoft ...
  4. • Дослідження чисельних методів вирішення нелінійних ...
  5. • Наближені методи розв"язку нелінійних рівнянь
  6. • Програмування алгоритмічною мовою VBA
  7. • Програма для тестування знань з дисципліни ...
  8. • Розв'язування систем лінійних рівнянь методом Гауса
  9. • Мова програмування С++
  10. • Розробка алгоритмів та складання програм на ...
  11. • Проектування та розробка засобами Delphi 5 програмного ...
  12. • Алгоритмічні мови програмування: мова С
  13. • Низькорівневе програмування контроллера клавіатури
  14. • Дослідження графіку функції y=cos(x)*ln(x)
  15. • Дослідження методу ортогоналізації й методу ...
  16. • Розробка програмного забезпечення для розв'язку СЛАР ...
  17. • Критерій Байєса-Лапласа при експоненційно ...
  18. • Характеристика якості програмних засобів
  19. • Розробка програми Sierpins, яка реалізує побудову ...
Рефетека ру refoteka@gmail.com