Міністерство науки та освіти України
Національний Університет “Львівська Політехніка”
Кафедра САПР
Курсова робота
з курсу “Проблемно-орієнтовні мови програмування ”
на тему:”Обчислення функцій за допомогою тригонометричних рядів Ф’урє”
Львів 2002p
Зміст.
1. Тема . Мета та цілі курсової роботи.................З
2.Індивідуальне завдання на курсову роботу.......4
3.Вступ............................................................................5
а) середовище Турбо Pascal 7.0
б) середовище Турбо „Сі”
4.Аналіз ряду та функції .......................8
Аналіз ряду індивідуального завдання.............22
Текст програми на Турбо Паскалі....................23
Коментарі до програми ......................25
8. Текст програми на Турбо С ......................27
9. Результати обчислень на ТП га ТС...................29
10.Блок-схеми..........................................................30
11.Графіки абсолютної та відносної похибок....32
Висновок .....................34
Список використаної література.....................36
Мета курсової роботи
Закріпити і розширити знання одержані, при вивченні дисципліни "Проблемно-орієнтовані мови програмування".
Цілі роботи
Розвинути навики і вміння ефективно застосовувати ЕОМ для розв'язування прикладних задач.
2.ІНДИВІДУАЛЬНЕ ЗАВДАННЯ.
Дослідити функцію .Скласти програму обчислення з точністю ε значення функції поданої степеневим рядом у 20-ги точках, що входять в область збіжності ряду .Знайти абсолютну та відносну похибку в цих точках. Побудувати графіки функцій абсолютної та відносної похибки.
на проміжку , функція періодична.
Вступ
Опис середовища програмування!
Turbo Pascal 7.0
Однією з найпоширеніших мов програмування є мова Паскаль. Сучасні її підмножини Turbo Pascal (останні версії), а також середовище Delphi, що ґрунтується на мові програмування Object Pascal, широко використовують поряд з мовами С, C++, C++Builder. Вони дають змогу створювати складні програмні продукти як у галузі системного, так і прикладного програмування. Та все ж незамінною залишається мова Паскаль, як інструмент для вивчення основ програмування. Це пояснюється цілком об'єктивними причинами, що пов'язані з важливими характеристиками мови Паскаль, серед яких варто зазначити такі:
Мова Паскаль у природній формі відображає такі концепції технології розроблення програм, як розвинута система типів, орієнтація на принцип структурного програмування, підтримка покрокового методу.
Завдяки компактності, концептуальній цілісності й ортогональності понять, а також вдалому опису, запропонованому автором мови, Паскаль виявився досить легким для вивчення та засвоєння, ця мова значно простіша від близьких до неї за можливостями.
Незважаючи на простоту, мова виявилася придатною для широкого спектра застосувань, зокрема для створення дуже великих і складних програм, наприклад, операційних систем. Мова Паскаль достатньо технологічна для реалізації практично всіх, в тому числі й нетрадиційних, машинних архітектур. Завдяки цьому для багатьох типів комп'ютерів (операційних систем) є кілька різних реалізацій мови, що відображають ті чи інші потреби програмістів.
У посібнику розглянуто практично всі аспекти мови програмування Паскаль а також її розширення Turbo Pascal (версія 7.0). Середовище Turbo Pascal - потужне розширення авторської версії мови, що охоплює велику кількість пакетів стандартних процедур. Такі принципові нововведення, як апарат модулів і об'єктно-орієнтовані засоби, полегшують конструювання великих програмних систем на основі модульного програмування.
Система Turbo Pascal є інтегрованим середовищем, що охоплює низку компонентів, які підтримують усі види робіт, пов'язаних із створенням програм. Вона містить універсальний текстовий редактор, компілятор вхідної мови, редактор зв'язків і вбудований символьний налагоджувач. Багатовіконний інтерфейс з ієрархічною системою меню забезпечує високу продуктивність праці програміста.
Структура посібника така, що спочатку розглянуто способи побудови програм з використанням, головно, можливостей мови Паскаль (авторської версії) за деякими винятками, коли доцільно доповнити окремі місця засобами Turbo Pascal. Потім послідовно описано всі структури даних, як прості, так і структуровані (регулярні, комбіновані, множинні, файлові) типи, структури керування, способи та особливості організації процедур та функцій, вказівні типи, динамічні структури (динамічні рядки, списки, стеки, таблиці, дерева).
Останні розділи посібника містять опис розширень Turbo Pascal. Розглянуто загально алгоритмічні розширення - поняття типованих констант, рядковий тип даних і засоби опрацювання рядків змінної довжини, безтипові вказівники і файли, процедурні типи, а також загальносистемні розширення, способи налаштування змінних, переривання та системні виклики, можливості включення машинного коду, організація модульної програми, засоби об'єктно-орієнтованого програмування. З метою ліпшого засвоєння більшості описаних засобів наведено приклади програм, які можуть бути зразком для початківців під час розробляння власних програм. До кожного розділу є набір контрольних вправ і завдань.
У додатках містяться описи процедур та функцій деяких стандартних модулів Turbo Pascal. Зокрема, в Додатку 1 наведені процедури та функції роботи з екраном монітора та клавіатури модуля CRT, а в Додатку 2 - засоби створення графічних зображень зі стандартного модуля GRAPH.
ЗАГАЛЬНА ХАРАКТЕРИСТИКА МОВИ ПАСКАЛЬ
Мова Паскаль - це вдалий компроміс між простотою і потужністю, ефективністю, лаконічністю і багатослів'ям. У ній вперше відображено концепції структурного програмування.
Мову програмування Паскаль розробив Ніклаус Вірт у Швейцарському технологічному інституті в Цюріху на базі мови Алгол-60. Сьогодні її широко застосовують як засіб для вивчення програмування. Вона завоювала велику популярність, що можна пояснити такими чинниками.
По-перше, мову проектували з урахуванням простоти написання транслятора (тобто програми, яка перекладає текст з мови високого рівня машинною мовою). Невеликий обсяг трансляторів дає змогу детально їх описувати і добре документувати. По-друге, ця мова значно простіша, ніж близькі за можливостями мови.
Водночас, мова Паскаль дає змогу писати складні програми, її використовують у програмному забезпеченні персональних комп'ютерів, зокрема, для створення системного програмного забезпечення.
Структура Паскаль-програми
Програма для комп'ютера, записана мовою Паскаль, як і багатьма іншими мовами, складається з двох головних частин: опис дій, які потрібно виконати, та опис даних, з якими оперують ці дії. Дії описують за допомогою операторів, а дані - за допомогою описів і визначень.
Програму поділяють на заголовок і блок програми. У заголовку наводять ім'я програми і перечислюють її параметри. Параметрами є змінні (звичайно, це файли), які містять аргументи програми - вхідні дані та результати обчислень. Блок складається з шести розділів розташованих у такій послідовності (для Турбо Паскалю послідовність довільна):
Блок = розділ опису позначок;
розділ визначення сталих; розділ опису змінних; розділ опису процедур і функцій; розділ операторів.
Будь-який з перелічених розділів блоку може бути порожнім, крім останнього. Наприклад, текст програми мовою Паскаль виглядає так:
program kvadrivn (input, output);
{Розв'язування квадратного рівняння, А, В, С - коефіцієнти, EPS - похибка, що використовується в ітераційному методі розв'язування рівняння, який у програмі не реалізований} var
А, В, С, D, EPS, X1.X2: real; PS: integer; begin
writeln ('Уведіть дані');
read (А, В, С, EPS);
writeln ('Дані:', А, В, С, EPS);
if (A<>0) and (EPS>0) then PS:=0
else if (A=0) and (EPS>0) then PS:=1
else if (A<>0) and (EPS<=0) then PS:=2 else if (A=0) and (EPS<=0)
then PS:=3; if PS=0 then begin
D:=sqr(B)-4*A*C; if D>=0 then begin X1:=(-B+sqrt(D))/(2*A);
X2:=(-B-sqrt(D))/(2*A); end else
PS:=4 end;
writeln ('Розв'язування квадратного рівняння');
writeln ('Коефіцієнти рівняння:', А, В, С, 'похибка', EPS);
case PS of
0: writeln ('Розв'язок:', X1, X2);
1: writeln('A=0 - Рівняння вироджене');
2, 3: writeln('значення EPS не додатне');
4: writeln('Дійсних коренів немає D=', D);
end
end.
Згідно із синтаксисом мови Паскаль кожна програма починається словом program, після якого зазначають її ім'я. Далі в круглих дужках можна наводити параметри програми (імена файлів, через які програма спілкується з зовнішнім середовищем - операційною системою; найчастіше для нескладних програм - це імена стандартних файлів input і output). Далі йде блок. І закінчується програма крапкою.
Елементи мови Паскаль
Програма мовою Паскаль складається з лексем і символів-розділювачів. Лексеми Паскалю - це спеціальні символи, сим-воли-слова (інакше - термінальні або зарезервовані слова), імена, числа, рядки символів, позначки і директиви.
Розділювачі. Символами-розділювачами вважають: прогалину, кінець рядка і коментар. Всередині лексем використання їх не допустиме, а між двома сусідніми іменами, термінальними словами або числами повинен бути хоча б один розділювач.
Коментар (примітка) починається з символу {або (* і закінчується символом } або *) і може містити будь-які символи, в тому числі кінець рядка, за винятком } або *). Для більшої наочності програми доцільно вживати прогалини, порожні рядки (символ "кінець рядка") і коментарі.
Спеціальні символи і зарезервовані слова. Під час написання програм мовою Паскаль використовують такі спеціальні символи:
= <><<=>>=
( ) [ ]
Зарезервовані слова - це program, begin, end, if, then, else, for, do та ін. їх не можна застосовувати з іншою метою, наприклад, як імена. Вони є символами, а не послідовністю літер.
Імена. Для позначення змінних, сталих, типів, процедур, функцій використовують імена або ідентифікатори. Імена складаються з літер і цифр, однак першим символом повинна бути літера. В авторській версії Паскалю довжина імені не обмежена. Турбо Паскаль (скорочено позначатимемо ТР) сприймає перші 63 символи імені. Великі і малі літери є еквівалентними.
Серед імен є стандартні, такі як integer, real, read, sqrt, exp та ін. їх описувати не потрібно, вважають, що вони описані в деякому гіпотетичному блоці, всередині якого розміщений блок програми. Стандартні імена можна перевизначати.
Усі імена, крім стандартних, вибирають довільно. Однак правильно вибрані імена полегшують читання й розуміння програми. Головні рекомендації щодо вибору імен такі:
а) враховувати мнемоніку, тобто позначення повинно бути близьким до величини, яку позначено цим іменем;
б) уникати однолітерних імен, особливо, якщо це ім'я частотрапляється в програмі;
в) якщо ім'я містить літери і цифри, то цифри доцільнозаписувати вкінці імені.
Числа. Числа у мові Паскаль використовують цілі та дійсні. Перед числом може стояти знак "+" або "-".
Дійсні числа записують з десятковою крапкою, з порядком, або і з крапкою, і порядком. Для записування порядку використовують літеру Е, після якої записують порядок (читають: помножити на 10 у степені). Якщо дійсне число має крапку, то до і після неї повинно бути хоча б по одній цифрі.
Рядки символів. Послідовність символів, узяту в поодинокі лапки, називають рядком символів. Символами можуть бути будь-які, якщо треба поставити апостроф, то його записують двічі.
Позначки (мітки) - це цілі числа, які використовують для маркування операторів, їхні значення повинні бути в межах від 0 до 9999. У Турбо Паскалі допускають ідентифікатори.
Директиви - це інструкції для компілятора, які задають режим компіляції. Наприклад:
{$£+} передбачає режим емуляції (тобто створює програму, яку можна використовувати без співпроцесора 8087, однак код буде довший);
{$Е-} без емуляції. Програма виконується за наявності співпроцесора 8087, код програми компактніший.
Сталі. Під час написання програм часто виникає потреба використовувати значення, відомі ще перед виконанням програми. Ними можна безпосередньо користуватися в програмі. Однак це спричинює деякі незручності. Щоб уникнути їх, у мові Паскаль таким наперед відомим величинам - сталим (константам) - надають імена в розділі опису сталих.
Наприклад, маємо програму, яка виводить текстову інформацію по сторінках. Нехай програму розробляли за умов, що на сторінці є 60 рядків. Тоді у всій програмі буде використана стала 60. Тепер припустимо, що за новими вимогами програму треба модифікувати для роботи з меншими сторінками, такими, що мають 40 рядків. Тоді у всій програмі потрібно кількість рядків задати цифрою 40. І в цьому випадку можна зробити помилки, у деяких місцях число 60 не помітити, а ще гірше, може трапитись, що 60 використано в іншому значенні, і його заміна призведе до помилки.
Якщо ж користуватися поіменованими сталими, тобто в розділі визначення сталих записати
const
RozmirStorinky=60;
а всюди вже замість числа 60 писати ім'я сталої "RozmirSto-rinky", то під час переходу до сторінок із 40 рядків достатньо зробити одну заміну - у розділі визначення сталих замінити 60 на 40.
Приклади визначення сталих:
const
max=1000; min=-max; date=’29 жовтня понеділок’
загальні відомості про мову програмування С.
Мова формує наш спосіб мислення і оприділяє, про що ми можемо думати. Єдиний спосіб вивчити нову мову програмування - писати на ній програми.
СІ – універсальна мова програмування. Вона розроблялась в тісному зв’язку з операційною системою UNIX, однак не є прив’язаною до неї і може використовуватись у будь-яких операційних системах або машинах.
СІ – мова порівняно “низького рівня”. У ній немає:
а) прямих операцій над такими об’єктами як множини, стрічки, списки і масиви;
б) операцій, які маніпулюють з цілими масивами або строками, натомість використовуються структури;
в) засобів розподілу пам’яті окрім можливості визначення статичних змінних і стекового механізму при виділенні місця для локальних змінних функцій;
г) засобів вводу-виводу (READ, WRITE) і методів доступу до файлів; все це механізми високого рівня, які в мові СІ реалізовуються за допомогою функцій.
Основна філософія мови СІ ґрунтується на тому, що програміст знає, що робить і явно вказує ці наміри. Тому мова Сі не є “строго типізованою” мовою. Крім того, рівень пріоритетності виконання деяких операторів не є загально прийнятим, деякі синтаксичні конструкції вимагають покращення. Не звертаючи увагу на деякі недоліки, мова Сі є ефективною і виразною мовою, придатною для широкого кола задач.
Алфавіт мови Сі
Програма в мові Сі записується символами алфавіту, який містить:
великі і малі букви латинського алфавіту;
десяткові цифри від 0 до 9;
спеціальні символи: “,”, [,],(,),{,},+,-,/,%,\, ; , :, ?,<,>,^,&,*,#.
Із символів складаються базові елементи мови.
В ідентифікаторах мови Сі не можна плутати великі і малі букви (Х і х – це два різні ідентифікатори). Здебільшого імена змінних набирають малими буквами, а іменовані константи – великими.
У Мові Сі дані поділяються на 2 групи:
прості або скалярні;
складні або структуровані.
Для скалярних даних існують такі базові типи:
сhar – одиничний байт, що містить один символ;
int – ціле число;
float – число з плаваючою крапкою одиничної точності;
double – число з плаваючою крапкою подвійної точності.
Для розширення базових типів використовуються кваліфікатори:
1)short – короткий; 2) long – довгий.
Ці кваліфікатори застосовуються до цілого типу: chort int (можна писати просто chort) – короткий цілий. Наприклад,
Якщо ціле число типу int може займати в пам’яті машини або
16 біт або 32 біти, то long займає 32 біти, а chort - 16 біт.
Кваліфікатор long може розширити тип double. Тип long
double – числа з плаваючою крапкою підвищеної точності.
Кваліфікатор 1) unsignet – без знака – використовуються до типу int i char. Якщо значенню char відводиться 8 біт, то unsignet приймає значення від 0 до 255, а signed від – 128 до 127.
Умові Сі не існує логічного або булевського типу, хоча логічні операції використовуються. Треба запам’ятати, що значенню “істина’’ відповідає “не нуль”, тобто будь – яке число, що не дорівнює нулю, а “не істина”-“нуль”.
По аналогії з Паскалем і Фортраном програма на мові Сі складається з двох частин:
заголовка, 2) тіла програми.
Заголовок складається з директив препроцесора і імені функції. Тіло програми або функції являє собою набір операторів і міститься в фігурних дужках “{}”, що аналогічно оператором Begin i end у Паскалі. Ознакою закінчення оператора є символ крапка з комою “;”.
В одному рядку може бути кілька операторів як і у Паскалі, але бажано дотримуватись правила “одна стрічка-один оператор” (як у Фортрані), тоді програма більш наглядна і легше читається.
Коментарі в мові СІ обмежуються символами /*і*/.
Кожна програма на мові Сі складається з функцій. Функції в Сі подібні до підпрограм і функцій в Фортрані і до процедур і функцій в Паскалі. В наведеному прикладі це функція main 0 –основна програма пусті дужки при імені функції означають, що ніяких вхідних параметрів основна програма не потребує. Стрічка #include<stdio.h>вказує компілятору, що необхідно включити інформацію, яка міститься у файлі stdio.h-стандартна бібліотека вводу-виводу.
Значок # означає, що це директива препроцесора. Значки “<>” означають, що це стандартні файли, якими комплектується компілятор Сі.
В наведеному прикладі функція main складається з 4 операторів.
сhar ch;-опис типу змінної ch.
printf (“вводить символ \n”);- виклик бібліотечної функції виводу на друк. В дужках задається список виводу. В даному випадку друкується стрічка символів, що міститься в подвійних лапках.
Значок \n-перехід на наступну стрічку. Scanf (“%c”, &ch); - виклик бібліотечної функції форматного вводу.
Аргументами цієї функції є:
специфікатор формату: “%с”; 2)вказівник на змінну ch; &ch.
Слід пам’ятати, що для того щоб ввести за допомогою функції scahf якесь значення і присвоїти його змінний одного з основних типів, перед іменем змінної необхідно записати символ “&”. (крім char).
Специфікатор формату відображає тип змінної, що виводиться на друк або вводиться з клавіатури.
Розрізняють такі специфікатори формату:
%d – десяткове ціле число:
%f – число з плаваючою крапкою, десятковий запис;
%е – число з плаваючою крапкою, експоненціальний запис;
%g – число з плаваючою крапкою або десятковий або експоненціальний вираз аналогічний формату G у Фортрані. Використовується тільки при вводі змінних;
%с – один символ;
%s – строка символів;
%u – десяткове ціле без знаку;
%о – вісімкове ціле число без знаку.
Четвертий оператор тіла програми:
Printf (“\n код символу” %с: d)\n”, ch, ch); виведе на екран повідомлення “код символу” тоді символ, який ви набрали з клавіатури, в лапках, а тоді ціле число, що є кодом ASCII цього символу.
Директиви препроцесора.
Препроцесор мови СІ використовується для обробки тексту програми до її компіляції. Директиви препроцесора починається з символу дієс.
Директива define ставить у відповідність ідентифікатору текстову строку. Синтаксис оператора:
Define ідентифікатор (список ідентиф) строка заміни.
Строка заміни може містити ідентифікатори, ключові слова, розділювачі. Директива define може стояти у будь-якому місці програми і виконувати певні функції.
Оператори циклу у мові СІ.
У мові СІ існує три типи операторів циклу. Вони подібні до операторів циклу у Паскалі:
Оператор циклу з передумовою
While (вираз) оператор;
2) Оператор циклу з поступовою
do while
оператор
(while вираз)
3)Оператор з параметрами
For (вираз 1; вираз 2; вираз 3)
Оператор;
Оператори циклу while виконуються до того часу поки виконується умова. Якщо умова не виконується то оператори циклу do-while один раз будуть виконуватися.
Оператор циклу for можна подати в такому вигляді:
For (ініціалізація початкових даних, перевірка умови, зміна параметра);
Оператор.
МАСИВИ
Масив - це послідовно розміщені у пам’яті елементи одного типу. Кожен масив має ім’я. Доступ до окремих елементів масиву відбувається по імені масиву та індексу (порядковому номеру) елемента. Основні властивості масивів:
всі елементи масиву мають однаковий тип;
всі елементи масиву розміщені у пам’яті послідовно - один за одним; індекс першого елемента рівний нулю;
ім’я масиву є вказівником-константою, рівною адресі першого елемента масиву.
Ознакою масиву при описі є наявність парних квадратних дужок [ ]. Константа або константний вираз у квадратних дужках задає число елементів масиву.
Ініціалізація масиву
С дозволяє ініціалізувати масиви при описі. Загальна форма такої ініціалізації подібна до ініціалізації інших змінних:
тип ім’я[розмірність1]...[розмірністьN] = {список значень};
Список значень - це розділений комами список констант. Наприклад:
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Це означає, що i[0] = 1, i[1] = 2, ... , i[9] = 10.
Багатомірні масиви ініціалізуються так само, як і одномірні:
int s[5][2] = {
1, 1,
2, 4,
3, 9,
4, 16,
5, 25
};
Для такої попередньої ініціалізації необхідно знати точну кількість елементів. Щоб не задавати фіксовану розмірність масиву, ініціалізацію можна провести наступним чином:
int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
а для багатомірного масиву:
int s[][2] = {
1, 1,
2, 4,
3, 9,
4, 16,
5, 25
};
ФАЙЛИ, ТА РОБОТА З НИМИ
Файлова система С спроектована для роботи з великою кількістю пристроїв: моніторами, дисководами, CD-ROM, принтерами, тощо. Незважаючи на те, що кожний з цих пристроїв має свої особливості, файлова система С трансформує їх в логічний пристрій. Таку абстракцію називають потоком. Всі потоки однакові за поведінкою, але розрізняють два типи потоків - бінарні і текстові. Текстовий потік - послідовність ASCII-символів, бінарний - послідовність байт.
Потік асоціюється з певним файлом при його відкритті. Коли файл є відкритим, між ним і вашою програмою можливий обмін інформацією. Далі наведено декілька функцій для роботи з файлами:
fopen() відкриває потік
fclose() закриває потік
fprintf() запис у файл
fscanf() читання з файлу
feof() повертає істинне значення, якщо досягнуто кінець файлу
remove() знищує файл
Відкриття файлу
Якщо ви бажаєте відкрити файл з іменем test для записування у нього, потрібно написати:
FILE *fp; /* вказівник на файл */
fp=fopen(“test”, “w”);/*відкриття файлу для записування */
Тут “w” означає writing - запис. Для читання з файлу потрібно використовувати атрибут “r”- reading - читання.
Закриття файлу
Функція fclose() призначена для закриття потоку відкритого функцією fopen(). Отже файл, відкритий у попередньому прикладі, можна закрити так:
fclose(fp);
Функції fscanf() та fprintf()
Зв’язавши ці функції з певним потоком, ви можете використовувати їх, як звичайні функції printf() та scanf().
Динамічне виділення пам’яті
Існує два основних шляхи за допомогою яких програма написана на С може зберігати інформацію в основній пам’яті комп’ютера.
Перший шлях використовує глобальні та локальні змінні, що визначені в С, яким виділено необхідну кількість байтів пам’яті самим компілятором, наприклад:
int x; виділено 2 бaйта
char s; виділено 1 бaйт
float f; виділено 4 бaйта
double d; виділено 8 бaйт
int y[10]; виділено 2x10 бaйт
Останній приклад заслуговує більшу увагу. Коли компілятор зустрічає вираз “тип_змінної ім’я_змінної [кількість], то він автоматично резервує потрібну кількість байтів на час виконання програми. До певного часу так зручно. Але розглянемо ситуацію, коли Вам необхідно сформувати одномірний масив з наперед невизначеним числом елементів. Звичайно Ви можете написати щось на зразок int y[100], у випадку коли кількість елементів рівна 100 ваша програма буде працювати ефективно. У випадку, коли кількість елементів буде менше 100, скажімо 2, то із 100*2 байта зарезервовані компілятором, (100-2)х2 байтів витрачені зайво. Ще гірше у випадку коли кількість елементів більше 100, тоді ваша програма буде працювати некоректно, якщо ви не передбачили такої ситуації.
Ідеальним рішенням такої поширеної проблеми є динамічне (тобто стільки скільки потрібно) виділення пам’яті. В описаній вище ситуації такий підхід дозволить максимально ефективно використати пам’ять. Якщо Ви бажаєте писати професійні програми на С, то володіння і використання динамічного виділення пам’яті є необхідним.
Виділення і звільнення пам’яті
Функції malloc() та free() є основні функції для роботи з пам’яттю в С. Функція malloc() виділяє пам’ять, а функція free() звільняє її. Це означає, що при кожному виклику malloc() виділяється порція вільної пам’яті. В свою чергу, при кожному виклику free() виділена пам’ять повертається в систему. Кожна програма, яка використовує ці функції повинна містити заголовочний файл stdlib.h в якому зберігаються прототипи цих функцій.
Прототип функції malloc():
void* malloc() (unsigned число_байт)
Він повертає вказівник типу void, який означає, що Ви можете призначити його до будь-якого типу вказівника. Після успішного виклику malloc() поверне вказівник до першого байта області пам’яті виділеного з “кучі”. В протилежному випадку функція поверне значення нуль. Ви можете використати функцію sizeof() для визначення точного числа байтів потрібного для кожного типу даних.
Ряд Фур‘є. Інтеграл Фур‘є.
Синус та косинус перетворення.
Нехай функція f(t) дійсної змінної визначена і неперервна на вказаному проміжку всюди , крім , окремих точок , в яких вона може мати розрив першого роду (скінченні стрибки). Вважаємо також , що f(t)– кусково-монотонна – це означає , що проміжок можна розбити на окремі проміжки , у кожному з яких функція монотонна (строго зростає або спадає). Умови , що накладені на функцію f(t) називаються умовами Діріхле.
Якщо t0 – якась точка , то через f(t0-0) та f(t0+0) домовимось позначати ліву та праву границю f(t) в точці t0 :
За умов Діріхле f(t) може бути зображення рядом Фур‘є :
де
, ;
к=0,1,… .
З виразу маємо , що в точках неперервності ряд має значення функції , а в точках розриву – середнє арифметичне її лівої та правої границь ; на кінцях - до сума ряду дорівнює
Зважаючи на формули Ейлера ,
можемо подати ряд Фур‘є в комплексній формі :
рівність розуміємо в сенсі формули , а коефіцієнти ск визначають формули :
Тут
- комплексно-спряжені , .
Все сказане можна повторити і для КФДЗ , якщо та задовольняють умови Діріхле , відмінність , порівняно з дійсним випадком , лише в тому , що у даному разі та не будуть спряженими величинами .
Якщо задана на проміжку , то за умов Діріхле можемо зобразити її у вигляді ряду (в сенсі ):
де
Враховуючи запишемо у формі
Тут
Нехай тепер визначена на всій осі та абсолютно інтегрована :
Тоді здійснюємо в формулі
Граничний перехід при і отримуємо формулу : .
Конструкція у правій частині називається інтегралом Фур‘є. Під тут розуміємо , звичайно , . Розкриваючи за відомою зі школи формулою , отримуємо :
.
Якщо - парна функція , то із
отримуємо :
де
Функція називається косинус-перетворенням функції .
Знаючи , може знайти і навпаки.
Якщо - непарна функція , то маємо формули :
.
Функція - це синус-перетворення ; знаючи , можемо знайти і навпаки .
Ми розглянули перетворення Фур‘є для функції однієї змінної . Проте цю теорію можна узагальнити на функції багатьох змінних . Можна робити перетворення по окремих змінних , це особливо важливо для випадків , коли розглядаються диференціальні рівняння з частинними похідними .
Позначимо перетворення Фур‘є оригінально через . Нехай - оригінал , а - похідні від оригіналу , які будемо вважати теж оригіналами (це зауваження слушне у зв‘язку з тим , що диференціювання погіршує властивості функції).
Отже тоді
Можна отримати і подальші формули :
Інтеграл Фур‘є в комплексній формі .
Експоненціальне перетворення Фур‘є.
Зауваживши , що помноживши цей інтеграл на та віднімемо від інтеграла то отримаємо комплексну формулу інтеграла Фур‘є
.
Формулу можна переписати так
Введемо функцію :
Тоді
.
Функція називається перетворенням Фур‘є оригіналу . Якщо відоме зображення (перетворення) оригіналу , то за формулою
.
Яку природно називати оберненням перетворення , відтворюємо оригінал скрізь, за винятком окремих точок , оскільки інтеграл не змінює свого значення при зміні значення функції в скінченій множині точок. У такому сенсі можемо сказати , що кожному інтегралу відповідає одне перетворення , і навпаки . Ці формули правильні за умов , що і таких самих умов для похідних до n-го порядку включно .
Доречно зважити , що не існує , якщо , у такому разі константу “проголошують експонентою” , - як це робиться , сказано далі .
Як вказувалось , кожному оригіналові відповідає його експоненціальне зображення , і навпаки . Корисно скласти таблицю зображень оригіналів , що часто вживаються , подібно до того , як складено таблиці похідних та інтегралів .
При розв‘язуванні диференціальних рівнянь ми застосовуємо до них – перетворення (або чи у частинних випадках ) і використовуємо те, що перетворення змінює операцію диференціювання на операцію множення . Спочатку вкажемо деякі властивості перетворення . Після застосування перетворення Фур‘є до функції , , отримаємо Фур‘є – образ .
Наприклад :
0 0 0
рис.1.Графіки функції та її Фур‘є-образу.
Лінійність.
числа
Перетворення частинних похідних .
Якщо вас цікавить , як перетворення Фур‘є діє на похідні , то насамперед звертайте увагу на змінні , за якими проводиться упохіднення .
Наприклад , якщо – перетворення виконується за зміною для функції то згідно з множенням
При цьому
Властивість згортки
Фур‘є-образ добутку двох функцій не дорівнює добуткові їх образів , - адже інтеграл від добутку двох функцій не дорівнює добуткові інтегралів . Цей наслідок дещо усувається , якщо ввести поняття згортки функцій-оригіналів .
Означення :
та називається функція , яка позначається і визначається формулою
Наприклад :
; (другий інтеграл обертається в нуль внаслідок підінтегральної функції ) =.
Тут використано відомий інтеграл Ейлера-Пуассона
Важливість згортки полягає в тому , що : перетворення згортки оригіналів дорівнює добутку їх зображень-Фур‘є , тобто , якщо то значить
Розкриваємо “таємницю” згортки і покажемо , що вона є континуальним (неперервним) аналогом двох рядів . Нехай маємо два абсолютно збіжні ряди :
,
Утворимо добуток двох рядів :, тут за правилами Коші :
так , що
Тепер зрозуміло , що , якщо подумки замінимо “суму” інтегралом, то замість ряду
отримаємо щось подібне до згортки
на проміжку.
Якщо замість рядків А та В розглянемо ряди , то прийдемо до ідеї згортки
.
Ми знаємо , що функцію певного класу можна подати як суму степеневого ряду (дійсного чи комплексного зараз не суттєво):
Цей розклад єдиний : кожній конкретній функції однозначно відповідає набір чисел (коефіцієнтів) .
Дискретні аналоги інтегральних перетворень Фур‘є . Основна ідея розглянутих нами інтегральних перетворень Фур‘є полягає в тому , що від операцій “вищого” порядку над функціями – оригінальними ми переходимо до операцій “нижчого” порядку над функціями -зображеннями оригіналів .
Але ж ця ідея , - заміняти сам об‘єкт його зображенням і оперувати ним , - добре нам відома , хоча й здійснюємо ми її часто ”машинально” , не усвідомлюючи глибоко того , що ми робимо. Піднімемо цю ідею з глибини “на поверхню” і подивимось на неї зблизька , наведемо приклад :
Скінченні перетворення Фур‘є (синус та косинус-перетворення ).
Нехай функція визначена на проміжку , скінченні синус та косинус перетворення цієї функції визначимо формулами :
а) синус перетворення
б) косинус перетворення
Відповідно до
та
Визначимо обернені перетворення :
А) обернене синус перетворення
Б) обернене косинус перетворення :