Зміст
Вступ
1 Огляд та варіантний аналіз чисельних методів моделювання
1.1 Основні поняття і визначення
1.2 Класифікація методів рішення поставленої задачі
1.3 Опис методів моделювання на ЕОМ
1.3.1. Метод прямокутників
1.3.2 Метод трапецій
1.3.3 Метод Сімпсона
1.3.4 Метод Ньютона-Котеса
1.3.5 Метод Чебишева
1.3.6 Метод Гаусса
1.4 Уточнена постановка задачі
2 Розробка алгоритмів моделювання на ЕОМ
2.1 Планування вхідних та вихідних даних
2.2 Аналіз задачі, які вирішуються при дослідженні об’єкта на ЕОМ
2.3 Описовий алгоритм головної програми
2.4 Схема алгоритму головної програми
2.5 Алгоритми методів
2.5.1 Алгоритм методу Сімпсона
2.5.2 Алгоритм методу Нютона-Котеса
2.5.3 Алгоритм методу Чебишева
2.6 Опис основних функцій
2.7 Структура комплексу програм для дослідження об’єкта на ЕОМ
3 Планування експепементальних досліджень об’єкту на ЕОМ
3.1 Класифіквція експерементів
3.2 Опис експерементальних досліджень
3.3 Дослідження об’єкту на ЕОМ
4 Аналіз результатів дослідження
5 Оцінка похибок отриманих результатів
6 Оцінка ефективності комплексу програм для дослідження
7 Розробка пакету документів для супроводження комплексу програм
7.1 Інструкція програмісту
7.1.1 Опис вихідного коду
7.1.2 Зміна інтегруючої функції
7.1.3 Зміна тексту допомоги
7.2 Інструкція користувачеві
7.2.1 Запуск
7.2.2 Ввод данних
7.2.3 Перегляд результатів
7.2.4 Вихід з програми
Висновки
Література
Додатки
Додаток А. Технічне завдання
Додаток Б. Лістинг головної програми
Додаток В. Структура дискети
Анотація
Програмний комплекс, що розроблено в даній курсовій роботі створений для знаходження визначеного інтегралу. Програмний комплекс має сучасне багатоієрархічне меню, допомогу. За допомогою даної програми можна виконувати різноманітні визначені інтеграли, від зовсім простих, до досить складних функцій. Результати видаються у вигляді таблиць, що досить зручно, а також можна виводити результати обчислення всіма методами відразу, що дуже зручно при порівнянні методів. Цей комплекс програм розроблений для досить легкого і простого користування.
1 Огляд та варіантний аналіз чисельних методів моделювання
1.1 Основні поняття і визначення
Визначений інтеграл – чисельно рівний площі, обмеженою частиною графіка функції y = f(x), віссю Ох і ординатами f(a) і f(b). Якщо крива перетинає вісь Ох один або декілька разів всередині інтервалу, то інтеграл чисельно рівний алгебраїчній сумі площ, що знаходяться по кожну сторону вісі Ох[6].
Чисельне інтегрування - являє собою стійкий процес і в протиставлення чисельному диференціюванню зменшує дію похибок у початкових даних на кінцевий результат. В основу чисельного інтегрування покладено наближене обчислення площини під кривою, яка описується підінтегральною функцією інтеграла:
Визначений інтеграл - являє собою площину, обмежену кривою f(x), віссю Х та прямими x=a; x=b[6].
1.2 Класифікація методів рішення поставленої задачі
Інженеру часто приходиться обчислювати визначений інтеграл чисельними методами. Це буває у тих випадках, коли або не вдається виразити інтеграл у замкненій формі, або вона настільки складна, що простіше скористатися чисельним інтегруванням.
Отже основною задачею є обчислення інтегралу виду:
де a і b - нижня та верхня межа інтегрування; f(x) - неперервна функція, відносно якої шукають інтеграл, на відрізку [a,b].
Суть більшості методів обчислення визначених інтегралів заключається в заміні підінтегральної функції f(x) апроксимуючою функцією f(х), для якої можна легко записати первісну в елементарних функціях, тобто
де S - наближене значення інтеграла; R - похибка обчислення інтеграла[2].
Методи чисельного інтегрування, що найбільш часто використовуються на практиці можна згрупувати в залежності від способу апроксимації підінтегральної функції. Дамо коротку характеристику груп найбільш розповсюджених методів.
Методи Ньютона-Котеса засновані на поліноміальній апроксимації підінтегральної функції. Методи цього класу відрізняються один від одного степенем використовуваного полінома, від якого залежить кількість вузлів, де необхідно обчислити функцію f(x). Алгоритми методів прості і легко піддаються програмній реалізації[1].
Сплайнові методи базуються на апроксимації підінтегральної функції сплайнами, що являють собою кусочний поліном. Методи розрізняють по типу вибраних сплайнів. Такі методи є сенс використовувати в задачах, де алгоритми сплайнової апроксимації застосовуються для обробки даних.
В методах найвищої алгебраїчної точності (методи Гаусса-Кристоффеля та інші) використовують не рівновіддалені вузли, розташовані по алгоритму, що забезпечує мінімальну похибку інтегрування для найбільш складних функцій при заданій кількості вузлів. Методи розрізняються способами вибору вузлів і широко використовуються для інтегрування, в тому числі вони можуть бути застосовані і для невласних інтегралів[3].
В методах Монте-Карло вузли вибираються за допомогою датчика випадкових чисел, відповідь носить ймовірний характер. Методи виявляються ефективними при обчисленні великої кратності.
В клас спеціальних групуються методи, алгоритми яких розробляються на основі обліку особливостей конкретних підінтегральних функцій, що дозволяє суттєво скоротити час і зменшити похибку обчислення інтегралів.
1.3 Опис методів моделювання на ЕОМ
Існують такі методи як: метод прямокутників, трапецій, Сімпсона, Ньютона-Котеса, Чебишева, Гаусса. Кожен з цих методів має свої переваги та недоліки. Так наприклад метод прямокутників досить наглядний, простий для розуміння та програмування. Він є так би мовити навчальним методом і необхідний для самого розуміння математичної моделі знаходження визначеного інтегралу. Для інженерних розрахунків знадобляться більш точні методи, наприклад методи Чебишева чи Гаусса[2].
Розглянемо кожний з них більш детально.
1.3.1 Метод прямокутників
Найпростішим методом наближеного обчислення інтеграла є метод прямокутників, геометрична інтерпретація якого зводиться до знаходження визначеного інтегралу як суми площ N прямокутників (з висотою f(x) та основою
отриманих розділень відрізка [а.в] на N рівних частин.(рис.1.1, рис1.2), до того ж якщо розділити на прямокутники зліва на право (див. рис 1.1), то отримаємо формулу лівих прямокутників:
якщо ж розділити на N прямокутників справа наліво (див. рис.1.2), то отримаємо формулу правих прямокутників:
f(x) f(x)
Si
f(Xi)
f(xi)
f(Xn)
Рис.1.1 Рис 1.2
1.3.2 Метод трапецій
Суть методу трапецій полягає в тому, що інтеграл обчислюється по-іншому, відрізок інтегрування поділяється на N рівних відрізків, всередині яких підінтегральна крива f(x) замінюєт ься кусково-лінійною функцією j(х), отриманою стягуванням ординат N відрізків хордами.
f(x)
f(x) j(х)
f(x)
рис.1.3рис1.4
Обчислення визначеного інлдюжегтеграла зводиться до знаходження суми площ Si прямокутних прапецій (рисю1.3, рис.1.4.) N.
Площа кожної такої трапеції (рис.1.4) визначається як
Отже, формула трапеції
Похибка обчислення інтеграла за формулою трапеції оцінюється як
1.3.3 Метод Сімпсона (метод парабол або криволінійних трапецій)
Цей метод близький до методу трапецій у тій частині, що інтегрування проводиться шляхом поділу відрізка інтегрування[а,в] на множину відрізкіав(N пар відрізків). Однак, з метою збільшення точності наближеного інтегрування на кожному відрізку підінтегральної функції f(x) замінюють квадратичною параболою j(х) (рис 1.5, рис.1.6), обчислення визначеного інтеграла зводиться до обчислення суми N криволінійних трапецій
Площа кожної такої такої трапеції (див. рис.1.5.) визначається за формулою Сімпсона:
Тобто
Рисунок 1.5Рисунок 1.6
Тоді чичельне значення визначеного інтеграла на відрізку [а,в] дорівнюватиме сумі інтегралів, тобто
або
де
1.3.4 Метод Ньютона-Котеса
Цей метод засновано на апроксимації однієї із сторін криволінійної трапеції(дивюрис.1.5), яка отримується поділом відрізка [а,в] на N рівних частин, многочленами вищих порядків, також як у методі трапецій використовуєься лінійна апроксимація (заміна однієї із сторін трапеції прямою лінією), а в методі Сімпсона – апроксимація параболою.
Основна формула методу
Де Hi – коефіцієнти Ньютона-Котеса. Ці коефіцієнти не залежать від вигляду f(x) , а є функцією тільки N (кількість вузлів інтерполяції). Таким чином, коефіцієнти Ньютона-Котеса можна обчислити раніше для різного числа вузлів та звести в таблицю1.1.
Легко можна показати , що методи трапецій та Сімпсона є частинними випадками методу Ньютона-Котеса[1].
Коефіцієнти Ньютона-Котеса Таб.1.1
N=1 | Ho=H1=1/2 |
N=2 | Ho=H2=1/6, H1=2/3 |
N=3 | Ho=H3=1/8, H1=H2=3/8 |
N=4 | Ho=H4=7/90, H1=H3=16/45, H2=2/15 |
N=5 | Ho=H5=19/288, H1=H4=25/96, H2=H3=25/144 |
N=6 | Ho=H6=41/840, h1=H5=9/35, H2=H4=9/280, H3=34/105 |
N=7 | Ho=H7=751/17280,H1=H6=3577/17280, H2=H5=1323/17280, H3=H4=2989/17280 |
1.3.5 Метод Чебишева
Метод Чебишева грунтується на обчисленні інтеграла за значеннями функції Yi=f(Xi),(i=1,2,…,N) у зафіксованих вузлах інтерполяції Х1, Х2, …, Хn (де h=const). Коефіцієнти Ньютона-Котеса Hi (i=1,N) не залежать від значень функції у вузлах інтерполяції. П.Л. Чебишев запропонував для обчислення визначених інтегралів використати формулу
в якій квадратурні коефіцієнти Сі (і=1,2,…,N) зафіксовані, а абсциси Хі (і=1,2,…,N) підлягають визначенню.
Для простоти обчислень необхідно вибрати С1=С2=…=Сn. Розглянемо спочатку частинний випадок, коли межі інтегрування дорівнюють –1 та 1. Тоді формула 1.10 набере вигляду
Де квадратурні коефіцієнти Сn та абсциси Хі підлягають визначенню[2].
Коефіцієнти та вузли інтерполяції Хі визначимо із умови, що ця рівність є точною для випадку, коли f(х) многочлен вигляду
Підставимо многочлен1.12 у ліву частину 1.11 та проінтегруємо
У праву частину рівності 1.11 підставимо значення многочлена 1.12 у вузлах Х1, Х2, …,Хn:
Тоді рівність1.13 набере вигляду
Отримана рівність повинна виконуватися за будь-яких значень а0,а1,…,аn і таким чином, порівнюючи коефіцієнти аі в правій лівій частинах 1.15 знаходимо, що n*Cn=1, звідки
i, крім цього,
Підставляючи знайдене для Сn виразу в співвідношення 1.13 отримаємо формулу Чебишеваде точки Х1,Х2,…Хn визначаються із системи рівнянь 1.17.
Значення Х1,…,Хn для різних n обчислюються раніше та зводяться в таблицю 1.2.
Таблиця 1.2
Число ординат | Значення абсцис |
N=2 | -Х1=Х2=0.577350 |
N=3 | -Х1=Х3=0.707107; Х2=0 |
N=4 | -Х1=Х4=0.794654; -Х2=Х3=0.187592 |
N=5 | -Х1=Х5=0.832498; -Х2=Х4=0.374541; Х3=0 |
N=6 | -Х1=Х6=0.866247; -Х2=Х5=0.422519; -Х3=Х4=0.266635 |
N=7 | -Х1=Х7=0.883862; -Х2=Х6=0.529657; -Х3=Х5=0.323912; Х4=0 |
Коли межі даного інтеграла відрізняються від –1 та 1 , формула Чебишева матиме вигляд
де
а Хі мають вказані в таблиці значення.
1.3.6 Метод Гауса
Для отримання підвищеної точності за чисельним інтегруванням користуються формулою Гаусса
в якій не фіксуються не тільки вузли інтерполяції Х1, Х2,…,Хn, а й квадратурні коефіцієнти С1,…,Сn. При цьому Zn невідомих величин Х1,Х2,…,Хn ; С1,…,Сn визначається із умови, що формула є точною у випадку будь-якого многочлена 2n-1[1].
Таким чином, для будь-якого многочлена (2n-1)-й степені
повинна виконуватися рівність:
Многочлен f(x), степені якого рівні 2n-1 , можна показати у вигляді
f(x)=F(x)Q(x)+R(x),(1.24)
де F(x)-шуканий многочлен n-ї степені, а Q(x) та R(X)- відповідно частинне від ділення f(x) на F(x) та залишок від цього ділення, степені многочленів Q(x) та R(x) не перевищують (2n-1).
Вираз для F(x) можна записати так:
тут величини Х1,…,Хn- шукані абсциси формули Гаусса, а А1,А2,…,Аn- постійні.
Оскільки шукана функція F(x) у вузлах Х1,…,Хn перетворюється на нуль, то
Тоді рівність 1.23 набере вигляду
Але для многочлена R(x) степені не вище n-1 також повинна бути точна рівність:
Bіднімаючи 1.28 1.27 ,отримаємо
Із останнього відношення можна визначити шукану функцію F(x). Оскільки рівність 1.29 справедлива для якого-небудь многочлена Q(x) степені n-1 , тобто для многочлена вигляду
то вона при будь-яких коефіцієнтах
отже, маємо таку систему рівнянь(1.31)
Підставляючи сюди вирази для F(x) із формули 1.25 та інтегруючи, отримаємо для визначення коефіцієнтів систему n рівнянь(1.32)
з яких видно, що А1=А3=А5=А7=…=0 та, отже, шуканий многочлен має вигляд
Відмітимо, що при парному n корені рівняння F(x)=0 попарно рівні за абсолютним значенням, але протилежні за знаком, а при непарному n коренем є також і Х=0[1].
Визначивши із системи 1.32 коефіцієнти Аі (і=1,2,…,n), складемо рівняння F(x)=0 та знайдемо його корені Х1,…,Хn, тобто шукані абсциси формули Гаусса, а потім обчислимо коефіцієнти Сі (і=1,2,…,n) за формулою
1.4 Уточнена постановка задачі
Проект дослідження функції розробляється для дослідження заданої підінтегральної функції.
В даному проекті будуть реалізовуватися наступні функції:
1. Дослідження заданої функції різними методами (за умовою завдання);
2. Зміна кроку дослідження функції;
3. Зміна меж дослідження функції;
4. Вивід результатів;
5. Тестування програми на фнкціях, які легко обраховуються;
5. Вивід допомоги про програму та автора;
2
Розробка алгоритмів
моделювання на ЕОМ
2.1 Планування вхідних та вихідних даних
Для розвязку поставленої задачі потрібні певні вхідні данні, на основі яких будуть проводитись обчислення. В нашому випадку вхідними данними будуть проміжки інтегрування. Причому послідовнність введення проміжків необхідно зберігати(спочатку вводиться точка з меншим значенням, потім з більшим). Для дослідження функції потрібно задавати також крок, з яким буде змінюватись коефіцієнт “k”. Для роботи меню вхідними данними також будуть коди нажатих клавіш на клавіатурі.
Проміжки, які вводяться для дослідження інтегральної функції маюти тип float, тобто вони можуть приймати як цілі, так і дробові значення на інтервалі 3.4*10-38
до 3.4* 1038
.
При дослідженні інтегралу також необхідно вводити межі, в яких буде змінюватись коефіцієнт k, який теж має тип float, але за умовою задачі 0≤k≤1.
Всі вхідні данні для зручності зібрані в один клас CD, який містить також декілька компонентних функцій для обробки цих даних (вивід, зміна).
Вихідними данними є масив значень функції при певному значенні аргументу.
Всі вхідні та вихідні данні можна звести в таблицю.
Таблиця 2.1. Вхідні та вихідні данні
Змінна | Тип | Межі | Примітка |
fip | float | 3.4*10-38
-3.4* 1038 |
Початкова точка інтегрування |
fik | float | 3.4*10-38
-3.4* 1038 |
Кінцева точка інтегрування |
kp | float | 3.4*10-38
-3.4* 1038 |
Початкове значення коефіцієнту k |
kk | float | 3.4*10-38
-3.4* 1038 |
Кінцеве значення коефіцієнту k |
h | float | 3.4*10-38
-3.4* 1038 |
Крок дослідження функції |
y | float | 3.4*10-38
-3.4* 1038 |
Значення інтегральної функції |
2.2
Аналіз задачі, які вирішуються при дослідженні об
’
єкта на ЕОМ
Метою даного моделювання є дослідження функції
при змінному значені k , . Отже необхідно вивести таблицю значень функції в залежності від аргументу k. При цьому k слід змінювати з сталим кроком.
2.3 Описовий алгоритм головної програми
В розробленій програмі використовується меню, тобто всі функції можуть використовуватись нескінченну кількість разів. Така властивість забезпечується завдяки використанню циклу в головній програмі, вихід з якого здійснюється лише при одній умові : вибір пункту меню „Вихід”.
В операторі вибору умовою є функція меню, яка в залежності від вибраного пункту вона дає певний результат. Кожен пункт меню описаний окремою функцією, що є дуже зручним у даному випадку. За пункт меню «Допомога» відповідає функція HelpAbout(), вона без вхідних параметрів. Для виводу таблиці вихідних данних з змінним коефіцієнтом k методом Сімпсона, Нютона-Котеса та Чебишева служать відповідно функції ResultSimps(d), ResultNuton(d), ResultCheb(d).
2.4 Схема алгоритму головної програми
Блок-схема алгоритму головної програми показана на рисунку 2.1.
2.5 Алгоритми
методів
(всі схеми алгоритмів для всіх методів, опису вхідних та вихідних даних )
2.5.1 Алгоритм методу Сімпсона
В методі Сімпсона інтегрування проводиться шляхом поділу відрізка інтегрування [A,B] на множину відрізків (N пар відрізків). Однак з метою збільшення точності наближеного інтегрування на кожному відрізку [Xi, Xi+2] підінтегральної функції f(x) замінюється квадратичною параболою j(х). Обчислення визначеного інтегралу зводиться до обчислення суми N криволінійних трапецій Si: . Площа такої трапеції визначається за формулою Сімпсона:
Блок-схема алгоритму методу Сімпсона зображена на рисунку 2.2
Рисунок 2.1.Блок-схема головної програми
2.5.2 Алгоритм методу Нютона-Котеса
Цей метод засновано на апроксимації однієї із сторін криволінійної трапеції, яка отримується поділом відрізка [A,B] на N рівних частин, многочленами вищих порядків, а також використовується лінійна апроксимація.
Основна формула методу:
,
де Ні – коефіцієнти Нютона-Котеса. Вони незалежать від вигляду f(x), а є функцією тільки N. Таким чином коефіцієнти Нютона-Котеса можна обчислити раніше для різного числа N і звести в таблицю.
Блок-схема алгоритму методу Нютона-Котеса зображена в на рисунку 2.3.
2.5.3 Алгоритм методу Чебишева.
Метод чебишева грунтується на обчисленні інтеграла за значеннями функції yi
=f(xi
) у зафіксованих вузлах інтерполяції.
Блок-схема алгоритму методу Чебишева зображена на рисунку 2.4.
Рисунок 2.2. Блок-схема алгоритму методу Сімпсона
2.6 Опис основних функцій
Для спрощення розробки програми в ній було використано ряд стандартних та розроблено декілька власних функцій, а також створено 2 класи. Так наприклад функція FrameW() малює рамку на екрані (типу вікна). Функції cursor_off() та cursor_on() виключають та включають зображення курсора відповідно. VievZavd() виводить завдання, що виконує дана програма.
Клас CD обєднує в собі всі початкові данні (межі, крок), а також деякі процедури для зміни цих данинх, а також їх вивід на екран.
Рисунок 2.3. Блок-схема алгоритму методу Нютона-Котеса.
Рисунок 2.4. Блок-схема алгоритму методу Чебишева.
Більш детально стандартні та власні функції описані в таблицях 2.2 та 2.3 відповідно.
Таблиця 2.2 Список стандартних функцій, які використовуються.
Назва функції | Принадлежність до бібліотеки | Опис |
textcolor() | conio.h | Задає колір тексту |
textbackground() | conio.h | Задає колір фону |
gotoxy() | conio.h | Переміщує курсор в задану позицію |
cprintf() | conio.h | Виводить символи на екран |
window() | conio.h | Встановлює вікно виводу заданного розміру |
clrscr() | conio.h | Очищає текуче вікно виводу |
scanf() | stdio.h | Робить запит на ввод з клавіатури |
gettextinfo() | conio.h | Отримує інформацію про параметри тексту (колір, фон, положення курсору) |
fread() | stdio.h | Читає з файлу певний блок інформації |
fopen() | stdio.h | Відкриває файл для читання |
fclose() | stdio.h | Закриває файл |
sqrt() | math.h | Знаходить корінь квадратний аргументу |
sin() | math.h | Знаходить сінус аргументу |
getch() | conio.h | Затримка роботи програми до натискання клавіші |
Таблиця 2.3 Список власних функцій, які використовуються.
Назва функції | Опис |
FrameW() | Малює рамку на екрані заданого кольору |
cursor_off() | Вимикає зображення курсора |
cursor_on() | Вмикає зображення курсора |
Ramky() | Малює фон робочого столу і рамку навколо нього |
HelpMenu() | Вивід допомоги про кожен пункт меню |
menu() | Зображує головне меню програми |
HelpAbout() | Вивід допомоги про програму |
simp() | Знаходження інтегралу методом Сімпсона |
ResultSimps() | Вивід таблиці значень методом Сімпсона |
nuton() | Знаходження інтегралу методом Нютона |
ResultNuton() | Вивід таблиці значень методом Нютона |
cheb() | Знаходження інтегралу методом Чебишева |
ResultCheb() | Вивід таблиці значень методом Чебишева |
2.7 Структура комплексу програм для дослідження об
’
єкта на ЕОМ
Поскільки програма написана з використання модульного програмування, то розроблена програма складається з декількох модулів, розроблених самостійно.
Розбивання програми на модулі (бібліотеки) дозволяє згрупувати функції за певним їх призначенням, що призводить до зменшення помилок програмі та легкого їх пошуку.
В даному випадку програма використовує функції шістьох стандартних модулів, та одного, розробленого самостійно. Список модулів приведений у таблиці 2.4.
Таблиця 2.4. Список бібліотек, які використовуються.
Назва модуля | Принадлежність | Опис |
stdio.h | Стандартна бібліотека | Функції вводу-виводу |
conio.h | Стандартна бібліотека | Функції роботи з екраном(консолью) |
io.h | Стандартна бібліотека | Потоки ввод-вивід |
dos.h | Стандартна бібліотека | Спеціальні функції |
math.h | Стандартна бібліотека | Математичні функції |
stdlib.h | Стандартна бібліотека | Допоміжні функції |
window.cpp | Власна бібліотека | Зберігає опис класу CWindows |
Взаємозвязок між бібліотеками та головною програмою можна розглянути на рисунку 2.5.
Рисунок 2.5. Взаємозвязок між бібліотеками та головною програмою
3 Планування експепементальних досл
і
джень об’
єкту на ЕОМ
3.1 Класифіквція експерементів
Для впевненості роботи програми проведемо її експерементальне тестування. Але тестування необхідно виконувати в два основних етапи: тестування головної програми, тобто достовірність роботи головного меню програми, та власне і роботи самих пунктів меню - правильність роботи самих методів.
3.2 Опис експерементальних досліджень
Для тестування правильності роботи методів проводиться тестування самих обчислювальних процесів, причому тестування проводиться на нескладних прикладах, для швидшого співставлення результатів.
3.3 Дослідження об’єкту на ЕОМ
Метою даної курсової роботи є знаходження показників вольтметра при То
=23о
,44о
,67о
,92о
С , за допомогою апарату кубічних сплайнів і ортогональних поліномів Чебишева.
Проведемо дослідження об’єкта на ЕОМ та зведемо отримані данні в таблиці. Результати дослідження приведені в таблиці 3.1
Таблиця 3.1 Результати дослідження об’єкту на ЕОМ
То
|
Апроксимація по Чебишеву | Апроксимація кубічних сплайнів |
23о
|
Т=23,00000 | Т=23,00000 |
Q=-0,19203 | Q=-0,17907 | |
е=0,00003 | е=0,01297 | |
44о
|
Т=44,00000 | Т=44,00000 |
Q=0,25892 | Q=0,48192 | |
е=0,00004 | е=0,22300 | |
67о
|
Т=67,00000 | Т=67,00000 |
Q=0,76861 | Q=0,87606 | |
е=0,00013 | е=0,10745 | |
92о
|
Т=92,00000 | Т=92,00000 |
Q=1,33752 | Q=1,30832 | |
е=0,00022 | е=0,02920 |
4 Аналіз результатів дослідження
В даній курсовій роботі ми дослідили еліптичний інтеграл першого роду при різних значеннях аргументу k (при 0≤k≤1 ) різними методами : Сімпсона, Нютона-Котеса, Чебишева. В результаті ми отримали таблицю значень, з якої можна спостерігати як впливає значення коефіцієнта на сам інтеграл. Для проміжку інтегрування (0;1)та для при кроці h=0.05 дані зведені в таблицю 4.1.
Таблиця 4.1 Результати експерементальних досліджень
k | f(k,φ) | ||
м-д Сімпсона | м-д Нютона-Котеса | м-д Чебишева | |
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 |
1.00000000 0.99863505 0.99452144 0.98760122 0.97777176 0.96487713 0.94869113 0.92888802 0.90499073 0.87626529 |
1.00000000 0.99863511 0.99452150 0.98760098 0.97777128 0.96487653 0.94868988 0.92888618 0.90498829 0.87626225 |
1.00000000 0.99863511 0.99452144 0.98760092 0.97777128 0.96487647 0.94868994 0.92888629 0.90498835 0.87626213 |
Як видно з таблиці 4.1 коефіціент k впливає на значення інтегралу обернено-пропорційно. Тобто при збільшені коефіцієнта значення функції зменшується.
5
Оц
інка похибок отриманих результатів
Для аналізу похибок необхідно знати точне та наближене значення. Для функції тестування провести аналіз похибки набагато простіше, адже точне значення знаходиться дуже легко. Так наприклад при обчисленні точні значення інтегралу взагалі можна обраховувати „в умі”. Для тестування функції ми скористаємось допомогою середовища “MathCad”
Знайдемо похибку трьох методів для першого і другого тесту, що описані в розділі 3.2. При обчисленні наближеними методами (програмою) ми отримали результати, приведені в таблиці 3.1 та 3.2. Розраховані похибки обчислень тесту №1 приведені в таблиці 5.1 та 5.2. Похибки для тесту №2 приведені в таблиці 5.3 і 5.4.
Таблиця 5.1 Оцінка абсолютних похибок тесту №1
x | Абсолютна похибка Δ | ||
Сімпсона | Нютона-Котеса | Чебишева | |
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 |
0.000 0.000 0.000 0.000 0.000 0,00000003 0,00000004 0,00000006 0.00000008 0.00000009 0.00000018 |
0.000 0.000 0.000 0.000 0,00000001 0.000 0,00000001 0.00000005 0.00000005 0.00000009 0.00000018 |
0.000 0.000 0.000 0.000 0,00000001 0.000 0,00000001 0.00000005 0.00000005 0.00000009 0.00000012 |
Таблиця 5.2 Оцінка відносних похибок тесту №1
x | Відносна похибка ε, % | ||
Сімпсона | Нютона-Котеса | Чебишева | |
0.00 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 1.00 |
0.000 0.000 0.000 0.000 0.000 0.000024 0.000031 0.000038 0.000041 0.000044 0.000083 |
0.000 0.000 0.000 0.000 0,0000125 0.000 0,0000125 0.000034 0.000038 0.000044 0.000083 |
0.000 0.000 0.000 0.000 0,0000125 0.000 0,0000125 0.000034 0.000034 0.000038 0.000066 |
Таблиця 5.3 Оцінка абсолютних похибок тесту №2
x | Абсолютна похибка Δ | ||
Сімпсона | Нютона-Котеса | Чебишева | |
0.00 0.40 0.80 1.20 1.60 2.00 2.40 2.80 3.20 3.60 4.00 |
0.000 0.00000069 0.00000111 0.00000135 0.00000143 0.00000239 0.0000166 0.0000170 0.0000158 0.0000157 0.0000159 |
0.000 0.00000001 0.00000001 0.00000001 0.00000001 0.00000055 0.00000220 0.00000718 0.00001946 0.000004585 0.000009672 |
0.000 0.000 0.00000002 0.00000004 0.000 0.00000003 0.000000150 0.000000498 0.000001380 0.000003253
> 0.000006886 |
Таблиця 5.4 Оцінка відносних похибок тесту №2
x | Відносна похибка ε, % | ||
Сімпсона | Нютона-Котеса | Чебишева | |
0.00 0.40 0.80 1.20 1.60 2.00 2.40 2.80 3.20 3.60 4.00 |
0.000 0.0011 0.00058 0.00040 0.000301 0.0004434 0.00024 0.00226 0.00192 0.00192 0.00192 |
0.000 0.000 0.000 0.000 0.000 0.0000932 0.0003184 0.000944 0.00137 0.0052 0.00107 |
0.000 0.000 0.000 0.000 0.0000118 0.0000091 0.0002697 0.000655 0.00168 0.000373 0.0007651 |
Отже як видно з приведеного аналізу найменшу похибку має метод Чебишева, тобто він є найточнішим
6
Оцінка ефективності комплексу програм для дослідження
Програма для обчислення визначеного інтегралу була написана Турбо Сі 3.1, компілятор який дає досить оптимізований програмний код, і скомпільована в 16-ти бітному коді. Передбачено зручний інтерфейс користувача, можливість запуску програми паралельно з іншими програмами (тільки в Windows), що прискорює роботу користувача і робить програму більш практичною.
Загальний розмір програми складає 52,7 Кбайт. Програма не містить архівів, що саморозпаковуються, що робить можливість її швидкого запуску прямо з незахищеної дискети. Але краще робити запуск із твердого диска, тому що швидкість звертання до нього і швидкість запису на нього вище, ніж у дискети, так само це підвищить надійність збереження інформації. У принципі дана програма - примітивна демонстраційна версія, яку можна розвити в дійсну гарну програму: організувати запис результатів на диск, вивід на принтер, меню зі спливаючими підказками. При використанні Visual C++ існує можливість підключення безлічі бібліотек і модулів, при підключенні яких можна зробити дійсно професійну програму, що буде робити усе, що хочеш і буде проста у користуванні.
Програма була написана під MS-DOS, але може працювати і під іншими оболонками, які емулюють роботу MS-DOS - Windows , OS/2, MAC, що підтримують 16-бітний код і кодування MS-DOS.
Основною перевагою данної програми є невисока вибагливість до апаратного забезпечення, її простота забезпечує досить високу швидкодію навіть на клмпютерах класу 80826.
Мінімальні технічні вимоги для програмного i апаратного забезпечення для інсталяції програми:
- Операційна система: MS-DOS 6.22, Windows 3.1, Windows 95, 98, ME, 2000, Windows NT, OS/2 чи MAC (підтримка 16-бітного коду і символьного кодування DOS )
- 512 Kбайт ОЗУ при роботі з MS-DOS;
- VGA Card
- 55 Kбайт на жорсткому диску чи дискеті
- дисковод 1.44 Mб.
В результаті роботи отримані файли (табл.6.1), які містять код програми на Сі++, та виконуючий файл в машинних кодах.
Таблиця 6.1. Розмір вихідних файлів
Назва модуля | Розмір, Кб | Опис |
lew_int.cpp | 14,38 | Головна програма |
CWindow.cpp | 3,93 | Опис класу „CWindows” |
int_prg.hlp | 0.090 | Файл допомоги |
int_aut.hlp | 0.141 | Файл допомоги |
lew_int.exe | 52.7 | Виконуюча програма |
7
Розробка пакету документів для супроводження комплексу програм
7.1 Інструкція програмісту
7.1.1 Опис вихідного коду
Код програми на С++ міститься в файлах з розширеням *.срр. Для зручного користування програма розбита на 2 модулі (бібліотеки), призначення яких описане в пп.2.5.
7.1.2 Зміна інтегруючої функції.
Для зміни інтегруючої функції в усіх методах, за виключенням тестування у файлі lew_int.cpp знайти функцію f, яка має такий опис: float f(CDfd), та змінити лише формулу. При цьому слід знати, що змінна fd.fit – це і є змінна, по якій проводиться інтегрування. Змінна fd.kt – це коефіцієнт, який може приймати різні значення.
Для зміни інтегруючої функції в тестуванні необхідно таким же чином змінити функцію f1(CDfd) або f2(CDfd) для тесту №1 або тесту №2 відповідно.
7.1.3 Зміна тексту допомоги
Щоб змінити текст допомоги потрібно відкрити в будь-якому текстовому редакторі, шо підтримує кодування DOS, файли int_prg.cppдля зміни тексту допомоги про програму, або int_aut.cpp для зміни тексту допомоги про автора.
7.2 Інструкція користувачеві
7.2.1 Запуск
Запуск програми здійснюється після запуску MS-DOSчи емулятора DOS у випадку використання Windows, OS/2 чи MAC. Файл, що запускає програму – lew_int.exe. Після запуску програми перед користувачем з'являється її інтерфейс, рис.7.1.
Рисунок 7.1.Iнтерфейс програми
7.2.2 Ввод данних
Для вводу даних (крок, межі інтегрування, межі зміни коефіцієнту k) вибираємо пункт “Зміна параметрів”. У випадаючому вікні(рис.7.2) вибираємо необхідний параметер, який хочемо змінити. При виборі пункуту „Крок” програма робить запит на ввод кроку(рис.7.3.). При виборі пункту „Межі інтегрування” програма робить запит на ввод початкового та кінцевого проміжків інтегрування(рис.7.4). Для зміни меж коефіцієнта k необхідно вибрати пункт „Межі коефіцієнта к”(рис.7.5). При цьому слід мати на увазі, що якщо замість числової інформації ввести текстову (букви), то результати роботи програми стануть непередбачуваними, можливий збій і аварійний вихід з програми. Також слід пам”ятати, що при дослідженні методами Нютона-Котеса та Чебишева кількість проміжків інтегрування неповинна перевищувати 7, тому що саме на таку максимальну кількість призначені алгоритми даних методів.
Рисунок 7.2. Підменю зміни параметрів
Рисунок 7.3. Зміна кроку дослідження функції
Рисунок 7.4. Ввод нових меж інтегрування
Рисунок 7.5. Зміна меж зміни коефіціету k
7.2.3 Перегляд результатів
Результати роботи програми з”являються при виборі необхідного методу розв’язання поставленої задачі(рис.7.6). Результати з’являються не більше ніж через 1 с. після вводу даних.
Для спостереження залежності результату від коефіцієнта k дані групуються в таблицю (рис.7.7.), яку можна переглянути, вибравши метод рішення поставленої задачі з меню „Дослідження”.
Рисунок 7.6. Вибір методу розв’язання задачі
Рисунок 7.7. Перегляд данних
Для виведення інфоромації про програму або автора вибираємо пункт “Про програму” або „Про автора” відповідно з меню допомоги „?”.
7.2.4 Вихід з програми
Для виходу з програми достатньо вибирати пункт “Вихід”, і натиснути клавішу <Enter>.
Висновки
В результаті виконання даної роботи було розроблено програму, яка задовольняє усім вимогам до курсової роботи - складається з основної програми та 1-го модуля (бібліотеки) користувача, працює в режимі меню.
Курсова робота складається з 7 розділів. В першому розділі було приведено основні відомості стосовно розробки програм, працюючих в режимі графічного інтерфейсу, особливості роботи з математичними функціями.
В другому розділі наведено математичну модель програми.
Третій розділ присвячений тестуванню програми, а також дослідженню об’єкта на ЕОМ.
В четвертому розділі проводиться аналіз результатів дослідження.
В п’ятому розділі проводиться аналіз похибок експериментальних досліджень.
В шостому розділі приводиться аналіз ефективності програми.
Сьомий розділ складає супроводжувальна документація, призначена для персоналу, який обслуговує дане програмне забезпечення.
Під час виконання курсової роботи я набула досвіду професіонального програмування. Я дійшла висновку, що мова програмування Турбо Сі безумовно може бути використана для написання подібних матиматичних систем, тому що вона має декілька зручних циклів, має багато математичних функцій, компілятор дає оптимізований код.
Додаток А
Міністерство освіти і науки України
Вінницький національний технічний університет
Інститут автоматики електроніки та комп’ютерних систем управління
Кафедра комп’ютерних систем управління
Узгоджено Розроблено
Керівник __________С.М. Москвіна
Студент_________ О.В.Левицька
”_____” __________2004р.
Технічне завдання
на виконання курсової роботи
” Дослідження еліптичного інтегралу на ЕОМ.”
При розробці даної роботи необхідно виконувати слідуючи етапи:
1.1 Найменування та галузь застосування об’єкта розробки: цей комплекс програм може бути застосований на будь-якому підприємстві для полегшення та покращення результатів роботи інженерів
1.2 Підстава для проведення роботи: дослід штучного інтелекту
1.3 Дата початку роботи:8.01.04.
1.4 Дата закінчення роботи: 10.04.04.
1.5 Мета призначення розробки: створити як найкращий комплекс програм для полегшення та покращення роботи інженера підприємства
1.6 Вимоги до надійності системи: використання структурного програмування, окреме підключення модулів, єдине меню, тощо – усе це забезпечує надійність системи. Програмне забезпечення та супроводжуюча текстова документація повинна задовільнити таким гостам:
ГОСТ 19.701-90 (МСО 5807-85) ГОСТ 19.101-77 (СТСЄВ 1626-7а)
ГОСТ 19.781-74 ГОСТ 7.1-84 ДСТУ 3008-85
ГОСТ 19.401-78 ГОСТ 19.106-78
1.7 Стадії та етапи розробки:
1 етап: розробка індивідуального та технічного завдання.(до 15.01.04)
2 етап: огляд та аналіз методів моделювання зміни температури термопари на ЕОМ (до 1.02.04).
3 етап: розробка алгоритмів моделювання зміни температури термопари на ЕОМ (до 20.02.04).
4 етап: розробка керуючої програми, яка повинна працювати в режимі багато ієрархічного меню (до 10.03.04).
5 етап: об’єднання всіх програмних модулів та тестування керуючої програми (до 15.03.04).
6 етап: розробка тестів, тестування та демонстрація роботи всього комплексу (до 15.03.04).
7 етап: розробка технічної документації та пояснювальної записки (до 20.03.04).
8 етап: вимоги до безпеки: розроблене програмне забезпечення повинно відповідати вимогам Сніп та ДЕСТів до робочого місця оператора ЕОМ.
Додаток Б
Лістинг головної програми
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <sysstat.h>
#include <stdlib.h>
#include <math.h>
#include "cwindow.cpp"
void FrameW(int x1,int y1,int x2,int y2,int tb=3,int tk=15,int rk=15){
int ii;
textcolor(rk);
textbackground(tb);
//int x=wherex(),
// y=wherey();
gotoxy(x1,y1); cprintf("г");
for(ii=x1+1;ii<=x2-1;ii++)
cprintf("-");
cprintf("¬");
for(ii=y1+1;ii<=y2-1;ii++){
gotoxy(x1,ii);
cprintf("¦");
}
gotoxy(x1,y2); cprintf("L");
for(ii=x1+1;ii<=x2-1;ii++)
cprintf("-");
cprintf("-");
for(ii=y1+1;ii<=y2-1;ii++){
gotoxy(x2,ii);
cprintf("¦");
}
window(x1+1,y1+1,x2-1,y2-1);
clrscr();
textcolor(tk);
}
void cursor_off(){
union REGS r;
r.x.ax=0x100;
r.x.cx=0x2607;
int86(0x10,&r,&r);
}
void cursor_on(){
union REGS r;
r.x.ax=0x100;
r.x.cx=0x506;
int86(0x10,&r,&r);
}
void VievZavd(void){
window(1,1,79,24);
FrameW(4,7,35,11);
cprintf(" f ________________");
cprintf("nrF(k,f)=S v1-(k^2)*sin(Q)^2 dQ");
cprintf("nr 0");
}
class CD {
public:
float fip,fik,fit,kp,kk,kt,h,hi;
public:
CD(float,float,float,float,float);
void Change_fi(void); // интервал
void Change_k(void); // коефициенты
void Change_h(void); // шаг
void Viev(void); // вывод значений
};
CD::CD(float _fip,float _fik,float _kp,float _kk,float _h){
fip=_fip;
fik=_fik;
kp=_kp;
kk=_kk;
h=_h;
hi=0.1;
}
void CD::Change_fi(void){
window(1,1,80,25);
CWindows win1(24,9,56,16,"");
win1.ShowWindow();
cprintf("Змiна меж iнтегрування");
cprintf("nrВведiть новi межi fi");
cprintf("nr fi_поч=");
cursor_on();
scanf("%f",&(this->fip));
cprintf("r fi_кiнц=");
scanf("%f",&(this->fik));
cursor_off();
Viev();
win1.HideWindow();
}
void CD::Change_k(void){
window(1,1,80,25);
CWindows win1(24,9,56,16,"");
win1.ShowWindow();
cprintf("Змiна меж коефiцiэнтiв");
cprintf("nrВведiть новi коефiцiэнти");
cursor_on();
cprintf("nrk_поч=");
scanf("%f",&(this->kp));
cprintf("rk_кiнц=");
scanf("%f",&(this->kk));
cursor_off();
Viev();
win1.HideWindow();
}
void CD::Change_h(void){
window(1,1,80,25);
CWindows win1(24,9,56,16,"");
win1.ShowWindow();
cprintf(" Змiна кроку");
cprintf("nrВведiть новий крок");
cprintf("nrh=");
cursor_on();
scanf("%f",&(this->h));
cursor_off();
Viev();
win1.HideWindow();
}
void CD::Viev(void){ //
window(1,1,79,24);
FrameW(4,3,50,5);
cprintf("fip=%4.2f;fik=%4.2f;kp=%4.2f;kk=%4.2f;h=%5.4f",fip,fik,kp,kk,h);
}
void Ramky(void) //Ф-я для вивода рамки
{ //синего цвета на весь экран
window(1,1,80,25);
textbackground(15);
clrscr();
window(3,2,78,24);
textbackground(1);
clrscr();
for(int i=1;i<=1747;i++) cprintf("-");
window(1,1,80,25);
}
void PrintfStrMenu(char str[20]) //Вывод невыделеного пункта меню
{
text_info TextBegin; //начальные установки текста
gettextinfo(&TextBegin); //Получить начальные установки
textcolor(0);
textbackground(15);
cprintf("%s",str);
textattr(TextBegin.attribute);
}
void PrintfStrMenuP(char str[20]) //Вывод выделеного пунка меню
{
text_info TextBegin; //начальные установки текста
gettextinfo(&TextBegin); //Получить начальные установки
textcolor(0);
textbackground(2);
cprintf("%s",str);
textattr(TextBegin.attribute);
}
int menu() //Ф-я вывода главного меню
{ //возыращает номер выделеного пункта
int num=1; //Режим меню
char key=1; //Опрос клавиши
char numMin=1; //Мин. реж. меню
char numMax=5; //Макс. реж. меню
int PosMenuX=3, //Положение верхнего
PosMenuY=1, //левого угла меню
HightMenu=1, //Высота меню
WidthMenu=75; //Ширина меню
//*******************************************
window(PosMenuX,PosMenuY,PosMenuX+WidthMenu,PosMenuY+HightMenu-1);
cursor_off();
do{
gotoxy(1,1);
if (num==1){
PrintfStrMenuP(" ? ");
}
else{
PrintfStrMenu(" ? ");
}
if (num==2){
PrintfStrMenuP(" Дослiдження ");
}
else{
PrintfStrMenu(" Дослiдження ");
}
if (num==3){
PrintfStrMenuP(" Тестування ");
}
else{
PrintfStrMenu(" Тестування ");
}
if (num==4){
PrintfStrMenuP(" Змiна параметрiв ");
}
else{
PrintfStrMenu(" Змiна параметрiв ");
}
if (num==5){
PrintfStrMenuP(" Вихiд ");
}
else{
PrintfStrMenu(" Вихiд ");
}
if((key=getch())==0){ //если код расширеной клавиши,
switch(getch()){ // то щитываем очередной из буф. клавиатуры
case 72:;break; //клавиша вверх
case 75:--num;break;
case 77:++num;break;
case 80:key=13;break; //клавиша вниз
}
if(num<numMin) num=numMax; //если выбираем больше максимального,. то получаем минимальный
if(num>numMax) num=numMin; // <= а здесь наоборот
}
else{
if((key>=numMin+48)&&(key<=numMax+48))
num=key-48;
}
} while(!(key==13)); //выход, если нажат ентер
return num;
}
//************************* Выпадающие меню **************************
void PrintfStrMenu_x(char str[20]) //Вывод невыделеного пункта меню
{
text_info TextBegin; //начальные установки текста
gettextinfo(&TextBegin); //Получить начальные установки
textcolor(0);
textbackground(7);
cprintf("%snr",str);
textattr(TextBegin.attribute);
}
void PrintfStrMenuP_x(char str[20]) //Вывод выделеного пунка меню
{
text_info TextBegin; //начальные установки текста
gettextinfo(&TextBegin); //Получить начальные установки
textcolor(0);
textbackground(6);
cprintf("%snr",str);
textattr(TextBegin.attribute);
}
int menu_x(int _PosMenuX,int _PosMenuY,int _WidthMenu,int _HightMenu,char _numMax=1,char s1[]="123321",char s2[]="",char s3[]="",char s4[]="",char s5[]="") //Ф-я вывода главного меню
{ //возыращает номер выделеного пункта
int num=1; //Режим меню
char key=1; //Опрос клавиши
char numMin=1; //Мин. реж. меню
char numMax=_numMax; //Макс. реж. меню
int PosMenuX=_PosMenuX, //Положение верхнего
PosMenuY=_PosMenuY, //левого угла меню
HightMenu=_HightMenu, //Высота меню
WidthMenu=_WidthMenu; //Ширина меню
char *s[6];
s[1]=s1;
s[2]=s2;
s[3]=s3;
s[4]=s4;
s[5]=s5;
//*******************************************
cursor_off();
window(1,1,80,25);
CWindows win_1(PosMenuX,PosMenuY,PosMenuX+WidthMenu,PosMenuY+HightMenu);
win_1.ShowWindow();
do{
gotoxy(1,1);
for(int i=1;i<=numMax;i++){
if(i==num) PrintfStrMenuP_x(s[i]);
else PrintfStrMenu_x(s[i]);
}
if((key=getch())==0){ //если код расширеной клавиши,
switch(getch()){ // то щитываем очередной из буф. клавиатуры
case 72:--num;break; //клавиша вверх
case 75:{key=27;}break;
case 77:{key=27;}break;
case 80:++num;break; //клавиша вниз
}
if(num<numMin) num=numMax; //если выбираем больше максимального,. то получаем минимальный
if(num>numMax) num=numMin; // <= а здесь наоборот
}
else{
if((key>=numMin+48)&&(key<=numMax+48))
num=key-48;
}
} while(!((key==13)||(key==27))); //выход, если нажат ентер
win_1.HideWindow();
if(key==27) return 0;
return num;
}
void HelpAbout(char FileName[]) //ф-я вывода помощи из соответствующего файла
{
FILE *help_f;
window(1,1,80,25);
CWindows win1(4,5,77,20,"Допомога");
win1.ShowWindow();
if ((help_f=fopen(FileName,"r"))==NULL) //если неудается открыть, то выводим соответственно сообщение
{
cprintf("nrПомилка при вiдкриттi файла допомоги %s",FileName);
cprintf("nrДопомога недоступна");
cprintf("nrНажмiть будь-яку клавiшу...");
getch();
}
else //Иначе выводим файл помощи
{
char ch;
fread(&ch,sizeof(char),1,help_f);
while(!feof(help_f))
{
if (ch=='n') cprintf("nr");
else
cprintf("%c",ch);
fread(&ch,sizeof(char),1,help_f);
}
fclose(help_f);
cprintf("nrНажмiть будь-яку клавiшу...");
getch();
}
win1.HideWindow();
}
//*********************** Математические ф-и *********
float f(CD fd){
return sqrt(1-fd.kt*fd.kt*sin(fd.fit)*sin(fd.fit));
}
float f1(CD fd){
return fd.fit;
}
float f2(CD fd){
return fd.fit*exp(-fd.fit);
}
// Ф-и метода Симпсона
float simp(CD sd, float F(CD)=f)
{
float A=sd.fip,
B=sd.fik,
S=0.0;
sd.fit=sd.fip;
int N=int((B-A)/(2.0*sd.hi));
float E=1;
float H;
if(N==0)
{H=0;}
else
{H=(B-A)/(2.0*N);};
//////////////////////
sd.fit=sd.fip;
S=F(sd);
sd.fit=sd.fik;
S=S+F(sd);
for(int i=1;i<=2*N-1;i++){
sd.fit=sd.fip+(i*H);
S=S+(3+E)*F(sd);
E=-E;
}
S=S*H/3;
return S;
}
void ResultSimps(CD rsd){
window(1,1,80,25);
CWindows win1(2,6,79,22,"Метод Сiмпсона");
win1.ShowWindow();
cprintf(" k F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f)");
cprintf("nr----------");
rsd.kt=rsd.kp;
int xpos=1,
ypos=3;
do{
gotoxy(xpos,ypos++);
if (ypos>15) {ypos=3;xpos+=12;}
cprintf("¦%4.2f %6.4f",rsd.kt,simp(rsd));
rsd.kt=rsd.kt+rsd.h;
}while(rsd.kt<=rsd.kk);
gotoxy(xpos,ypos++);
float eps=pow(rsd.kk-rsd.kp,5)/(180*pow(2*(rsd.kk-rsd.kp)/rsd.hi,2))*1000;
cprintf("eps = %10.8f",eps);
getch();
win1.HideWindow();
}
// Ф-и метода Нютона-Котеса
float nuton(CD fd, float F(CD)=f){
float A=fd.fip,
B=fd.fik,
S=0,
H[8];
int i;
int n=7;
float h=(B-A)/(n*1.00);
H[0]=751.0/17280;H[7]=H[0]; H[1]=3577.0/17280;H[6]=H[1];
H[2]=1323.0/17280;H[5]=H[2]; H[3]=2989.0/17280;H[4]=H[3];
fd.fit=A;
for(i=0;i<=n;i++){
S=S+F(fd)*H[i];
fd.fit+=h;
}
S=S*(B-A);
return S;
}
void ResultNuton(CD rtd){
window(1,1,80,25);
CWindows win1(2,6,79,22,"Метод Нютона-Котеса");
win1.ShowWindow();
//cprintf("");
cprintf(" k F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f)");
cprintf("nr--------------");
rtd.kt=rtd.kp;
int xpos=1,
ypos=3;
do{
gotoxy(xpos,ypos++);
if (ypos>15) {ypos=3;xpos+=12;}
cprintf("¦%4.2f %6.4f",rtd.kt,nuton(rtd));
rtd.kt=rtd.kt+rtd.h;
}while(rtd.kt<=rtd.kk);
getch();
win1.HideWindow();
}
// Ф-и метода Чебышева
float cheb(CD fd,float F(CD)=f){
float A=fd.fip,
B=fd.fik,
S=0,
Z[8],
X[8],
C[8];
int n=7;
int i;
X[1]=-0.883862; X[7]=-X[1];
X[2]=-0.529657; X[6]=-X[2];
X[3]=-0.323912; X[5]=-X[3];
X[4]=-0.000000;
for(i=1;i<=n;i++){
Z[i]=(B+A)/2.0+(B-A)*X[i]/2.0;
}
for(i=1;i<=n;i++){
fd.fit=Z[i];
S=S+F(fd);
}
S=S*(B-A)/n;
return S;
}
void ResultCheb(CD rtd){
window(1,1,80,25);
CWindows win1(2,6,79,22,"Метод Чебышева");
win1.ShowWindow();
//cprintf("");
cprintf(" k F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f) X F(k,f)");
cprintf("nr--------------");
rtd.kt=rtd.kp;
int xpos=1,
ypos=3;
do{
gotoxy(xpos,ypos++);
if (ypos>15) {ypos=3;xpos+=12;}
cprintf("¦%4.2f %6.4f",rtd.kt,cheb(rtd));
rtd.kt=rtd.kt+rtd.h;
}while(rtd.kt<=rtd.kk);
getch();
win1.HideWindow();
}
void Sravnenia(CD rtd){
window(1,1,80,25);
CWindows win1(2,6,79,22,"Порiвняння методiв");
win1.ShowWindow();
cprintf(" k Y(Сiмпс) Y(Нют) Y(Чеб) ");
cprintf("nr--------------------------");
rtd.kt=rtd.kp;
do{
cprintf("nr ¦%4.2f %10.8f %10.8f %10.8f",rtd.kt,simp(rtd),nuton(rtd),cheb(rtd));
rtd.kt=rtd.kt+rtd.h;
}while(rtd.kt<=rtd.kk);
float eps=pow(rtd.kk-rtd.kp,5)/(180*pow(2*(rtd.kk-rtd.kp)/rtd.hi,2))*1000;
cprintf("nr eps = %4.3f",eps);
getch();
win1.HideWindow();
}
void Test(CD rtd,float FF(CD)){
window(1,1,80,25);
CWindows win1(2,6,79,22,"Тестування методiв");
win1.ShowWindow();
cprintf(" k Y(Сiмпс) Y(Нют) Y(Чеб) ");
cprintf("nr------------------------");
rtd.fik=rtd.fip;
do{
cprintf("nr ¦%4.2f %10.8f %10.8f %10.8f",rtd.fik,simp(rtd,FF),nuton(rtd,FF),cheb(rtd,FF));
rtd.fik=rtd.fik+rtd.h;
}while(rtd.fik<=1.02);
getch();
win1.HideWindow();
}
//*********************** Главная программа *********
void main()
{
// textbackground(3);
// clrscr();
// textcolor(14);
CD d(0.0,1.0,0,1.0,0.1); //Глобальные данные
Ramky();
VievZavd();
d.Viev();
int exit=1;
do
{
switch(menu())
{
case 1:{
switch(menu_x(3,2,15,4,2,"Про автора","Про прогаму")){
case 1:HelpAbout("int_aut.hlp");break;
case 2:HelpAbout("int_prg.hlp");break;
}break;
}
case 2:{
switch(menu_x(6,2,25,6,4,"Метод Сiмпсона","Метод Нютона-Котеса","Метод Чебишева","Порiвнян. м-дiв")){
case 1:ResultSimps(d);break;
case 2:ResultNuton(d);break;
case 3:ResultCheb(d);break;
case 4:Sravnenia(d);break;
}break;
}
case 3:{
switch(menu_x(19,2,25,4,2,"Тест1|y=S x dx","Тест2|y=Sx*exp(-x)dx")){
case 1:Test(d,f1);break;
case 2:Test(d,f2);break;
case 3:;break;
}break;
}
case 4:{
switch(menu_x(31,2,25,5,3,"Крок","Межi iнтергув.","Межi коеф. k")){
case 1:d.Change_h();;break;
case 2:d.Change_fi();break;
case 3:d.Change_k();break;
}break;
}
case 5:exit=0;break;
}
}
while (exit);
}
Лістинг бібліотеки CWindow.cpp
#include <stdio.h>
#include <conio.h>
#include <dos.h>
class CAplication{
public:
text_info TextInfo;
CAplication();
};
CAplication::CAplication(){
gettextinfo(&TextInfo);
}
class CWindows{
private:
int x1,y1,x2,y2;
intSizeMatrix; // Размер матрицы окна(к-во елементов для массива)
char CharFrame[9];
char FrameColor, // Цвет рамки
FrameBackGround, // Фон рамки
TextColorInWin, // Цвет текста в окне
TextBackGroundInWin, // Цвет фона в окне
*Caption[20];
protected:
char *MemWindowTXT;
int *MemWindowATR;
void PrintScreenWindow();
void ScreenPrintWindow();
void get_char(int *, char *);
void put_char(int,char);
public:
CWindows();
CWindows(int,int,int,int,char*);
~CWindows();
void ShowWindow();
void HideWindow();
};
CWindows::CWindows(int _x1,int _y1,int _x2,int _y2,char _c[20]=""){
x1=_x1;
y1=_y1;
x2=_x2;
y2=_y2;
SizeMatrix=(x2-x1+1)*(y2-y1+1);
CharFrame[0]='-';
CharFrame[1]='-';
CharFrame[2]='-';
CharFrame[3]='¦';
CharFrame[4]='-';
CharFrame[5]='=';
CharFrame[6]='L';
CharFrame[7]='¦';
FrameColor=15,
FrameBackGround=7,
TextColorInWin=15,
TextBackGroundInWin=7;
*Caption=_c;
}
CWindows::CWindows(void){
CWindows(21,6,60,20);
}
CWindows::~CWindows(){
delete MemWindowTXT;
delete MemWindowATR;
}
void CWindows::PrintScreenWindow(){
MemWindowATR=new int[SizeMatrix];
MemWindowTXT=new char[SizeMatrix];
if(MemWindowATR==NULL) {printf("Ошибка"); getch();}
if(MemWindowTXT==NULL) {printf("Ошибка"); getch();}
int k=0;
for(int i=y1;i<=y2;i++)
for(int j=x1;j<=x2;j++){
gotoxy(j,i);
get_char(MemWindowATR+k,MemWindowTXT+k);
++k;
}
//printf("n%i",k);
}
void CWindows::ScreenPrintWindow(){
window(1,1,80,25);
int k=0;
for(int i=y1;i<=y2;i++)
for(int j=x1;j<=x2;j++){
gotoxy(j,i);
put_char(*(MemWindowATR+k),*(MemWindowTXT+k));
++k;
}
}
void CWindows::ShowWindow(){
window(1,1,80,25);
PrintScreenWindow();
textcolor(FrameColor);
textbackground(FrameBackGround);
gotoxy(x1,y1); cprintf("-");
for(int i=x1+1;i<=x2-1;i++)
cprintf("-");
cprintf("-");
gotoxy(x1+2,y1);cprintf("[%s]",*Caption);
for(i=y1+1;i<=y2-1;i++){
gotoxy(x1,i);
cprintf("¦ ");
}
gotoxy(x1,y2); cprintf("L");
for(i=x1+1;i<=x2-1;i++)
cprintf("=");
cprintf("-");
for(i=y1+1;i<=y2-1;i++){
gotoxy(x2-1,i);
cprintf(" ¦");
}
window(x1+2,y1+1,x2-2,y2-1);
textbackground(TextBackGroundInWin);
textcolor(TextColorInWin);
clrscr();
}
void CWindows::get_char(int *attr, char *ch){
union REGS r;
r.h.ah= 0x8;
r.h.bh= 0;
int86(0x10,&r,&r);
*attr=r.h.ah;
*ch=(char)r.h.al;
}
void CWindows::put_char(int attr,char ch){
union REGS r;
r.h.ah= 0x9;
r.h.al= ch;
r.h.bl= attr;
r.h.bh= 0;
r.x.cx= 1;
int86(0x10,&r,&r);
}
void CWindows::HideWindow(){
ScreenPrintWindow();
}
Додаток В
Структура дискети
Література
1. Методичні вказівки до лабораторних робіт з курсу „Обчислювальні методи та застосування ЕОМ”. Частина ІІІ. Вінниця ВПІ 1992р.
2. Лященко М.Я., Головань М.С. Чисельні методи:Підручник.-К.:Либідь.
3. Волков Е.А. Численые методы: Учеб. пособие для вузов. – 2-е издание.
4. Краскевич В.Е., Зеленский К.Х. Численые методы в инжинерных расчетах. – К.: Вища школа.
5. Язык Си++: учеб. пособие. – 5-е изд. –М:. Финансы и статистика, 2001.
6. Пискунов Н. С. Дифферинциальное и интегральное исчисление для втузов, т 2: Учебное пособие для втузов. – 13-е изд.– М.: Наука, 1985.–560 с.
7. Информатика: Учебник / под ред. Проф. Н.В. Макаровой. - М.: Финансы и статистика, 1997.