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

2016-07-30СтудИзба

Описание файла

Документ из архива "Розробка програми мовою програмування С++ по пошуку коренів нелінійних рівнянь", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48886"

Текст из документа "48886"

ЗМІСТ

Вступ

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) з заданою точністю задовольняє співвідношенню

. (6)

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

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

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

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

. (7)

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

, (8)

де довільна знакостала неперервна функція.

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

. (9)

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

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

(10)

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

(11)

де 0

. (12)

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

. (13)

Зауваження: якщо функція (x) має на проміжку S неперервну похідну , яка задовольняє умові

, (14)

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

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

. (15)

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

. (16)


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

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

, (17)

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

. (18)

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

, (19)

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

. (20)

При такому виборі для похибки буде мати місце оцінка

, (21)

де .

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

. (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) з точністю задовольняє нерівності

. (28)

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

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

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

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

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

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

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

пц

якщо 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) та потрібної точності ()

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

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

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

то a:=c

інакше b:=c

кінець циклу

вивід значення кореня

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

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

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

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5138
Авторов
на СтудИзбе
443
Средний доход
с одного платного файла
Обучение Подробнее