Завдання до курсової роботи Тема курсової роботи: Програмування наближеного обчислення функції на основі степеневих або тригонометричних рядів за допомогою проблемно-орієнтованих мов програмування. Формулювання завдання: З використанням ПЕОМ обчислити з точністю е=10-6 значення функції f(x)=sin2(x) представленою рядом в к=30 точках , які максимально охоплюють область визначення даної функції. Знайти абсолютну та відносну похибки обчислень у цих точках та побудувати графіки точного значення функції та наближеного значення функції. А також графіки функцій абсолютної та відносної похибок. Знайти мінімальну абсолютну та максимальну відносну похибки та вивести значення їх аргументів. Анотація Боднар О.З. “Програмування наближеного обчислення функцій на основі тригонометричних рядів”.Курсова робота. НУ “Львівська політехніка”, кафедра: САПР, дисципліна: “Проблемно-орієнтовані мови програмування”, 2006. Курсова робота складається з 28 сторінок, 2 таблиць, 4 графіків, 1 блок-схеми. В даній курсовій роботі розроблено програмування наближеного обчислення функції на основі тригонометричних рядів за допомогою проблемно-орієнтовних мов програмування. Дана робота описує наближене обчислення значення функції представленої певним рядом з вказаною точністю, представлено результати виконання програм на алгоритмічних мовах у вигляді таблиць та графіків. Перелік умовних скорочень UNIX – операційна система FORTRAN (FORmula TRANslator) – Фортран – мова програмування(Перекладач Формули) IBM – (Industrial Business Machine) – Машина Індустріального Бізнесу COBOL (COmmon Business Oriented Language) – Кобол – мова програмування(Спільна Ділова Орієнтована Мова ) Pascal – Паскаль – мова програмування призначена для академічної мети. Ada – Ада – мова програмування США – Сполучені штати Америки МО – міністерство оборони МП – мова програмування Зміст Вступ 6 1.Основні теоретичні відомості про мови програмування та їхні середовища 9 1.1.Алгоритмічна мова програмування Паскаль 9 1.2.Алгоритмічна мова програмування С/С++ 11 2.Математичний аналіз та розкладення функції в ряд 15 3.Аналіз ряду індивідуального завдання 17 4.Блок-схема та опис, обчислення функції алгоритму по ряду 18 5.Опис тексту програми на проблемно-орієнтованих мовах 19 5.1.Текст програми на алгоритмічній мові Паскаль 19 5.2.Текст програми на алгоритмічній мові С/С++ 20 6.Таблиці та аналіз результатів виконання програм на алгоритмічних мовах Паскаль та С/С++ 23 7.Графіки функції та її наближення рядом, абсолютних і відносних похибок результатів 26 Висновки та аналіз результатів 28 Список використаної літератури 29
Вступ Розвиток обчислювальної техніки супроводжується створенням нових і вдосконаленням існуючих мов програмування (МП)—засобів спілкування програмістів з ЕОМ. В загальному мови програмування можуть бути розділені на три загальні типи: Машинні мови Асемблерні мови Мови високого рівня Машинні мови в загальному випадку складаються з послідовностей чисел (звичайно нулів і одиниць), які є командами на виконання одиничних елементарних операцій. Машинні мови є машинно-залежними, тобто конкретна машинна мова може бути використана тільки з певним типом комп'ютера. Машинні мови незручні для сприйняття людиною. З появою мов асемблера використовування комп'ютерів значно розширилося, проте все ще було потрібне написання великої кількості інструкцій навіть для реалізації рішення найпростіших задач. Для прискорення процесу програмування були розроблені мови високого рівня, в яких для виконання складних дій достатньо написати один оператор. Програми для перетворення послідовності операторів на мові високого рівня в машинну мову називаються компіляторами. В мовах високого рівня інструкції, написані програмістами, часто виглядають як звичайний текст на англійській мові із застосуванням загальноприйнятих математичних знаків. Абсолютно очевидно, що з погляду програмістів мови високого рівня переважають, будь-які машинні або Асемблерні мови. Мова С була розроблена Денісом Рітчі з “Bell Laboratories” і була вперше реалізована в 1972 році. Популярність С отримала як мова операційної системи UNIX. Сьогодні практично всі основні операційні системи написані на С або C++. Застосування С для різних типів комп'ютерів (іноді званих апаратними платформами) привело до появи різних варіантів мови, які, не дивлячись на свою схожість, часто були несумісними. Це з'явилося серйозною проблемою для розробників програмних продуктів, яким вимагалося розробляти коди, здатні працювати на декількох платформах. Ставало ясно, що потрібна стандартна версія С. В 1983 році Американським комітетом національних стандартів в області комп'ютерів і обробці інформації був встановлений технічний комітет, перед яким ставилося за мету виробити “однозначне і машинно-незалежне визначення мови С”. Завдяки тому, що С є машинно-незалежною і широко доступною мовою, прикладні програми, написані на С, можуть працювати практично без змін на більшості комп'ютерних систем. Не дивлячись на те, що були розроблені сотні мов високого рівня, тільки деякі з них знайшли широке застосування. FORTRAN (FORmula TRANslator) розроблений фірмою IBM між 1954 і 1957 роками для використовування в наукових і інженерних програмах, вимагаючих складних математичних обчислень. FORTRAN широко застосовується і дотепер. COBOL (COmmon Business Oriented Language) розроблений в 1959 році групою, в яку входили виробники і користувачі комп'ютерів. COBOL головним чином використовується в комерційних прикладних програмах, коли необхідна висока точність при обробці великої кількості даних. Сьогодні більше половини програмного забезпечення, призначеного для використовування в бізнесі, все ще написана на мові COBOL. Pascal був створений майже в той же час, що і С. Він призначений для академічної мети. В шестидесятих роках при розробці програмного забезпечення програмісти випробовували серйозні ускладнення. Час розробки звичайно затягувався довше встановлених термінів, вартість робіт значно перевищувала бюджет, а остаточний продукт був вельми ненадійний. Люди почали розуміти, що розробка програмного продукту є справою складнішою, ніж вони собі уявляли. В результаті наукових досліджень, проведених в шестидесятих роках, виникла концепція структурного програмування, тобто такого підходу до написання програм, при якому вони стають більш ясними для розуміння, більш коректними і краще пристосованими для модифікації надалі. Одним із знаменних результатів наукових досліджень в області програмування з'явилося створення в 1971 році професором Ніколасом Віртом мови програмування Pascal. Pascal, названий на ім'я математика і філософа сімнадцятого століття Блеза Паскаля, був розроблений для навчання структурного програмування в академічних кругах і швидко розповсюдився в університетах для вивчення як перша мова програмування. На жаль, в ньому відсутні властивості, завдяки яким його можна було б використовувати в комерційній і індустріальній сферах діяльності і, як наслідок, в цих областях він не отримав широкого розповсюдження. Проте можна відзначити, що реальне значення цієї мови в тому, що вона лягла в основу мови програмування Ada. Розробка мови Ada фінансувалася Міністерством оборони США в кінці 70-х — початку 80-х років. Для обслуговування величезного комплексу МО використовувалися сотні різних мов. Для їх заміни було ухвалено рішення створити одну мову програмування, яка б задовольняла всім вимогам. Для цієї мети був вибраний Pascal, проте кінцевий продукт — Ada — значно від нього відрізняється. Нова мова програмування була названа на ім'я леді Ади Лавлейс, дочки поета лорда Байрона. Вважається, що Ада Лавлейс на початку 1800-х написала першу в світі комп'ютерну програму. Однією з основних рис мови Ada є багатозадачність, яка дозволяє декільком процесам виконуватись паралельно. Решта мов високого рівня, включаючи С і C++, допускають виконання в даний момент тільки однієї задачі. 1.Основні теоретичні відомості про мови програмування та їхні середовища 1.1.Алгоритмічна мова програмування Паскаль Структура програми: Програма на мові Паскаль складається з двох частин: заголовка та тіла програми. Заголовок складається з імені програми і розділів опису: міток, констант, змінних, типів, процедур і функцій. Тіло програми або функції являє собою набір операторів і міститься в операторних дужках Begin і end, які закінчуються крапкою. Операції: 1)Арифметичні операції: +;-;*;/; (додавання, віднімання, множенні, ділення) div – знаходження цілої частки від ділення цілих чисел, mod – знаходження залишку від ділення цілих чисел. До змінних дійсного типу ці операції не застосовується. 2)Операції порівняння: >; >=; <; <=; 3)Операційні рівності: = - рівне; <> - не рівне 4)Логічні операції: not - логічне “ні”; or - логічне “або”; and - логічне “і”. 5) Операція присвоєння: <змінна>:=<вираз>; Основні математичні функції: sin(x), cos(x), tan(x), asin(x), acos(x), atan(x) – тригонометричні та обернені до них. exp(x) – експоненціальна функція. ln(x), lg(x) – логарифмічна функція. sqr(x) – піднесення до квадрату х. sqrt(x) – корінь квадратний з х. abs(x) – модуль х. Round – заокруглює дійсне число до цілого. Trunk – в дійсному числі відкидає всі знаки після коми. Оператори: Будь-яка програма складається з послідовності операторів. Ознакою закінчення оператора є крапка з комою “;”. Розрізняють прості оператори і складені. Складеними називають групу операторів, що міститься в операторних дужках. 1. Оператор if-else Використовується для вибору одного з двох варіантів рішення. Синтаксичний опис оператора if-else: if(умова) then <оператор 1> else <оператор 2>; Перед else “;” – ставити не можна. 2. Оператор case Оператор case (перемикач) використовується для вибору одного з багатьох варіантів. Синтаксис оператора case: case (вираз) of : <константа вибору 1>:оператор 1; <константа вибору 2>:оператор 2; … <константа вибору n>:оператор n; Якщо “вираз” співпадає з одною із констант вибору, то виконується відповідний оператор або блок операторів. 3. Оператори циклу У мові Паскаль існує три типи операторів циклу. 1)Оператор циклу з передумовою while (вираз) do оператор; 2)Оператор циклу з постумовою repeat <оператор>; until (вираз); 3)Оператор з параметрами for <початкове значення параметра> to < кінцеве значення> do оператор; Управляючі оператори Break – здійснює негайний вихід з операторів циклу. Управління передається наступному оператору після оператора з якого здійснювався вихід. Goto cинтаксис оператора goto мітка де: “мітка” - це мітка оператора на який здійснюється перехід. Міткою може бути будь-який ідентифікатор, після якого стоїть символ двокрапка “:” і який описаний в розділі міток. 4. Оператори вводу і виводу Read(<змінна>) – значення зчитуються через пробіл, Readln(<змінна >) – значення зчитуються через ‘enter’, Write(‘<вираз>’,< змінна >) – значення виводяться в одному рядку, Writeln(‘<вираз >’,< змінна >) – значення виводяться з наступного рядка. 1.2.Алгоритмічна мова програмування С/С++ Структура програми: Структура програми написаної на С аналогічна структурі програми написаної на Паскалі. Заголовок складається з директив препроцесора і імені функції. Тіло програми або функції являє собою набір операторів і міститься в фігурних дужках “{}”. Операції: 1)Арифметичні операції: Унарні: +;-; бінарні +;-;*;/; До операції ділення в мові С потрібно відноситись дуже уважно. Якщо обидва операнди цілого типу, то і результат буде цілого типу, тому S=2/5; в результаті виконання цього оператора S присвоїться 0, щоб одержати правильний результат необхідно щоб хоча б один операнд був дійсного типу, тобто S = 2.0 /5.0. У мові С є ще одна бінарна операція % - знаходження залишку від ділення цілих чисел. K=7% 2; - присвоїти змінній цілого типу К значення 1, оскільки 7:2=3 і 1 залишок. До змінних дійсного типу ця операція не застосовується. 2)Операції порівняння: >; >=; <; <=; 3)Операційні рівності: = = - рівне; != - не рівне 4)Логічні операції: ! - логічне “ні”; || - логічне “або”; && - логічне “і”. 5) Інкрементні та декрементні операції: Інкрементна операція ++ додає 1 до свого операнда. Оператор n++; можна записати n=n+1; Декриментна операція - - віднімає 1 від свого операнда. Розрізняють два види цих операцій: 1)префіксні ++n - змінна n збільшується на 1 до того, як використовується у виразі; 2)постфіксні n++ - змінна n збільшується на 1 після того, як її значення буде використано у виразі. 6)Побітові операції: В мові С існує 6 операцій для роботи з бітами. & - побітове “і” – бінарна операція, що по розрядах порівнює два двійкові числа. Результат дорівнює 1, якщо обидва операнди рівні 1 у цьому розряді. | - побітове “або” – бінарна операція, що по розрядах порівнює два двійкові числа. Результат дорівнює 1, якщо хоча б у одного операнда у цьому розряді 1. ^ - побітове “виключаюче “або” – бінарна операція, що по розрядах порівнює два двійкові числа. Для кожного розряда результат дорівнює 1, якщо один з двох відповідних розрядів дорівнює 1, але не обидва одночасно. ~ - побітове “ні” – унарна операція, яка заміняє кожну 1 на 0, а 0 на 1. >> - зсув вправо – зсуває розряди лівого, операнда вправо на кількість позицій вказаних у правому операнді. << - зсув вліво – зсуває розряди лівого операнда вліво на кількість розрядів, що вказані в правому операнді. 7) Операція “?”:”: Умовний оператор if у мові С можна замінити операцією виду “?”:” z=(a<b)?a:b; Цей оператор відповідає оператору умовного переходу такого виду: if(a<b) z=a; else z=b; 8) Операція присвоєння: Операція присвоювання може мати такий вигляд: 1.<змінна>=<вираз>; 2.<змінна><знак операції>=<вираз>; У першому випадку операція присвоювання аналогічна оператору присвоювання у Паскалі, у другому - знак арифметичної операції виноситься за знак “=”.В операції присвоювання можуть використовуватись такі операції: +,-,*,/,%,<<,>>,&,| Оператори: Будь-яка програма складається з послідовності операторів. Ознакою закінчення оператора є крапка з комою “;”. Так запис S=5 не є оператором, це просто вираз, а S=5; це вже оператор присвоювання. Аналогічно Паскалі у мові С розрізняють прості оператори і блоки. Блок - це група операторів, що міститься у фігурних дужках, вони використовуються: 1)щоб згрупувати кілька логічно зв’язаних операторів в один; 2)як тіло функції; 3)для локалізації дії описів. 1. Оператор if-else Використовується для вибору одного з двох варіантів рішення. Синтаксичний опис оператора if-else: if(умова) оператор 1; else оператор 2; Частина else може бути відсутня. При вкладених if-else необхідно пам’ятати, що else відноситься до внутрішнього if. Щоб розгалузити програму в кількох напрямках можна використати конструкцію: else if. 2. Оператор switch Оператор switch (перемикач) використовується для вибору одного з багатьох варіантів. Синтаксис оператора switch: switch (вираз) { case <константа вибору 1>:оператор 1; case <константа вибору 2>:оператор 2; … default: оператор n } Якщо “вираз” співпадає з одною із констант вибору, то виконується відповідний оператор або блок операторів. Якщо “вираз” не співпадає ні з однією з констант вибору виконується оператор після слова “default”. 3. Оператори циклу у мові С У мові С існує три типи операторів циклу. 1)Оператор циклу з передумовою while (вираз) оператор; 2)Оператор циклу з постумовою do оператор; while (вираз); 3)Оператор з параметрами for (вираз 1; вираз 2; вираз 3) оператор; 4. Управляючі оператори Break – здійснює негайний вихід з операторів циклу або оператора swich. Управління передається наступному оператору після оператора з якого здійснювався вихід. Continue – передає управління на кінець тіла циклу, всередині якого він знаходиться. Тобто пропускає частину ітерації, яку виконує і переходить до наступної ітерації. Goto cинтаксис оператора goto мітка де: “мітка” - це мітка оператора на який здійснюється перехід. Міткою може бути будь-який ідентифікатор, після якого стоїть символ двокрапка “:”. Мова С володіє такими засобами, що використовувати оператор goto немає потреби. Функція getchar() одержує один символ з клавіатури і записує його в стандартний файл вводу “stdin”. Функція putchar(a) пересилає один символ з пам’яті машини в стандартний файл виводу stdout (тобто на екран). Функції вводу і виводу scanf (“<специфікатор формату>”,<вказівник на змінну>); рrintf (“<вираз><специфікатор формату>”,<змінна>); Слід пам’ятати, що для того щоб ввести за допомогою функції scanf якесь значення і присвоїти його змінній одного з основних типів, перед іменем змінної необхідно записати символ “&”. Специфікатор формату відображає тип змінної, що виводиться на друк або вводиться з клавіатури. Розрізняють такі специфікатори формату: %d- десяткове ціле число: %f - число з плаваючою крапкою, десятковий запис; %e - число з плаваючою крапкою, експоненціальний запис; %g - число з плаваючою крапкою або десятковий або експоненціальний запис; %c - один символ; %s - рядок символів; %u - десяткове ціле без знаку; %o - вісімкове ціле число без знаку; %x - шістнадцяткове ціле число без знаку. 2. Математичний аналіз та розкладення функції в ряд Нехай задана нескінчена послідовність чисел Вираз: називається рядом, числа - називаються членами ряду, а число - загальним членом цього ряду. Тригонометричним рядом називається ряд, який має такий вигляд: + Нехай функція f(x) дійсної змінної визначена і неперервна на вказаному проміжку всюди , крім , окремих точок , в яких вона може мати розрив першого роду (скінченні стрибки). Вважаємо також , що f(x) – кусково-монотонна – це означає , що проміжок можна розбити на окремі проміжки , у кожному з яких функція монотонна (строго зростає або спадає). Умови , що накладені на функцію f(x) називаються умовами Діріхле. За умов Діріхле f(x) може бути зображення рядом :
Ряд вигляду: , де , , n=0,1,2,3…… називається рядом Фур’є. Зважаючи на формули Ейлера ,
можемо подати ряд Фур‘є в комплексній формі : , де Якщо задана на проміжку , то можемо зобразити її у вигляді ряду Фур’є:
де
3.Аналіз ряду індивідуального завдання. Графік заданої функції
f(x) = sin2(x) Область визначення функції D(f)[;] Область допустимих значень функції E(f) Функція парна. Асимптот немає. Функція змінюється з періодом ,. 4.Блок-схема та опис алгоритму обчислення функції по ряду. 5. Опис тексту програм на проблемно-орієнтованих мовах 5.1. Текст програми на алгоритмічній мові Паскаль program kurs; uses crt; var x,yb,yr,d,a,b,dd,sn,e,pa,pv,mnap,mxvp,xvx,xan:double; k,dk,n:longint; begin e:=0.000001; a:=0; b:=2*pi; d:=(b-a)/30; clrscr; writeln('+-------------+-------------+-------------+-------------+-------------+-------+'); writeln('| X | Yb | Yr | da | dv,% | ki |'); writeln('+-------------+-------------+-------------+-------------+-------------+-------+'); x:=a; xvx:=x; xan:=x; n:=1; repeat k:=1; yb:=sqr(sin(x)); sn:=x*x; yr:=0; repeat yr:=yr+sn; sn:=sn*(-4*x*x)/((2*k+1)*(2*k+2)); inc(k); until abs(sn)<e; pa:=abs(yb-yr); if round(pa*100000)<>0 then pv:=pa*100/abs(yb) else pv:=0; if n=1 then begin mnap:=pa; mxvp:=pv; end; if (pa<mnap) then begin mnap:=pa; xan:=x; end; if pv>mxvp then begin mxvp:=pv; xvx:=x; end; writeln('| ',x:11:8,' | ',yb:11:8,' | ',yr:11:8,' | ',pa:11:8,' | ',pv:11:6,' | ',k:5,' |'); x:=x+d; while keypressed do readkey; readkey; inc(n); until x>b; writeln('+-------------+-------------+-------------+-------------+-------------+-------+'); write (' X min ap = ',xan:11:8, ' X max vp = ',xvx:11:8); while keypressed do readkey; readkey; end. 5.2. Текст програми на алгоритмічній мові С #include<stdio.h> #include<conio.h> #include<math.h> double a,b,d,x,sn,yb,yr,e,pa,pv,dd,pan,pvm,xan,xvm; long int k,bb,n; void main() { clrscr(); a=0; b=2*M_PI; d=(b-a)/30; e=0.000001; printf("+-------------+-------------+-------------+-------------+-------------+-------+\n"); printf("| X | Yb | Yr | da | dv,% | ki |\n"); printf("+-------------+-------------+-------------+-------------+-------------+-------+\n"); x=a; n=1; xan=x; xvm=x; do { yb=sin(x)*sin(x); sn=x*x; yr=0; k=1; do { yr+=sn; bb=(2*k+1)*(2*k+2); dd=(-4*x*x)/bb; sn*=dd; k++; }while(fabs(sn)>e); pa=fabs(yb-yr); if((int)(pa/e)= =0)pv=0; else pv=fabs(pa*100/yb); if(n==1) { pan=pa; pvm=pv; } if(pa<pan) { pan=pa; xan=x; } if(pv>pvm) { pvm=pv; xvm=x; } printf("| %11.8f | %11.8f | %11.8f | %11.8f | %11.6f | %5ld |\n",x,yb,yr,pa,pv,k); x+=d; getch(); }while(x<=b); printf("+-------------+-------------+-------------+-------------+-------------+-------+\n"); printf("X min ap = %11.8f, X max vp = %11.8f, ",xan ,xvm); getch(); } 6. Таблиці та аналіз результатів виконання програм на алгоритмічних мовах Паскаль та С/С+ Таблиця 1 Результати обчислень на алгоритмічній мові Паскаль № Значення х Значення f(x) Наближене Значення f(x) Кількість ітерацій n Абсолютна похибка Відносна похибка
X min ap = 0.00000000, X max vp = 0.00000000 Таблиця 2 Результати обчислень на алгоритмічній мові С № Значення х Значення f(x) Наближене Значення f(x) Кількість ітерацій n Абсолютна похибка Відносна похибка
X min ap = 0.00000000, X max vp = 0.00000000 7.Графіки функції та її наближення рядом, абсолютних і відносних похибок результатів. Наближення рядом функції