Розробка програми фільтраціі шуму за допомогою сплайнів

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Украинский
    ,
    Формат файла:
    MS Word
    1,95 Мб
  • Опубликовано:
    2013-10-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Розробка програми фільтраціі шуму за допомогою сплайнів

Вступ

Потреба в опису фізичних об'єктів або явищ виникає при розв’язанні будь-якої прикладної задачі. Першопричиною цього є відсутність точного опису об’єкта чи явища. Як правило, вихідні дані мають дискретний характер, а для описання вимагаються неперервні значення. Для вирішення таких задач були отримані поліноміальні методи наближення, які стали класичним засобом відтворення неперервних даних за дискретними значеннями. В розробку поліноміальних методів наближення вагомий внесок зробили К.Вейерштрасс, П.Л. Чебишев та багато інших математиків. Проте, при всій своїй привабливості, поліноміальні методи наближення мають ряд недоліків, особливо у випадку відтворення функцій, що мають малі ступені гладкості. В середині сорокових років минулого сторіччя Ісаак Шоенберг (I.Shoenberg) запропонував конструкцію, яка, успадкувавши позитивні якості поліномів, виявилась вільною від їхніх недоліків - сплайни. Сплайни або, іншими словами, кусково-поліноміальні функції, побудовані І. Шоенбергом, стали поштовхом для появи нового методу наближення зі зручними обчислювальними властивостями.

Важливим етапом розвитку теорії сплайнів став опис Карлом де Бором (K.De Вооr) базисних сплайнів, що дозволило спростити конструкцію сплайнів. Таким сплайнам присвячені роботи таких математиків як К. де Бор, А.О. Лигун, М.П. Корнійчук, О.І. Гребенніков та інші. Поява цього апарата наближення дозволило з одного боку, суттєво спростити обчислювальні сторони використання сплайнів, а з іншого, в силу локальності сплайнів, покращити апроксиматичні властивості сплайн-оцінок.

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

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

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

Розділ 1. Загальні положення створення програмного продукту

1.1 Методи первинної обробки даних - згладжування та характеристика сплайнів

 

1.1.1 Згладжування даних за методом центрів тяжіння трикутників

Нехай дано набір з n +1 точки М000), М111), ..., Мnnn) на площині, отриманих в результаті експерименту чи вимірювання.

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

Цей алгоритм зображений на рисункі 1.1, де вихідні данні - це точки М0, М1,..., Мn, а згладжені точки - М1*,..., Мn-1*.

Рис. 1.1

Тобто точки М1*,..., Мn-1* це точки перетину медіан трикутників з вершинами в точках М0, М1 і М2; М1, М2 і М3, … Мn-2, Мn-1 і Мn. Зрозуміло, що



Тобто


Рівності (1) і (2) можна переписати в еквівалентному вигляді


В процесі згладжування кількість даних (точок) зменшилось на дві. Як правило, процес згладжування повторяють декілька разів. В результаті ми втрачаємо частину інформації, що призводить до втрати точності при описі контуру на кінцях. Щоб цього не відбулося, необхідно доповнити розумним способом вихідні дані і доповнені дані згладити. Якщо дані М0, М1,..., Мn описують замкнуту криву (в цьому випадку М0 = Мn), то достатньо покласти М-1 = Мn-1 i Мn+1 = М1 (періодизувати дані). В цьому випадку буде

Δ2x0 = x1 - 2x0 + x-1 = x1 - 2x0 + xn-1,

Δ2xn = xn+1 - 2xn + xn-1 = x1 - 2xn + xn-1

Δ2y0 = y1 - 2y0 + y-1 = y1 - 2y0 + yn-1,

Δ2yn = yn+1 - 2yn + yn-1 = y1 - 2yn + yn-1

згладжені дані визначаються з допомогою рівностей (3) і (4) для всіх і = 0,1,…, n. Приведемо два способи довизначення даних у випадку, коли дані описують незамкнуту криву. Перший спосіб складається наступним - точки М-1 і Мn+1 визначаємо з умови

М-1М0 = М0М1, МnМn-1 = Мn+1Мn,

тобто

х-1 = 2х0 - х1, хn+1 = 2xn - xn-1, (5)

y-1 = 2y0 - y1, yn+1 = 2yn - yn-1. (6)

В цьому випадку точки M-1 i Mn+1 ми вибираємо з умов

2M-1 = M2M1* + M2M0, Mn-2Mn+1 = Mn-2Mn-1* + Mn-2Mn,

чи, що те саме,


Знаходячи з цих рівностей х-1, хn+1, y-1 і yn+1 отримуємо формули доповнення


Таким чином, ми пришли до наступного алгоритму згладжування даних, що описують незамкнуту криву.

Обчислюємо значення х-1, y-1, хn+1, yn+1 у відповідності з рівностями (7), (8) чи (5), (6) і обчислюємо згладжені дані xi*, yi* для всіх і = 0, 1, …, n по формулам


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

Точне формулювання такого алгоритму виглядає так:


Зрозуміло, що якщо α = 0, то  і , а якщо α = 1/3, то отриманий приведений раніше алгоритм згладжування (по центрам тяжіння). Якщо ж 0 < α < 1/3, ми отримуємо "місток" між найбільш "м’яким" алгоритмом (α =0) і найбільш "жорстким" (α =1/3).

1.1.2 Алгоритми згладжування підвищеної точності

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


Для того, щоб алгоритм працював, необхідно виконання наступних вимог:

1. обґрунтувати рівність (12) і вибір β;

2. довизначити точки М-2, М-1, Мn+1 i Мn+2 (щоб було можливо знайти величини Δ4М0, Δ4М1, Δ4Мn-1, Δ4Мn) і повторювати згладжування;

3. знайти критерій зупинки алгоритму згладжування.

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

Нехай заданий набір з n +1 точки Мііі) (і = 0, 1, 2, …, n) на площині. Цьому набору поставимо у відповідність два набора точок

.

Для кожної трійки чисел ,  і визначимо коефіцієнти a i b прямої at + b так, щоб сума квадратів похибок

Φ(a, b) = (xi-1 - (a(i-1) + b))2 + (xi - (ai + b))2 + (xi+1 - (a(i+1) + b))2

була мінімальною.

Нехай a* i b* рішення цієї задачі на мінімум. Тоді ми покладаємо


Необхідна і достатня умова мінімуму у нашій задачі така


або що те ж саме,


Звідси випливає, що


і, відповідно,



Застосувавши ту саму процедуру до даних (i, yi) (і = 0,1,…,n), ми прийдемо до алгоритму згладжування по "центрам тяжіння трикутників".

Перейдемо до побудови алгоритму підвищеної точності. Для кожної п’ятірки чисел

(і - 2, хі-2), (і - 1, хі-1), (і, хі), (і + 1, хі-1), (і + 2, хі+2)

визначимо коефіцієнти a, b i c параболи at2 + bt + c з умови мінімуму суми квадратів похибок


Якщо a*, b* i c* - вирішення цієї задачі на мінімум, то покладаємо


Провівши необхідні в цьому випадку обчислення (знаходимо і прирівнюємо до нуля частні похідні по a, b, c і вирішуючи отриману при цьому систему трьох лінійних рівнянь з трьома невідомими), знаходимо значення a*, b* i c*. Потім підставляючи ці значення в (13), отримуємо

 (14)

Аналогічно отримуємо

 (15)

Отже, алгоритм згладжування підвищеної точності складається в тому, що нові значення  i  для всіх і = 0,1,2,…,n розраховуються по формулам


де 0 < β < 3/35.

Для того, щоб алгоритм працював, необхідно довизначити точки

М-2-2, у-2), М-1-1, у-1), Мn+1n+1, уn+1), Мn+2n+2, уn+2).

Визначимо коефіцієнти a, b i c з умови мінімуму суми квадратів похибок


де і покладемо


Необхідні і достатні умови екстремуму мають вид



Вирішуючи цю систему, і, підставляючи знайдені значення a, b, c у (16), отримаємо


Аналогічно знаходимо


Точно так же довизначаємо і значення у-1, у-2, уn+1, уn+2.

Таким чином пришли до наступного алгоритму згладжування підвищеної точності:

1.      довизначаємо точки (хі, уі) для i = -2, -1, n+1, n+2, виходячи з рівностей (17) - (20) і аналогічних рівностей для yi;

2.      вибираємо 0 < β < 3/35;

.        Після цього визначаємо нові точки (хі*, уі*) у відповідності з рівностями (14) - (15).

1.1.3 Умова закінчення згладжування даних

Багаторазове використання алгоритму згладжування може суттєво спотворити вихідну інформацію, аж до втрати форми початкового контуру.

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

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

Формулювання цього факту наступне:

Нехай M0, M1, …, Mn - вихідні дані, а M0*, M1*, …, Mn* - згладжені і


Тоді математичне очікування величини  пропорційно величині α * n * ε * θn, де ε - рівень похибки.

Якщо ж xi = x(a + ih), yi = y(a+ih) (i = 0, 1, …, n; h = (b - a)/n), і, функції х(t) i у(t) чотири рази безперервно диференціюємо на відрізку [а, b] (тобто якщо дані знімаються рівномірно з гладкої кривої), то


Де


тобто величина прагне до нуля пропорційно 1/n2.

Можна указати і критерій зупинки процесу згладжування. Для цього достатньо записати дискретний аналог нерівності (11) (з константою 2А замість А, щоб знехтувати похибкою дискретизації, і величиною О(h3)). Нехай

i,k(xi,k,yi,k) (i = 0, 1, …, n)

- набір точок отриманих в результаті k-ого згладжування,


- довжина ломаної, що з’єднує точки, отримані в результаті k-ого згладжування, тобто


Якщо нерівність


не виконується, то згладжування продовжуємо, якщо виконується - припиняємо.

Приведемо формальний алгоритм згладжування.

Дані масиви: x0, x1, …, xn, y0, y1, …, yn,

Вибираємо α [0, 1/3], і розраховуємо величини

Δ2xі = xi+1 - 2xi + xi-1 (i = 0, 1, …, n),

Δ2yі = yi+1 - 2yi + yi-1 (i = 0, 1, …, n).

Знайдемо згладжені дані


і обчислимо величини


Для того, щоб визначити чи достатньо згладжені дані, обчислимо


і аналогічні величини для qyi і рyi. Тоді дискретним аналогом функції θ(t) є набор чисел

,

а дискретним аналогом А - число


Якщо буде виконуватись умова


то процес згладжування можна вважати закінченим. У іншому випадку все необхідно повторити, взявши в якості вихідної інформації масиви x0*, x1*, …, xn*, y0*, y1*, …, yn*. Для методу більш підвищеної точності умова закінчення згладжування визначається наступним чином. Нехай ln - довжина ломаної, яка з’єднує точки (хіі) (і = 0,1,...,n), а ln* - довжина, яка з’єднує точки (хі*,уі*) (і = 0,1,...,n). Тоді математичне очікування різниці |ln - ln*| пропорційне величині n β σ ln. Якщо ж хі = х(α +іh), yі = y(α +іh) (i = 0,1,…,n), де функції х(t) и у(t) мають п’ять неперервних похідних на відрізку [а, b], то


Якщо вхідні дані зовсім рідкі (наприклад, якщо вони знімаються з опорних точок за допомогою вимірювальної головки), то застосовувати розглянуті вище алгоритми не доречно.

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

 

1.1.4 Базисні сплайни

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

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

Введенню цих сплайнів предпошлем поняття оператора Стеклова від даної функції ƒ(t).

Нехай дано число h > 0 і розбиття δn дійсної вісі R = (-∞,∞) точками іh (і = 0, ±1, ±2, …).

Для любої інтегруємої на всій вісі функції ƒ(t) розглянемо функцію


і назвемо її функцією Стеклова з кроком h для інтегруємої функції ƒ(t).

Ця властивість функції Стеклова слугує базою для побудови багатьох алгоритмів згладжування даних і конструювання на їх основі різноманітних демпферних пристроїв. Всі вони, як правило, засновані на використанні операторів виду


Позначимо


Функцію Br,h(t) введемо з допомогою рекурентних співвідношень


Цю функцію назвемо нормалізованим В-сплайном по рівномірному розбиттю чи просто В-сплайном.

Відмітимо деякі властивості В-сплайнів необхідні в подальшому.

Передусім відмітимо, що В-сплайн порядка r має в якості носія (замикання множини, де він відмінний від нуля) проміжок


тобто Br,h(t) ≠ 0 всередині відрізка dr.

Із виду B0,h і властивостей функції Стеклова випливає, що


Приділимо увагу сплайнам порядку 3, тобто параболічному сплайну, оскільки він використовується в роботі.

Передусім відмітимо (це легко отримати безпосередньо з визначення В-сплайнів), що


і графік B3,h(t) має вид

Рис. 1.2

 

1.1.5 Інтерполяційні сплайни третього порядку

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

Найбільш розповсюджений і історично найбільш ранній приклад сплайна - ломана.

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

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

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

Сплайном мінімального дефекту порядку r по заданому розбиттю Δh ={ih}i=-∞ називається r-1 разів неперервно-диференціюєма функція Sr(t), яка на кожному інтервалі (ih, (i+1)h) (i=0, ±1, ±2, …) є многочленом степені не вище r.

Відмітимо, що на множині сплайнів порядку r (r ≥ 0) існує сплайн тотожно рівний нулю і сплайн тотожно рівний одиниці.

Звідси і із того, що добуток многочлена степені r на число α є многочлен тієї ж степені, якщо α ≠ 0 і тотожній нуль при α = 0, а також з того, що сума многочленів степені n ≤ r і m ≤ r є многочлен степені не вище r, отримуємо, що множина всіх сплайнів степені r по розбиттю Δh є лінійний простір.

Таким чином, якщо Srh) множина всіх сплайнів мінімального дефекту по розбиттю Δh, і

σr,i  Srh) (i = 1, 2, …, n),

то лінійна комбінація функцій σr,i також буде лежати у множині Srh), тобто


Множина кубічних сплайнів - це множина всіх інтегралів від параболічних сплайнів, які можна записати у вигляді:


Сплайн Sr(t) називається інтерполяційним, якщо для функції x(t) він повністю співпадає зі значеннями функції в вузлах розбиття.

Якщо S3,k(t) aсимптотично співпадає з інтерполяційним (), то він називається майже інтерполяційним.


Задача визначення сплайну зводиться до визначення Ci.

Для зручності припустимо, що x(t) періодична функція. Це припущення зроблено для того, щоб не розглядати різні види граничних умов для сплайнів.

Якщо ми розглянемо розбиття вісі з вузлами в т. , то в якості періоду розглянемо T = nh, при цьому можна припустити, що:

 .

Якщо в якості Ci розглядати суму:


і з такими коефіцієнтами визначимо значення сплайна в т. ih, то отримаємо, що S3(ih) = x(ih), тобто S3(t) - інтерполяційний сплайн.

Відмітимо, що коефіцієнти Ci можна отримати виходячи з інших міркувань. Якщо S3(t) інтерполює x(t) в точках ih, тоді значення сплайну і значення функції в цих точках співпадають.



Отримаємо систему з  рівнянь та невідомих. В матричній формі:


Діагональне переважання для цієї матриці говорить про те, що для вирішення цієї системи можна використати метод прогонки або матричний спосіб.

Кожен з цих сплайнів задається явно. Якщо змінюється значення x(t) тільки в одній точці, то зміниться тільки цей елемент та декілька сусідніх, тобто цей сплайн є локальним.

1.2 Загальна характеристика об’єктно-орієнтованої мови Java

 

1.2.1 Генезис Java

Все програмування в тій чи іншій мірі пов’язане з керуванням складними задачами: складність вирішуваної проблеми накладається на складність системи, в якій вона вирішується. Саме через ці труднощі більшість програмних проектів закінчується невдачою. І до моменту створення мови Java ні одна з мов не була змодельована і створена в розрахунку на подолання складності розробки та підтримування програм. Звісно, багато рішень при створенні програм приймались з розрахунку на вирішення складностей, але при цьому завжди знаходилось ще щось, що вважалось досить важливим, щоб враховувати це при плануванні мови. Все це неминуче змушувало програмістів "битись головою об стіну" при зіткненні з проблемами. Наприклад, С++ створювався в розрахунку на ефективність та сумісність з С (щоб легко було переходити з цієї мови на С++). Обидва рішення, безперечно, корисні і стали одними з причин успіху С++, але також привели до додаткових труднощів, що не дозволило успішно втілити в життя деякі проекти. Або інший приклад: Visual Basic (VB) спочатку був прив’язаний до Basic, у якій не була закладена можливість розширення, із-за чого всі доповнення, створенні для VB, мають жахливий і складно підтримуваний синтаксис. З іншої сторони, С++, VB, Perl і інші мови, подібні Smalltalk, частково фокусувались на подоланні труднощів і, як результат, стали успішними у вирішення певних типів задач.

Творці Java із Sun, схоже, поруч с іншими цілями хотіли по можливості спростити роботу програміста. Вони наче говорили: "Ми хочемо, щоб ви могли швидше і простіше написати надійний код". Раніше такий намір приводив до того, що швидкодія програм залишала бажати кращого (хоча згодом ситуація покращилась). Однак такий підхід дивовижно подіяв на терміни розробки програм; для розробки еквівалентної програми на С++ необхідно в два рази чи ще більше людино-годин. Вже одне це приводить до економії колосальних грошей та безлічі часу, але Java не "застигає" в захопленні досягнутим. Творці мови йдуть далі, вбудовуючи підтримку технологій, які стали важливими в останній час (багатозадачність, мереживне програмування), у саму мову чи її бібліотек, що значно спрощує вирішення цих задач. Нарешті, Java енергійно береться за дійсно складні проблеми: платформно-незалежні програми, динамічна зміна коду і навіть безпека. Кожна з цих проблем в змозі затримати терміни здачі вашого проекту, а може легко стати неподоланною перешкодою. Таким чином, перспективи Java дивують: вона значно підвищує продуктивність роботи програмістів.

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

 

1.2.2 Виконання Java-програми

Програма, написана на одній з мов високого рівня, до яких відноситься і мова Java, так званий вихідний модуль ("сирець" на жаргоні, від англійського "source"), не може бути відразу ж виконана. Її спочатку треба відкомпіліювати, тобто перекласти в послідовність машинних команд - об’єктний модуль. Але і він, як правило, не може бути відразу ж виконаний: об’єктний модуль треба ще зкомпонувати з бібліотеками, що використовуються у модулі функцій і дозволити перехресні посилання між секціями об’єктного модуля, отримавши в результаті завантажуємий модуль - повністю готову до виконання програму.

Вихідний модуль, написаний на Java, не може уникнути цих процедур, але тут проявляється головна особливість технології Java - програма компілюється відразу в машинні команди, але не команди якогось конкретного процесора, а в команди так званої віртуальної машини Java (JVM, Java Virtual Machine). Віртуальна машина Java - це сукупність команд разом з системою їх виконання. Для спеціалістів скажемо, що віртуальна машина Java повністю стекова, так що не вимагається складна адресація комірок пам’яті і велика кількість регістрів. Тому команди JVM короткі, більшість з них має довжину 1 байт, через це команди JVM називають байт-кодами (bytecodes), хоча є команди довжиною 2 і 3 байта. Згідно статистичним дослідженням середня довжина команди складає 1,8 байта. Повне описання команд і всієї архітектури JVM міститься у специфікації віртуальної машини Java (VMS, Virtual Machine Specification). Для того, щоб точніше дізнатися, як працює віртуальна машина Java, необхідно ознайомитись з цією специфікацією.

Друга особливість Java - всі стандартні функції, які викликаються в програмі, підключаються до неї лише на етапі виконання, а не включаються в байт-коди. Як говорять спеціалісти, відбувається динамічна компоновка (dynamic binding). Це також сильно зменшує об’єм відкомпільованої програми.

Отже, на першому етапі програма, написана на мові Java, перекладається компілятором в байт-коди. Ця компіляція не залежить від типу якогось конкретного процесора і архітектури деякого конкретного комп’ютера. Вона може бути виконана один раз відразу ж після написання програми. Байт-код записуються в одному чи декількох файлах, можуть зберігатись у зовнішній пам’яті чи передаватися по мережі. Це особливо зручно завдяки невеликому розміру файлів з байт-кодами. Потім отримані в результаті компіляції байт-коди можна виконувати на любому комп’ютері, що має систему, яка реалізує JVM. При цьому не важливий ні тип процесора, ні архітектура комп’ютера. Так реалізується принцип Java "Write once, run anywhere" - "Написане один раз, виконується де завгодно".

Інтерпретація байт-кодів і динамічна компоновка значно затримують виконання програм. Це не має значення в тих ситуаціях, коли байт-коди передаються по мережі, мережа все одно повільніше любої інтерпретації, але в других ситуаціях вимагається потужний і швидкий комп’ютер. Саме тому постійно йде вдосконалення інтерпретаторів в сторону збільшення швидкості інтерпретації. Розроблені JIT-компілятори (Just-In-Time), які запам’ятовують вже інтерпретовані частини коду в машинних командах процесора і просто виконують ці частини при повторному зверненні, наприклад, в циклах. Це значно збільшує швидкість обчислень, що повторюються. Фірма SUN розробила цілу технологію Hot-Spot і включає її в свою віртуальну машину Java. Але, звісно, найбільшу швидкість може дати лише спеціалізований процесор.

Фірма SUN Microsystems випустила мікропроцесори PicoJava, які працюють на системі команд JVM, і збирається випускати цілу лінійку все більш потужних Java-процесорів. Є вже і Java-процесори других фірм. Ці процесори безпосередньо виконують байт-коди. Але при виконанні програм Java на других процесорах необхідна ще інтерпретація команд JVM у команди конкретного процесора, а значить, необхідна програма-інтерпретатор, причому для кожного типу процесорів, і для кожної архітектури комп’ютера треба написати свій інтерпретатор.

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

Окрім реалізації JVM для виконання байт-кодів на комп’ютері ще необхідно мати набір функцій, які викликаються із байт-кодів и динамічно компонуються з байт-кодами. Цей набір оформляється у вигляді бібліотеки класів Java, яка складається з одного чи декількох пакетів. Кожна функція може бути записана байт-кодами, але, оскільки вона буде зберігатися на конкретному комп’ютері, її можна записати прямо у системі команд цього комп’ютера, уникнувши тим самим інтерпретації байт-кодів. Такі функції називають "рідними" методами (native methods). Використання "рідних" методів прискорює виконання програми.

Фірма SUN Microsystems - творець технології Java - безкоштовно розповсюджує набір необхідних програмних інструментів для повного циклу роботи з цією мовою програмування: компіляції, інтерпретації, відладки, включающий і велику бібліотеку класів, під назвою JDK (Java Development Kit). Є набори інструментальних програм і других фірм. Наприклад, великою популярністю користується JDK фірмы IBM.

 

.2.3 Що таке JDK

Набір програм і класів JDK містить:

·              компілятор javac із вихідного тексту в байт-коди; інтерпретатор java, який містить реалізацію JVM;

·              спрощений інтерпретатор jre (в останніх версіях відсутній);

·              програму перегляду апплетів appietviewer, що заміняє браузер;

·              відладчик jdt;

·              дизассемблер javap;

·              програму архівації і стиснення jar;

·              програму збору документації javadoc;

·              програму javah генерації заголовкових файлів мови С;

·              програму javakey додання електронного підпису;

·              програму native2ascii, що перетворює бінарні файли в текстові;

·              програми rmic і rmiregistry для роботи з видаленими об’єктами;

·              програму seriaiver, яка визначає номер версії класу;

·              бібліотеки і заголовкові файли "рідних" методів;

·              бібліотеку класів Java API (Application Programming Interface).

В 1996 р. була випущена перша версія JDK 1.0, яка модифікувалась до версії з номером 1.0.2. В цій версії бібліотека класів Java API містила 8 пакетів. Весь набір JDK 1.0.2 поставлявся в упакованому вигляді в одному файлі розміром близько 5 Мбайт, а після розпаковки займав близько 8 Мбайт на дискі.

В 1997 р. з’явилась версія JDK 1.1, остання її модифікація, 1.1.8, випущена в 1998 р. В цій версії було 23 пакета класів, займала вона 8,5 Мбайт в упакованому вигляді і близько 30 Мбайт на дискі.

В перших версіях JDK всі пакети бібліотеки Java API були упаковані в один архівний файл classes.zip і викликались безпосередньо з цього архіву, його не треба розпаковувати.

Потім набор інструментальних засобів JDK був сильно перероблений.

Версія JDK 1.2 вийшла у грудні 1998 р. і містила вже 57 пакетів класів. В архівному вигляді цей файл розміром майже 20 Мбайт і ще окремий файл розміром більше0 17 Мбайт з упакованою документацією. Повна версія розташовується на 130 Мбайтах дискового простору, з них близько 80 Мбайт займає документація.

Починаючи з цієї версії, всі продукти технології Java власного виробництва компанія SUN стала називати Java 2 Platform, Standard Edition, скорочено J2SE, a JDK перейменувала в Java 2 SDK, Standard Edition (Software Development Kit), скорочено J2SDK, оскільки випускається еще Java 2 SDK Enterprise Edition і Java 2 SDK Micro Edition. До речі, сама компанія SUN часто користується і старої назвою, а в літературі утвердилась назва Java 2. Окрім 57 пакетів класів, обов’язкових на любій платформі і отримавших назву Core API, в Java 2 SDK vl.2 входять ще додаткові пакети класів, що називаються Standard Extension API. У версії Java 2 SDK SE, vl.3, яка вийшла в 2000 р., вже 76 пакетів класів, які складають Core API.

На теперішній час версія JDK 1.0.2 вже не використовується. Версія JDK 1.1.5 з графічною бібліотекою AWT вбудована в популярні браузери Internet Explorer 5.0 і Netscape Communicator 4.7, тому вона вкикористовується для створення апплетів. Технологія Java 2 широко використовується на серверах і в клієнт-серверних системах.

Окрім JDK, компанія SUN окремо розповсюджує ще й набір JRE (Java Runtime Environment).

 

.2.4 Об’єктно-орієнтоване програмування в Java

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

 

1.2.5 Принципи об’єктно-орієнтованого програмування

Об’єктно-орієнтоване програмування розвивається вже більш двадцяти років. Існує декілька шкіл, кожна з яких пропонує свій набір принципів роботи з об’єктами і по-своєму висловлює ці принципи. Але є декілька загальноприйнятих понять. Перерахуємо їх.

1. Абстракція - опис кожної моделі відбувається у вигляді одного чи декількох класів (classes). Клас можна вважати проектом, зліпком, кресленням, по якому потім будуть створюватися конкретні об’єкти. Клас містить опис змінних і констант, що характеризують об’єкт. Вони називаються полями класу (class fields). Процедури, що описують поведінку об’єкта, називаються методами класу (class methods). Всередині класу можна описати и вкладені класи (nested classes) і вкладені інтерфейси. Поля, методи і вкладені класи першого рівня є членами класу (class members). Різні школи об’єктно-орієнтованого програмування пропонують різні терміни, ми використовуємо термінологію, прийняту в технології Java.

2.      Ієрархія об’єктів давно використовується для їх класифікації. Особливо детально вона пророблена в біології. Все знайомі з сімействами, родами і видами. Ми можемо зробити опис своїх домашніх тварин (pets): кішок (cats), собак (dogs), корів (cows) і інших.

.        Модульність - цей принцип стверджує - кожний клас повинен складати окремий модуль. Члени класу, до яких не планується звертання зовні, повинні бути інкапсульовані.

4. Принцип KISS - самий основний, базовий і самий великий принцип програмування - принцип KISS - не вимагає в поясненні і перекладі: "Keep It Simple, Stupid!"

1.3 Принципи побудови графічного інтерфейсу

Є багато різноманітних графічних систем: MS Windows, X Window System, Macintosh. В кожній з них свої правила побудови вікон і їх компонентів: меню, полів введення, кнопок, списків, полос прокрутки. Ці правила складні і заплутані. Графічні API містять сотні функцій.

Для спрощення створення вікон і їх компонентів написані бібліотеки класів: MFC, Motif, OpenLook, Qt, Tk, Xview, OpenWindows і безліч других. Кожний клас такої бібліотеки описує відразу цілий графічний компонент, який керується методами цього і других класів.

В технології Java справа ускладнюється тим, що додатки Java повинні працювати в любій чи хоча б в багатьох графічних середовищах. Потрібна бібліотека класів, незалежна від конкретної графічної системи. В першій версії JDK задачу вирішили наступним чином: були розроблені інтерфейси, що містять методи роботи з графічними об’єктами. Класи бібліотеки AWT реалізують ці інтерфейси для створення додатків. Додатки Java використовують дані методи для розміщення і переміщення графічних об’єктів, зміни їх розмірів, взаємодії об’єктів.

Бібліотека класів Java, що заснована на peer-інтерфейсах, отримала назву AWT (Abstract Window Toolkit). При виведенні об’єкту, створеного в додатку Java і заснованого на peer-інтерфейсі, на екрані створюється парний йому (peer-to-peer) об’єкт графічної підсистеми операційної системи, який і відображається на екрані. Ці об’єкти тісно взаємодіють під час роботи додатку. Тому графічні об’єкти AWT в кожному графічному середовищі мають вид, характерний для цього середовища: в MS Windows, Motif, OpenLook, OpenWindows, скрізь вікна, створені в AWT, виглядають як "рідні" вікна.

Саме через таку реалізацію peer-інтерфейсів і других "рідних" методів, написаних, головним чином, на мові C++, доводиться для кожної платформи випускати свій варіант JDK.

У версії JDK 1.1 бібліотека AWT була перероблена. В неї добавлена можливість створення компонентів, повністю написаних на Java і що не залежать від peer-інтерфейсів. Такі компоненти стали називати "легкими" (lightweight) на відміну від компонентів, реалізованих через peer-інтерфейси, названих "важкими" (heavy).

"Легкі" компоненти скрізь виглядають однаково, зберігають заданий при створенні вид (look and feel). Більше того, додаток можна розробити таким чином, щоб після його запуску можна було обрати якийсь певний вид: Motif, Metal, Windows 95 чи який-небудь інший, і змінити цей вид в любий момент роботи.

Ця цікава особливість "легких" компонентів отримала назву PL&F (Pluggable Look and Feel) чи plaf.

Була створена велика бібліотека "легких" компонентів Java, яку назвали Swing. В ній були переписані всі компоненти бібліотеки AWT, так що бібліотека Swing може використовуватися самостійно, не дивлячись на те, що всі класи з неї розширюють класи бібліотеки AWT.

Бібліотека класів Swing поставлялась як доповнення до JDK 1.1. В склад Java 2 SDK вона включена як основна графічна бібліотека класів, що реалізує ідею "100% Pure Java", поруч з AWT.

В Java 2 бібліотека AWT значно розширена додаванням нових засобів малювання, виведення текстів і зображень, отримавши назву Java 2D, і засобів, які реалізують переміщення тексту методом DnD (Drag and Drop).

Окрім того, в Java 2 включені нові методи введення/виведення Input Method Framework і засоби зв’язку з додатковими пристроями введення/виведення, такими як світове перо чи клавіатура Бройля, названі Accessibility.

Все ці засоби Java 2: AWT, Swing, Java 2D, DnD, Input Method Framework і Accessibility склали бібліотеку графічних засобів Java, названу JFC (Java Foundation Classes).

 

1.3.1 Компонент і контейнер

Основне поняття графічного інтерфейсу користувача (ГІК) - компонент (component) графічної системи. На російській мові це слово має на увазі просто складову частину, елемент чого-небудь, але у графічному інтерфейсі це поняття значно конкретніше. Воно означає окремий, повністю визначений елемент, який можна використовувати в графічному інтерфейсі незалежно від інших елементів. Наприклад, це поле введення, кнопка, строчка меню, полоса прокрутки, радіокнопка. Саме вікно додатка - також його компонент. Компоненти можуть бути і невидимими, наприклад, панель, яка об’єднує компоненти, також є компонентом.

Ви не здивуєтесь, дізнавшись, що в AWT компонентом вважається об’єкт класу Component чи об’єкт всякого класу, що розширяє клас component. В класі component зібрані загальні методи роботи з любим компонентом графічного інтерфейсу користувача. Цей клас - центр бібліотеки AWT.

Кожний компонент перед виведенням на екран поміщається в контейнер (container). Контейнер "знає", як розмістити компоненти на екрані. Зрозуміло, в мові Java контейнер - це об’єкт класу Container чи всякого його розширення. Прямий спадкоємець цього класу - клас jcomponent - вершина ієрархії багатьох класів бібліотеки Swing.

Створивши компонент - об’єкт класу Component чи його розширення, необхідно додати його до попередньо створеного об’єкту класу container чи його розширення одним із методів add ().

Клас Container сам є невидимим компонентом, він розширює клас Component. Таким чином, в контейнер наряду з компонентами можна поміщати контейнери, в яких знаходяться якісь інші компоненти, досягаючи тим самим більшої гнучкості розташування компонентів.

Основне вікно додатка, яке активно взаємодіє з операційною системою, необхідно побудувати по правилам графічної системи. Воно повинно переміщатися по екрану, змінювати розміри, реагувати на дії миші та клавіатури. У вікні повинні бути, як мінімум, наступні стандартні компоненти.

·              Строчка заголовку (title bar), з лівої сторони якої необхідно розмістити кнопку контекстного меню, а з правої - кнопки згортання і роззгортання вікна і кнопку закриття додатка.

·              Необов’язкова строчка меню (menu bar) з випадаючими пунктами меню.

·              Горизонтальна і вертикальна полоси прокрутки (scrollbars).

·              Вікно повинно бути оточено рамкою (border), що реагує на дії миші.

Вікно з цими компонентами в готовому виді описане в класі Frame. Щоб створити вікно, достатньо зробити свій клас розширенням класу Frame.

 

1.3.2 JFreeChart

JFreeChart це безкоштовна Java бібліотека, яка спрощує розробникам відображати графіки професійної якості в своїх додатках. Проект JFreeChart був заснований у лютому 2000 року Девідом Гілбертом. Сьогодні JFreeChart є найбільш широко використовуваною графічною бібліотекою на базі Java, з версією 1.0.14, яка досягла більше 450 000 завантажень на сьогоднішній день. Цей проект продовжує розвиватися і підтримуватися Девідом Гілбертом, за участі великого товариства розробників.

Великий набір функцій JFreeChart включає в себе:

·        послідовно і добре документований API, який підтримує широкий спектр типів діаграм;

·        гнучку, що добре розширюється, конструкцію, як для серверних, так і для клієнтських додатків;

·        підтримання багатьох типів вихідних форматів, в тому числі компонентів Swing, графічних файлів (в тому числі PNG і JPEG) і векторних форматів графічних файлів (включаючи PDF, EPS и SVG);

·        JFreeChart є програмним забезпеченням з "відкритим кодом", чи, точніше, вільно розповсюдженим програмним забезпеченням. Вона розповсюджується на умовах GNU Lesser General Public Licence (LGPL), яка дозволяє використовувати його у власних додатках.

.4 JAMA - бібліотека матриць на мові Java

JAMA (Java Matrix Library) - бібліотека функцій лінійної алгебри. Бібліотека створена MathWorks і NIST та є публічним надбанням. Вона призначена для забезпечення достатньою функціональністю для рутинних проблем, запакована таким чином, що є природною і зрозумілою для неспеціалістів. Немає ніякої гарантії, що майбутні версії JAMA будуть сумісні з поточною.

Сумісний матричний пакет, Jampack, також був розроблений у NIST та Університеті Мериленда. Два пакети виникли з необхідності оцінки альтернативних проектів для реалізації матриць на Java. JAMA базується на одному класі матриці у строго об’єктно-орієнтованій структурі. Jampack використовує більш відкритий підхід, який піддається розширенню користувачем. Як виявилось, для звичайних користувачів пакетів принципова різниця в синтаксисі матричних операцій.

Бібліотека існує в двох версіях: на мові Java (власне JAMA) і як бібліотека шаблонів на мові C++ (JAMA/C++). Версія на C++ використовує Template Numerical Toolkit, яка розроблена там же. Версія на Java виконує низькорівневі операції сама.складається з шести класів: Matrix, CholeskyDecomposition, LUDecomposition, QRDecomposition, SingularValueDecomposition и EigenvalueDecomposition.

Клас Matrix забезпечує основні операції обчислювальної лінійної алгебри. Різноманітні конструктори створюють матриці з двомірних масивів подвійної точності з плаваючою комою. Різноманітні методи gets та sets забезпечують доступ до підматрицям і матричних елементів. Основні арифметичні операції включають додавання і множення матриць, нормування матриць. Також включений зручний методи виводу на екран матриці.

П’ять фундаментальних матричних розкладань, які складаються з пари чи трьох матриць, перестановка векторів, і тому подібне, дають результати у п’яти класах розкладання. Ці розкладання доступні класу Matrix для розрахунку рішення лінійних рівнянь, визначників, обернених матриць та інших функції матриць. Ці п’ять декомпозицій:

·        Розкладання Холецького симетричних матриць, позитивно визначених матриць

·        LU-розкладання (Гауса) прямокутних матриць

·        QR-розкладання прямокутних матриць

·        Розкладання по власним значенням обох симетричних і несиметричних квадратних матриць

·        Сингулярне розкладання прямокутної матриці

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

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

1.5 Огляд IDE засобів для програмування на Java

 

1.5.1 Порівняльна характеристика інтегрованих середовищ розробки

За більше ніж десятилітню історію мови Java, змінилось не одне покоління інтегрованих середовищ розробки (Integrated Development Environment -IDE)[1]. Еволюція IDE засобів обумовлена безліччю факторів, сукупність яких називається - інформаційні технології, що включають в себе програмну і апаратну складові, а також розвиток самої мови, яке відбувається не лише в глибину, оптимізація якихось можливостей, що ярко демонструють прихід нових бібліотек Swing замість застарівших AWT, але і "в ширину", це виникнення технологій JSP, більша інтеграція з СКБД і серверами додатків, підтримка технологій Spring, Hibernate і інше.

І якщо перші IDE засоби, представляли в сьогоденному понятті примітивний текстовий редактор, який слугував лише для набору початкових кодів, а всю іншу роботу, починаючи від компіляції і закінчуючи остаточною зборкою проекту приходилось виконувати вручну, то сьогоднішні сучасні, є фактично багатофункціональними пристроями, що беруть на себе не лише звичні функції але і ряд додаткових починаючи від автоматичного створення Javadoc, рефакторингу, профайлингу, UML-проектування, клієнта для підключення до любої СКБД і закінчуючи такими екзотичними, що не відносяться до процесу розробки, як перевірка орфографії.

Безумовно, що розплатою за всі ці "зручності", є підвищені вимоги до ресурсів комп’ютера. Існує думка, що 80% користувачів використовують можливості існуючого програмного забезпечення лише на 20%, це також можна спроектувати і на IDE-засоби. Так як всі їх переваги може оцінити лише програміст, який не один рік займається розробкою на відповідній технології. А початківцям складно оцінити адекватно той чи інший засіб, тому, як правило, його самостійний вибір відбувається по двом критеріям - інтуїтивна зрозумілість інтерфейсу і різноманітні одночасно - ресурсні характеристики, такі як завантаження, компіляція, запуск, займаємий об’єм ОЗУ. Адже на перших порах необхідні лише компілятор, відладчик, і безпосередньо сама Java-машина.

В таблиці 1.1 включені пакети програм, які є інтегрованими середовищами розробки. Окремі компілятори і відгадчики не згадуються.

Таблиця 1.1. Порівняння інтегрованих середовищ розробки

IDE

Ліцензія

Написана на Java

Windows

Linux

Mac OS X

Інші плат-форми

GUI builder

JDeveloper

Пропіетарна OTN JDeveloper License (freeware)

Так

Так

Так

Так

generic JVM

Так

jGRASP

Пропіетарна (freeware)

Так

Так

Так

Так


Ні

JBuilder

Пропіетарна

Так

Так

Так

Так

Solaris

Так

JCreator

Ні

Так

Ні

Ні


Ні

MyEclipse

Пропіетарна

Так

Так

Так

Так


Так

Rational Application Developer

Пропіетарна

Так

Так

Так

No

Solaris, AIX

Так

Servoy

Пропіетарна

Невідомо

Так

Так

Так

Solaris

Так

Xcode Apple

Пропіетарна

Ні

Ні

Ні

Так


Так

DrJava

Ліберальна

Так

Так

Так

Так

Solaris

Ні

BlueJ

GPL2+GNU linking exception

Так

Так

Так

Так

Solaris

Ні

Geany

GPL

Ні

Так

Так

Так

Solaris

Ні

Greenfoot

GPL

Так

Так

Так

Так

Solaris

Ні

IDE

Ліцензія

Написана на Java

Windows

Linux

Mac OS X

Інші платформи

GUI builder

KDevelop

GPL

Ні

Ні

Так

Ні

Solaris

Невідомо

Eclipse JDT IBM

EPL

Так

Так

Так

Так

Solaris

Так

NetBeans Oracle

CDDL, GPL2

Так

Так

Так

Так

Solaris

Так

IntelliJ IDEA

ALv2, пропіетарна

Так

Так

Так

Так

Solaris

Так



1.5.2 NetBeans IDE - універсальне інтегроване середовище розробки додатків

NetBeans IDE - безкоштовне інтегроване середовище розробки з відкритим початковим кодом для розробників програмного забезпечення. Середовище надає всі засоби, необхідні для створення професійних десктоп додатків, корпоративних, мобільних і веб-додатків на платформі Java, а також C/C++, PHP, JavaScript, Groovy и Ruby.

Основні характеристики NetBeans IDE:

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

·              IDE має в своєму складі розширений багатомовний редактор для різноманітних мов програмування - Java, C/C++, Ruby, Groovy, PHP, JavaScript, CSS, XML, HTML, RHTML, JSP, документацію Javadoc. Існує можливість розширення функцій редактору з метою підтримки любої іншої мови.

·              Редактор NetBeans робить відступи строк, перевіряє відповідність скобок і слів, підсвічує синтаксис початкового коду.

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

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

·              Браузер класів дозволяє переглядати ієрархію і структуру любого класу Java - відображаються інтерфейси, базові класи, похідні класи і члени класів.

·              Існує можливість переміщення любої вкладки редактора у межах робочого середовища IDE і за її межі, створюючи незалежне вікно, яке можна перемістити на другий екран.

·              Можливість групування зв’язаних проектів - створюючи групи проектів, можна швидко відкривати і закривати декілька згрупованих проектів одночасно.

·              Розширені можливості для виконання контекстно-залежного пошуку по всьому середовищі IDE, довідковим матеріалам і всім відкритим проектам і файлам.

·              Існує можливість створення проектів у вільному форматі чи починати роботу з проектом із шаблону. В комплекті з середовищем IDE поставляються шаблони і приклади проектів для додатків Java SE, мобільних, веб-додатків і додатків рівня підприємства, додатків JavaFX, підключаємих модулів NetBeans, додатків Groovy, PHP, C/C++, Ruby і Ruby on Rails.

·              NetBeans IDE є платформою для побудови десктоп додатків з функціональним користувацьким інтерфейсом, так як представляє з себе фреймворк до Java бібліотек Swing.

·              NetBeans має вбудовану підтримку CVS, Mercurial і Subversion. Для перегляду змін використовується редактор з кольоровими позначеннями.

Можливості програмування в NetBeans:

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

·              Створення веб-додатків і корпоративних додатків у відповідності з стандартами. Середовище NetBeans надає повну піддтримку Java EE 6. Дозволяє розробляти веб-сторінки, сервлети, веб-сервіси, Enterprise Java Beans (EJB), проекти Java EE з використанням JavaServer Faces 2.0 (Facelets), Spring, Struts і Hibernate.

·              Програмування на PHP, підтримка всіх супутніх мов програмування, технологій і веб-стандартів. Можливість створювати проекти PHP на основі платформи Zend чи Symfony. Редактор PHP динамічно інтегрований з функціями редагування HTML, JavaScript і CSS. Проекти PHP можуть бути розвернуті з середовища NetBeans на локальному чи видаленому сервері при взаємодії через FTP чи SFTP.

·              Можливість створення, тестування, відладки і впровадження приложений, що функціонують на мобільних телефонах, кишенькових комп’ютерах, телеприставках і вбудованих системах. Visual Mobile Designer (VMD) створює всю необхідну модульну інфраструктуру проекту і забезпечує швидку розробку графічних інтерфейсів шляхом перетягування на робочу область компонентів - екран очікування, екран входу в систему, оглядач файлів, середовище складання повідомлень SMS і екран заставки. Можливість створення користувацького інтерфейсу на основ SVG.

·              Використання JavaFX Composer для візуального структурування додатків JavaFX з графічним інтерфейсом, аналогічно конструктору GUI Swing для Java десктоп додатків.

·              Можливість розробки професійних додатків на мовах C, C++ для різноманітних платформ - Windows, Linux, Mac і Solaris. Підтримуються всі широко використовувані компілятори - GNU, Cygwin і MinGW. Існує можливість установки вимагаємого компілятора, визначень препроцесора, параметрів часу компіляції і т.д.

·              Розширені можливості по роботі з базами даних - вбудований клієнт до баз даних - MySQL, Postgres, Oracle і інших, редактор запитів SQL, можливість редагувати таблиці баз даних напряму через редактор таблиць.

·              Інтеграція з серверами додатків і контейнерами сервлетів - автоматичне розгортання додатків, керування сервером - запуск, зупинка, перезапуск.

·              Багатомовний користувацький інтерфейс з підтримкою російської мови.

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

Плюси NetBeans IDE:

·              Кроссплатформенність

·              Малий об’єм

·              Простота у використанні

·              Авто-закінчення тексту в деяких випадках

·              Підтримка CVS

·              Корисні функції

·              Повністю налаштовуємий інтерфейс

·              Для оновлення не вимагається скачувати всю програму заново, достатньо лише прийняти оновлення, коли NetBeans попросить вас це зробити

Мінусы:

·              Відсутність інтегрованої підтримки SVN

·              Відсутність вбудованої інтерактивної системи довідки по тій мови, для якої ця IDE призначена

·              Трохи більше використання пам’яті в виду використання Java

·              В деяких випадках авто-завершення тексту пропонує зовсім не те що необхідно.

Розділ 2. Розробка алгоритму програми та інтерфейсу користувача програмного продукту

згладжування сплайн програма інтерфейс

2.1 Вибір структури побудови програми

Була обрана така структура додатку: користувач обирає текстовий файл з даними, які необхідно згладжувати, потім з’являється інформаційне вікно, у якому показано ім’я обраного файлу та кількість даних у ньому. Після натиснення на кнопку "Показати графік" відображається графік кривої з вхідними даними і вікно вибору методу згладжування - методом центра трикутника, уточненим методом чи за допомогою сплайну третього порядку. Після вибору метода згладжування з’являється графік з двома кривими - вхідні дані та згладжені дані.

З вікна вибору метода є доступ до горизонтального меню:

1.      Файл

а) Змінити колір фону

б) Вихід

2.      Довідка

а) Переглянути довідку

б) Про програму

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

Так як мова є об’єктно-орієнтованою, то кожне вікно та метод згладжування розглядаємо як об’єкт і реалізуємо за допомогою класів.

2.2 Проектування та створення додатку

 

.2.1 Класи та їх призначення

На першому етапі розробки програми необхідно виділити основні класи:

. Splain - містить метод public static void main(String[] args), в якому розпочинається робота програми. Окрім того тут створюється екземпляри кожного класу.

. StartFrame - реалізує процес створення стартового вікна

. OpenFrame - реалізує процес створення вікна з кнопкою для вибору файлу

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

. Graphic - реалізує процес створення вікна з відображенням графіку кривої вхідних даних

. Graphic1 - реалізує процес створення вікна з відображенням графіку кривої вхідних даних та згладжених даних

. Method - реалізує процес створення вікна вибору методу згладжування і виводить ім’я файлу, куди збереглись згладжені дані для подальшої роботи з ними

. Help - реалізує процес створення вікна для відображення інформаційних даних для пункту меню "Довідка"

. Triangle_Method - у цьому класі відбуваються всі необхідні операції для отримання згладжених даних за методом заміни трьох послідовних точок центром тяжіння трикутника з вершинами в цих точках

. Update_Method - у цьому класі відбуваються всі необхідні операції для реалізації методу згладжування даних більш вищої точності

. Spline - у цьому класі відбуваються всі необхідні операції для реалізації згладжування за допомогою інтерполяційного сплайну третього порядку.

 

.2.2 Діаграма класів

На рис. 2.1. наведена діаграма класів.

2.2.3 Графічне описання алгоритмів згладжування, використаних у програмі

На рис. 2.2. наведена блок-схема алгоритмів методу центру тяжіння трикутників та методу підвищеної точності, реалізація якої описана в ДОДАТКУ А у методі run().

Рисунок 2.2. Блок-схема алгоритмів методу центру тяжіння трикутників та методу підвищеної точності

На рис. 2.3 - 2.5 наведені блок-схеми методів Create(), Sort() та Length() для методів центру тяжіння трикутників і підвищеної точності.

Рисунок 2.3. Блок-схема методу Create()

Рисунок 2.4. Блок-схема методу Sort()

Рисунок 2.5. Блок-схема методу Length()

На рис. 2.6 - 2.7 представлені блок-схеми методів Doopr() та New() для методу центру тяжіння трикутників. На рис. 2.8 - 2.9 представлені аналогічні блок-схеми для методу підвищеної точності.

Рисунок 2.6. Блок-схема методу Doopr() для методу центру тяжіння трикутників

Рисунок 2.7. Блок-схема методу New() для методу центру тяжіння трикутників

Рисунок 2.8. Блок-схема методу New() для методу підвищеної точності

Рисунок 2.9. Блок-схема методу Doopr() для методу підвищеної точності

Рисунок 2.10. Блок-схема методу Solve() для алгоритму побудови сплайну

 Рисунок 2.12. Блок-схема методу InitializationВ()

Рисунок 2.11. Блок-схема методу InitializationA()



2.3 Особливості програмної реалізації програми фільтрації шуму за допомогою сплайнів

 

.3.1 Актуальність проблеми

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

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

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

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

 

2.3.2 Детальний опис особливостей реалізації програмного продукту

Для згладжування даних використовуються класи Triangle_Method і Update_Method. Екземпляри цих класів створюються у класі Splain, тому що цей клас містить метод main, з якого і починається запуск всієї програми.

static void main(String[] args) throws IOException {s = new Splain();= new StartFrame(s);.setVisible(true);

}

У цьому методі створюється екземпляр поточного класу Splain, який потім слугує параметром конструктору типу package_protected для всіх класів, що ініціюють створення вікна. Окрім того, у методі main створюється також екземпляр класу StartFrame, який робить видимим вікно-заставку.

Після створення екземплярів класів Triangle_Method і Update_Method викликається метод run() з цих класів, результат виконання якого присвоюється змінній nameFileReturn, що використовується в подальшому для відображення імені файлу збереження згладжених даних.

String tr_m() {= new Triangle_Method(this);nameFileReturn = tm.run();= new Graphic1(this, title);.setVisible(true);nameFileReturn;

}String up_m() {_Method up = new Update_Method(this);nameFileReturn = up.run();= new Graphic1(this, title);.setVisible(true);nameFileReturn;

}

 

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

Безпосередньо методи public String tr_m() {…} та public String up_m() {…} викликаються у класі Method при щиглику на радіокнопку.

void rbTriangleActionPerformed(java.awt.event.ActionEvent evt) { .title = "Згладжування методом трикутника";.setText(spl.tr_m());.nonShowGr1();

} void rbUpdateActionPerformed(java.awt.event.ActionEvent evt) { .title = "Згладжування уточненим методом";.setText(spl.up_m());.nonShowGr1();

}

Зупинимось на більш детальному розгляді реалізації класів Triangle_Method і Update_Method.

Дані для розрахунку зчитуються з текстового файлу, вказаного користувачем.

public void Create() { int jx = -1; int jy = -1; for (i = 0; i < spl.coord.size(); i++) { if ((i % 2) == 0) { jx++; x[jx] = spl.coord.get(i); } else { jy++; y[jy] = spl.coord.get(i); } }}


Щойно зчитані дані зберігаються у динамічному дійсному масиві coord, а потім сортуються по дійсним масивам x[n], y[n], де n - кількість строк у вихідному текстовому файлі. Надалі всі операції (сортування масиву, дооприділення даних, довжина кривих та розрахунок згладжених даних) виконуються із сформованими масивами.

Всі проміжні дані записуються у файли у методі Print().

public void Print(String name, int r, double[] a, double[] b) {= new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "TriangleMethod");.mkdir();nf = NumberFormat.getInstance();{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(j = 0; j < r; j++) {.print(nf.format(a[j]));.print(";");.println(nf.format(b[j]));

}.flush();

} catch (IOException ex) {.getMessage();

}

}

Параметр name - ім’я файлу, в який записуються проміжні розрахунки, r - умова закінчення циклу, a і b - масиви для запису.

Для зручності користувача у перших трьох строках методу створюється папка в поточному каталозі з ім’ям виконуваного класу. Так як однією з вимог до програми була кроссплатформеність, то роздільник каталогів задається системно (System.getProperty("file.separator")). Також використовується форматований запис даних.

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

По алгоритму побудови сплайну (рис. 2.10) необхідно знайти матрицю А, обернену до неї матрицю, матрицю-добуток вхідних значень функції на константу 6, добуток останної розрахованої матриці на обернену матрицю. Для виконання всіх цих операцій використовується бібліотека JAMA, а саме методи класу Matrix. Проміжні дані, такі як добуток матриці на обернену, доданки у формулі розрахунку сплайна, значення сплайна у заданих точках, всі обчислені матриці також записуються у файл в папку поточного каталога.

Крім того, користувач має змогу задавати необхідну кількість проміжних значень на кожному інтервалі.input = JOptionPane.showInputDialog("Скільки проміжних значень на кожному інтервалі Ви хочете взяти для обчислення сплайну?");

= Integer.parseInt(input);

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

 

.3.3 Опис інтерфейсу користувача

Після запуску програми з’являється заставка (рис. 2.13).

У наступному вікні користувач обирає текстовий файл з початковими даними (рис. 2.14 - 2.15)

Далі відображається вікно з інформацією про обраний файл - його назвою та кількістю даних у файлі (рис. 2.16).

Рисунок 2.13. - Заставка додатку

Рисунок 2.14. - Вікно для активізації діалогу вибору файлу

Рисунок 2.15. - Вікно вибору файлу

Рисунок 2.16. - Інформаційне вікно з даними про файл

Натиснувши на кнопку "Показати графік" з’являється вікно з графіком кривої, побудованої на основі даних з текстового файлу (рис. 2.17), а також головне вікно програми (рис. 2.18 - 2.20).

Рисунок 2.17. - Графік вхідних даних

Рисунок 2.18. - Головне вікно програми

Рисунок 2.19. - Головне вікно програми: пункт меню Довідка → Про програму

Рисунок 2.20. - Головне вікно програми: пункт меню Файл → Змінити колір фону

У головному вікні додатку є чотири радіокнопки, кожна з яких реалізує певний вид алгоритму згладжування. На рис. 2.21 - 2.26 представлено результат їх вибору.

Рисунок 2.21. - Графік згладжених даних за методом трикутника

Рисунок 2.22. - Графік згладжених даних за уточненим методом

Рисунок 2.23. - Вікно запиту на кількість проміжних значень при виборі кнопки "за допомогою сплайна"

Рисунок 2.24 - Графік згладжених даних за допомогою сплайна

Рисунок 2.25. - Вікно запиту на вибір файлу для побуди сплайну при виборі кнопки "за допомогою сплайна використовуючи згладжені дані"

Рисунок 2.26. - Графік згладжених даних за допомогою сплайна на основі згладжених даних

Якщо дані згладжувати всіма запропонованими способами, то після роботи додатку головне вікно буде мати вигляд показаний на рис. 2.27.

Рисунок 2.27. - Головне вікно програми після вибору всіх алгоритмів згладжування

Висновки

В результаті виконання дипломного проекту була розглянуті методи згладжування експерементальнтих даних, обґрунтовано використання методу згладжування - сплайном. Розроблена блок-схема і алгоритм програмної реалізації методу згладжування сплайнами. Програмний продукт написаний на мові Java SE, використані бібліотеки JFreeChart та JAMA. Також виконано опробування програми і показано роботоздатність.

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

У розділі 2 було виконано розробку блок-схем задіяних методів згладжування, алгоритм реалізації програмного продукту, а також інтерфейсу користувача. В процесі проектування додатку було сгенеровно діаграму класів UML.

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

Список літератури

1. Хорстманн К.С., Корнелл Г. Java 2. Библиотека профессионала, том I. Основы, 7-е изд.: Пер. с англ. - М.: Издательский дом "Вильямс", 2007. - 896 с.

2.   Java Code Conventions - Oracle, September 12, 1997. - 24 p.

3. Эккель Б. Философия Java. Библиотека программиста. 4-е изд. - СПб.: Питер, 2009. - 640 с.

4.   Фаулер М. Рефакторинг: улучшение существующего кода. - Пер. с англ. - СПб.: Символ-Плюс, 2003. - 432 с.

5.     Ноутон П., Шилдт Г. JAVA 2 - "БХВ-Петербург", 2001. - 1102 с.

6.      Макаров В.Л., Хлобыстов В.В. Сплайн-аппроксимация функций: Учеб. пособие для студентов вузов. - М.: Высш.шк., 1983 - 80 с.

.        Василенко В.А. Сплайн-функции: теория, алгоритмы, программы. - Новосибирск: Наука, 1983, 215 с.

.        Малоземов В.Н., Певный А.Б. Полиномиальные сплайны: Учеб. пособие. - Л.: Из-во Ленингр. ун-та, 1986, 120 с.

.        Де Бор К. Практическое руководство по сплайнам: Пер. с англ. - М.: Радио и связь, 1985. 304 с.

.        Завьялов Ю.С., Квасов Б.И., Мирошниченко В.Л. Методы сплайн-функций. - М.: Наука. Главная редакция физико-математической литературы, 1980, 350 с.

.        Лигун А.А., Шумейко А.А. Асимптотические методы восстановления кривых: Киев, 1997. - 358 с.

.        http://www.jfree.org

.        http://math.nist.gov/javanumerics/jama/

14.   Borland® JBuilder™ Developer's Guide

15.   Жмайлов Б.Б. Преимущества и недостатки разработки Java-программ без использования IDE-средств. Журнал "Вестник компьютерных и информационных технологий" №6, 2006г.

16.    http://en.wikipedia.org/wiki/Comparison_of_integrated_development_environments

.        Шилдт Г., Холмс Дж. Искусство программирования на Java - 2006, 336 с.

.        Гудрич М.Т., Тамассия Р. Структуры данных и алгоритмы в Java. - Мн.: Новое знание, 2003. 671 с.

19.    Бердо Р.С., Козуб П.А. Система фильтрации шума с помощью гауссовых кривих / Р.С. Бердо, П.А. Козуб // Зб. наук. праць Х міжнародної конференції ДВНЗ "НГУ". - Дніпропетровськ, 2013. - №1. - С. 58-60.

Додаток А

Лістинг програми

StartFrame.java

package splain;

/**

* StartFrame

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class StartFrame extends javax.swing.JFrame {spl;

/**

* Creates new form StartFrame

*/StartFrame(Splain spl) {();.frameDisplayCenter(getWidth(), getHeight(), this);(new javax.swing.ImageIcon("src/graphics/graph.png").getImage());.spl = spl;

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">void initComponents() {= new javax.swing.JPanel();= new javax.swing.JLabel();= new javax.swing.JLabel();

setTitle("Згладжування даних за допомогою сплайна");

setBackground(new java.awt.Color(255, 255, 255));(java.awt.Color.white);(new java.awt.event.MouseAdapter() {void mouseClicked(java.awt.event.MouseEvent evt) {(evt);

}

});.setBackground(new java.awt.Color(0, 204, 255));.setText("<html><style>\n .stroke {\n font: bold 2em Monotype Corsiva;\n text-shadow: red 0 0 2px;\n }\n</style>\n<p>ВІТАЄМО</FONT></I></p>\n</html>");.setIcon(new javax.swing.ImageIcon("src/graphics/global2.png"));.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);.setLayout(jPanel1Layout);Layout.setHorizontalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(241, 241, 241)

.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 187, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(250, Short.MAX_VALUE))

);Layout.setVerticalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(16, 16, 16)

.addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 54, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 489, Short.MAX_VALUE))

);.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);();

}// </editor-fold>void formMouseClicked(java.awt.event.MouseEvent evt) { .showOpen();

} javax.swing.JLabel jLabel1;javax.swing.JLabel jLabel2;javax.swing.JPanel jPanel1;

}.javasplain;java.io.BufferedReader;java.io.File;java.io.FileReader;java.io.IOException;java.util.ArrayList;javax.swing.ImageIcon;javax.swing.JFileChooser;javax.swing.JOptionPane;

/**

* StartFrame

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

/**

* Creates new form OpenFrame

*/OpenFrame(Splain spl) {();.frameDisplayCenter(getWidth(), getHeight(), this);(new ImageIcon("src/graphics/graph.png").getImage());.nonShowStartFrame();= spl.coord;.spl = spl;

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {= new javax.swing.JPanel();= new javax.swing.JLabel();= new javax.swing.JButton();= new javax.swing.JLabel();(javax.swing.WindowConstants.EXIT_ON_CLOSE);("Згладжування даних за допомогою сплайна: Відкриття файлу");

setForeground(java.awt.Color.white);("JFrame");.setBackground(new java.awt.Color(153, 255, 153));.setIcon(new ImageIcon("src/graphics/icoInofo.png"));.setFont(new java.awt.Font("Cambria Math", 0, 18)); // NOI18N.setText("Відкрити файл");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {ActionPerformed(evt);

}

});.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("<html>при активізації цієї кнопки в подальшому слід обрати текстовий файл з даними</html>");.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);.setLayout(jPanel1Layout);Layout.setHorizontalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap(83, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 171, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(251, 251, 251))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 457, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(57, 57, 57))))

);Layout.setVerticalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(170, 170, 170)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(113, 113, 113)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 84, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(20, 20, 20)

.addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(155, Short.MAX_VALUE))

);.getAccessibleContext().setAccessibleName("OpenButton");.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);();

}// </editor-fold> void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { returnValue = fileChooser.showOpenDialog(null);(returnValue == JFileChooser.APPROVE_OPTION) {selectedFile = fileChooser.getSelectedFile();= selectedFile.getPath();.name = selectedFile.getName();

}{in =BufferedReader(new FileReader(fileName)); //openning of fileline; //variable for keeping string of file((line = in.readLine()) != null) { //while not end of file[] tmp = line.split(";");.add(Double.parseDouble(tmp[0])); //reading in massiv coord.add(Double.parseDouble(tmp[1]));

}

} catch (IOException ex) {.getLocalizedMessage();.showMessageDialog(null, "I/O Error!");

} catch (NullPointerException e) {.showMessageDialog(null, "File not found!");

}(fileName != null) {.showDataFile();

}.setVisible(false);

} javax.swing.JButton jButton1;javax.swing.JLabel jLabel1;javax.swing.JLabel jLabel3;javax.swing.JPanel jPanel1;

}

DataFile.javasplain;javax.swing.ImageIcon;

/**

* DataFile

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class DataFile extends javax.swing.JFrame {

/**

* Creates new form DataFile

*/spl;DataFile(Splain spl) {();.frameDisplayCenter(getWidth(), getHeight(), this);(new ImageIcon("src/graphics/graph.png").getImage());.spl = spl;_name.setText(spl.name);_kl.setText(Integer.toString((spl.coord.size()) / 2));

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {= new javax.swing.JPanel();= new javax.swing.JButton();= new javax.swing.JLabel();_kl = new javax.swing.JTextField();= new javax.swing.JLabel();_name = new javax.swing.JTextField();(javax.swing.WindowConstants.EXIT_ON_CLOSE);("Згладжування даних за допомогою сплайна: Відкрили файл");

jPanel1.setBackground(new java.awt.Color(153, 255, 153));.setPreferredSize(new java.awt.Dimension(682, 565));.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("Показати графік");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {ActionPerformed(evt);

}

});.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("Кількість даних:");_kl.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N_kl.setDisabledTextColor(new java.awt.Color(51, 0, 102));_kl.setEnabled(false);.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("Відкритий масив:");_name.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N_name.setDisabledTextColor(new java.awt.Color(51, 0, 102));_name.setEnabled(false);_name.setName("");.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);.setLayout(jPanel1Layout);Layout.setHorizontalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(195, 195, 195)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(TF_name)

.addComponent(TF_kl, javax.swing.GroupLayout.PREFERRED_SIZE, 264, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(60, 60, 60)

.addComponent(jLabel1))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(66, 66, 66)

.addComponent(jLabel2))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(49, 49, 49)

.addComponent(jButton1)))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 46, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(223, Short.MAX_VALUE))

);Layout.setVerticalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(108, 108, 108)

.addComponent(jLabel1)

.addGap(18, 18, 18)

.addComponent(TF_name, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(TF_kl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(51, 51, 51)

.addComponent(jButton1)

.addContainerGap(228, Short.MAX_VALUE))

);.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

);();

}// </editor-fold> void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { .setVisible(false);.showGr1();.meth();

} javax.swing.JTextField TF_kl;javax.swing.JTextField TF_name;javax.swing.JButton jButton1;javax.swing.JLabel jLabel1;javax.swing.JLabel jLabel2;javax.swing.JPanel jPanel1;

}.javasplain;javax.swing.ImageIcon;

/**

* Help

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Help extends javax.swing.JFrame {spl;

/**

* Creates new form Help

*/Help(Splain spl) {();(new ImageIcon("src/graphics/graph.png").getImage());(800, 200, 626, 290);.spl = spl;

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {= new javax.swing.JLabel();= new javax.swing.JSeparator();= new javax.swing.JLabel();= new javax.swing.JLabel();= new javax.swing.JLabel();= new javax.swing.JButton();= new javax.swing.JLabel();(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);.setFont(new java.awt.Font("Arial", 3, 24)); // NOI18N.setText("Фільтрація шуму за допомогою сплайнів");.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("Версія 1.1");.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N

jLabel3.setText("Розроблено в травні 2013 року");

jLabel4.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N

jLabel4.setText("Власником ліцензії на цей продукт є ДВНЗ\"НГУ\"");

jButton1.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("OK");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {ActionPerformed(evt);

}

});.setPreferredSize(new java.awt.Dimension(55, 55));.setIcon(new ImageIcon("src/graphics/graph.png"));.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(28, 28, 28)

.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel1))

.addGroup(layout.createSequentialGroup()

.addGap(31, 31, 31)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel3)

.addComponent(jLabel2)

.addComponent(jLabel4)))

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 595, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addContainerGap(21, Short.MAX_VALUE))

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addGap(0, 0, Short.MAX_VALUE)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 94, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(56, 56, 56))

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(20, 20, 20)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel1))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jLabel3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jLabel4)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton1)

.addContainerGap(18, Short.MAX_VALUE))

);();

}// </editor-fold> void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { .setVisible(false);

} javax.swing.JButton jButton1;javax.swing.JLabel jLabel1;javax.swing.JLabel jLabel2;javax.swing.JLabel jLabel3;javax.swing.JLabel jLabel4;javax.swing.JLabel jLabel5;javax.swing.JSeparator jSeparator1;

}.javasplain;javax.swing.ImageIcon;org.jfree.chart.ChartFactory;org.jfree.chart.ChartPanel;org.jfree.chart.JFreeChart;org.jfree.chart.plot.PlotOrientation;org.jfree.chart.plot.XYPlot;org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;org.jfree.data.xy.XYSeries;org.jfree.data.xy.XYSeriesCollection;

/**

* Graphic

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Graphic extends javax.swing.JFrame {spl;Graphic(Splain spl) {();(new ImageIcon("src/graphics/graph.png").getImage());.spl = spl;

//create 1 row of dataseries = new XYSeries("Ряд1 1");

//add points on the graphic(int i = 0; i < spl.n; i++) {.add(spl.x[i], spl.y[i]);

}

//зразу ж додаємо ряд в набір даниx

XYSeriesCollection data = new XYSeriesCollection(series);

//create diagramJFreeChart chart = ChartFactory.createXYLineChart(

"Крива вхідних даних",

"X",

"Y",

data,.VERTICAL,,,);xyplot = (XYPlot) chart.getPlot();.setDomainPannable(true);.setRangePannable(true);xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot.getRenderer();.setBaseShapesVisible(true);

//create panel for graphicchartPanel = new ChartPanel(chart);

//додаємо панель на створений нами фрейм

this.setContentPane(chartPanel);

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {("Графік вхідних даних");(new java.awt.Dimension(682, 565));.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 400, Short.MAX_VALUE)

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 300, Short.MAX_VALUE)

);();

}// </editor-fold>

}.javasplain;javax.swing.ImageIcon;org.jfree.chart.ChartFactory;org.jfree.chart.ChartPanel;org.jfree.chart.JFreeChart;org.jfree.chart.plot.PlotOrientation;org.jfree.chart.plot.XYPlot;org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;org.jfree.data.xy.XYSeries;org.jfree.data.xy.XYSeriesCollection;

/**

* Graphic

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Graphic extends javax.swing.JFrame {spl;Graphic(Splain spl) {();(new ImageIcon("src/graphics/graph.png").getImage());.spl = spl;

//create 1 row of dataseries = new XYSeries("Ряд1 1");

//add points on the graphic(int i = 0; i < spl.n; i++) {.add(spl.x[i], spl.y[i]);

}

//зразу ж додаємо ряд в набір даниx

XYSeriesCollection data = new XYSeriesCollection(series);

//create diagramJFreeChart chart = ChartFactory.createXYLineChart(

"Крива вхідних даних",

"X",

"Y",

data,.VERTICAL,,,);xyplot = (XYPlot) chart.getPlot();.setDomainPannable(true);.setRangePannable(true);xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot.getRenderer();.setBaseShapesVisible(true);

//create panel for graphicchartPanel = new ChartPanel(chart);

//додаємо панель на створений нами фрейм

this.setContentPane(chartPanel);

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {("Графік вхідних даних");(new java.awt.Dimension(682, 565));.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 400, Short.MAX_VALUE)

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGap(0, 300, Short.MAX_VALUE)

);();

}// </editor-fold>

}_Method.javasplain;java.io.BufferedWriter;java.io.FileWriter;java.io.IOException;java.io.PrintWriter;java.text.NumberFormat;java.util.Locale;

/**

* Triangle_Method

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Triangle_Method {spl;Triangle_Method(Splain spl) {= (spl.coord.size()) / 2;.n = n;= n + 2;= new double[n];= new double[n];= new double[m];= new double[m];= new double[n];= new double[n];.x = x;.y = y;.x1 = x1;.y1 = y1;.spl = spl;

}

/** input masivs */double[] x, y;

/** index of cycle */int i, j;

/** quantity of elements masivs, m is masivs xx and yy */int n, m;

/** masivs of doopredeleniya */double[] xx, yy;

/** output masivs */double[] x1, y1;String nameFile;PrintWriter out;java.io.File f;

/**

* Dividing of data

*/void Create() {jx = -1;jy = -1;(i = 0; i < spl.coord.size(); i++) {((i % 2) == 0) {++;[jx] = spl.coord.get(i);

} else {++;[jy] = spl.coord.get(i);

}

}

}

/**

* sort

*/void Sort() {(i = 1; i < n; i++) {(j = n - 1; j >= i; j--) {(x[j - 1] > x[j]) {t = x[j - 1];[j - 1] = x[j];[j] = t;ty = y[j - 1];[j - 1] = y[j];[j] = ty;

}

}

}= "Sorted data_Tr.txt";(nameFile, n, x, y);

}

/**

* doopredelenie

*/void Doopr() {[0] = (4 * x[0] + x[1] - 2 * x[2]) / 3;[0] = (4 * y[0] + y[1] - 2 * y[2]) / 3;[m - 1] = (4 * x[n - 1] + x[n - 2] - 2 * x[n - 3]) / 3;[m - 1] = (4 * y[n - 1] + y[n - 2] - 2 * y[n - 3]) / 3;(i = 1; i < n + 1; i++) {[i] = x[i - 1];[i] = y[i - 1];

}= "Doopredelenie data_Tr.txt";(nameFile, n + 2, xx, yy);

}

/**

* output masivs

*/String New() {(i = 1; i < n + 1; i++) {[i - 1] = (xx[i - 1] + xx[i] + xx[i + 1]) / 3;[i - 1] = (yy[i - 1] + yy[i] + yy[i + 1]) / 3;

}= "New data_Tr.txt";nameFileReturn = f + System.getProperty("file.separator") + nameFile;(nameFile, n, x1, y1);nameFileReturn;

}

/**

* solve of length of curves

*/double[] Length() {[] dl = new double[2];ll, ll1;L = 0, L1 = 0;nf = NumberFormat.getInstance();{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + "Length of curves_Tr.txt")));(i = 0; i < n - 1; i++) {= Math.sqrt(Math.pow((x[i] - x[i + 1]), 2)

+ Math.pow((y[i] - y[i + 1]), 2));= Math.sqrt(Math.pow((x1[i] - x1[i + 1]), 2)

+ Math.pow((y1[i] - y1[i + 1]), 2));.print(nf.format(ll));.print('\t');.print('\t');.println(nf.format(ll1));+= ll;+= ll1;

}

} catch (IOException ex) {.getMessage();

}[0] = L;[1] = L1;.print("Summary length of curves:");.print('\t');.print("L = ");.print(nf.format(L));.print('\t');.print("L1 = ");.print(nf.format(L1));.flush();dl;

}void run0() {();();

}String run() {();();();ss = New();[] dl2 = Length();(dl2[0] < dl2[1]) {(i = 0; i < n; i++) {[i] = x1[i];[i] = y1[i];

}();();= Length();

}ss;

}

/**

* print all masivs

*/void Print(String name, int r, double[] a, double[] b) {= new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "TriangleMethod");.mkdir();loc = new Locale("en", "US");nf = NumberFormat.getInstance(loc);{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(j = 0; j < r; j++) {.print(nf.format(a[j]));.print(";");.println(nf.format(b[j]));

}.flush();

} catch (IOException ex) {.getMessage();

}

}

}_Method.java

package splain;java.io.BufferedWriter;java.io.FileWriter;java.io.IOException;java.io.PrintWriter;java.text.NumberFormat;java.util.Locale;

/**

* Update_Method

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Update_Method {spl;Update_Method(Splain spl) {.spl = spl;= (spl.coord.size()) / 2;.n = n;= n + 4;= new double[n];= new double[n];= new double[m];= new double[m];= new double[n];= new double[n];.x = x;.y = y;.x1 = x1;.y1 = y1;

}

/** input masivs */double[] x, y;

/** index of cycle */int i, j;

/** quantity of elements masivs, m is masivs xx and yy */int n, m;

/** masivs of doopredeleniya */double[] xx, yy;

/** output masivs */double[] x1, y1;PrintWriter out;String nameFile;java.io.File f;

/**

* Dividing of data

*/void Create() {jx = -1;jy = -1;(i = 0; i < spl.coord.size(); i++) {((i % 2) == 0) {++;[jx] = spl.coord.get(i);

} else {++;[jy] = spl.coord.get(i);

}

}

}

/**

* sort

*/void Sort() {(i = 1; i < n; i++) {(j = n - 1; j >= i; j--) {(x[j - 1] > x[j]) {t = x[j - 1];[j - 1] = x[j];[j] = t;ty = y[j - 1];[j - 1] = y[j];[j] = ty;

}

}

}= "Sorted data__Up.txt";(nameFile, n, x, y);

}

/**

* doopredelenie

*/void Doopr() {[1] = (126 * x[0] - 56 * x[2] - 42 * x[3] + 42 * x[4]) / 70;[0] = (105 * x[0] - 14 * x[1] - 63 * x[2] - 42 * x[3] + 49 * x[4]) / 35;[1] = (126 * y[0] - 56 * y[2] - 42 * y[3] + 42 * y[4]) / 70;[0] = (105 * y[0] - 14 * y[1] - 63 * y[2] - 42 * y[3] + 49 * y[4]) / 35;[m - 2] = (126 * x[n - 1] - 56 * x[n - 3] - 42 * x[n - 4]

+ 42 * x[n - 5]) / 70;[m - 1] = (105 * x[n - 1] - 14 * x[n - 2] - 63 * x[n - 3]

42 * x[n - 4] + 49 * x[n - 5]) / 35;[m - 2] = (126 * y[n - 1] - 56 * y[n - 3] - 42 * y[n - 4]

+ 42 * y[n - 5]) / 70;[m - 1] = (105 * y[n - 1] - 14 * y[n - 2] - 63 * y[n - 3]

42 * y[n - 4] + 49 * y[n - 5]) / 35;(i = 2; i < m - 2; i++) {[i] = x[i - 2];[i] = y[i - 2];

}= "Doopredelenie data_Up.txt";(nameFile, n + 4, xx, yy);

}

/**

* output masivs

*/String New() {(i = 0; i < n; i++) {[i] = xx[i + 2] - (3 * (xx[i + 4] - 4 * xx[i + 3] + 6 * xx[i + 2]

4 * xx[i + 1] + xx[i]) / 35);[i] = yy[i + 2] - (3 * (yy[i + 4] - 4 * yy[i + 3] + 6 * yy[i + 2]

4 * yy[i + 1] + yy[i]) / 35);

}= "New data_Up.txt";nameFileReturn = f + System.getProperty("file.separator") + nameFile;(nameFile, n, x1, y1);nameFileReturn;

}

/**

* solve of length of curves

*/double[] Length() {[] dl = new double[2];ll, ll1;L = 0, L1 = 0;nf = NumberFormat.getInstance();{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + "Length of curves_Up.txt")));(i = 0; i < n - 1; i++) {= Math.sqrt(Math.pow((x[i] - x[i + 1]), 2)

+ Math.pow((y[i] - y[i + 1]), 2));= Math.sqrt(Math.pow((x1[i] - x1[i + 1]), 2)

+ Math.pow((y1[i] - y1[i + 1]), 2));.print(nf.format(ll));.print('\t');.print('\t');.println(nf.format(ll1));+= ll;+= ll1;

}

} catch (IOException ex) {.getMessage();

}[0] = L;[1] = L1;.print("Summary length of curves:");.print('\t');.print("L = ");.print(nf.format(L));.print('\t');.print("L1 = ");.print(nf.format(L1));.flush();dl;

}String run() {();();();ss = New();[] dl2 = Length();(dl2[0] < dl2[1]) {(i = 0; i < n; i++) {[i] = x1[i];[i] = y1[i];

}();();= Length();

}ss;

}

/**

* print all masivs

*/void Print(String name, int r, double[] a, double[] b) {= new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "UpdateMethod");.mkdir();loc = new Locale("en", "US");nf = NumberFormat.getInstance(loc);{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(j = 0; j < r; j++) {.print(nf.format(a[j]));.print(";\t\t");.println(nf.format(b[j]));

}.flush();

} catch (IOException ex) {.getMessage();

}

}

}.javasplain;Jama.Matrix;java.awt.Color;java.awt.Dimension;java.io.BufferedWriter;java.io.FileWriter;java.io.IOException;java.io.PrintWriter;java.text.NumberFormat;javax.swing.ImageIcon;javax.swing.JFrame;javax.swing.JOptionPane;org.jfree.chart.ChartPanel;org.jfree.chart.ChartUtilities;org.jfree.chart.JFreeChart;org.jfree.chart.axis.NumberAxis;org.jfree.chart.plot.XYPlot;org.jfree.chart.renderer.xy.XYSplineRenderer;org.jfree.data.xy.XYSeries;org.jfree.data.xy.XYSeriesCollection;org.jfree.ui.RectangleInsets;

/**

* Spline

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Spline {spl;Spline(Splain spl) {.spl = spl;= (spl.coord.size()) / 2;

}Matrix A;Matrix B;Matrix C;int n;int i;int j;PrintWriter out;double[] S;int l;double delta;java.io.File f;

/**

* create matrix A

*/Matrix InitializationA() {[][] M = new double[n][n];(i = 0; i < n; i++) {(j = 0; j < n; j++) {(i == j) {[i][j] = 4;

}((i - j) == 1) {[i][j] = 1;

}((j - i) == 1) {[i][j] = 1;

}((i - j) == n - 1) {[i][j] = 1;

}

}

}new Matrix(M);

}

/*

* solve of spline

*/String Solve() {= InitializationA(); (A, "Matrix A.txt");= A.inverse(); (A, "Matrix inverse.txt"); = InitializationB();= B.timesEquals(6.0); (B, "Multiply.txt");= A.times(B);nameFileReturn = f + System.getProperty("file.separator") + "Matrix C.txt";[][] old = C.getArray(); //old massiv C[][] newC = new double[n+4][old[0].length];(i = 0; i < n; i++) {(j = 0; j < old[0].length; j++) {[i + 2][j] = old[i][j];

}

}(j = 0; j < old[0].length; j++) {[0][j] = newC[n][j];[1][j] = newC[n + 1][j];[n + 2][j] = newC[2][j];[n + 3][j] = newC[3][j];

}Cnew = new Matrix(newC);(Cnew, "Matrix C.txt");h = 1;=0;[] z1 = new double[n];[] z2 = new double[n];[] z3 = new double[n];[] z4 = new double[n];q = 0; //индекс массивов z(i = 1; i < n + 1; i++) {[q] = (newC[i+2][j] + 4 * newC[i+1][j] + newC[i][j]) / 6;[q] = (newC[i+2][j] - newC[i][j]) / (2 * h);[q] = (newC[i+2][j] - 2 * newC[i+1][j] + newC[i][j]) / (2 * h * h);[q] = (newC[i+3][j]-3*newC[i+2][j]+3*newC[i+1][j]-newC[i][j])/(6*h*h*h);++;

}("Z1.txt", n, z1);("Z2.txt", n, z2);("Z3.txt", n, z3);("Z4.txt", n, z4);t;k;input = JOptionPane.showInputDialog("Скільки проміжних значень на кожному інтервалі Ви хочете взяти для обчислення сплайну?");= Integer.parseInt(input);= new double[n*(l+1)];= (spl.x[2]-spl.x[1])/l;(i=0; i<n; i++){(j = 0; j < l+1; j++){= j * delta;= (l+1) * i +j;[k] = z1[i] + z2[i]*t + z3[i]*t*t + z4[i]*t*t*t;

}

}("S.txt", n*(l+1), S);();nameFileReturn;

}

/*

* инициализация массива-столба y

*/Matrix InitializationB() {[] N = new double[n];(i = 0; i < n; i++) {[i] = spl.y[i];

}new Matrix(N, n);

}

/*

* input matrix in file

*/void PrintMatrix(Matrix mas, String name) {nf = NumberFormat.getInstance();= new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "SplineMethod");.mkdir();{row = mas.getRowDimension();col = mas.getColumnDimension();= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(i = 0; i < row; i++) {(j = 0; j < col; j++) {.print(nf.format(mas.get(i, j)));.print(" ");

}.println();

}.flush();

} catch (IOException ex) {.getMessage();

}

}

/**

* print all masivs

*/void PrintMassiv(String name, int r, double[] a) {.io.File f = new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "SplineMethod");.mkdir();nf = NumberFormat.getInstance();{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(j = 0; j < r; j++) {.print(nf.format(a[j]));.println();

}.flush();

} catch (IOException ex) {.getMessage();

}

}void createGraphic(){frame = new JFrame("Графік сплайну");.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);.setPreferredSize(new Dimension(682, 565));.setIconImage(new ImageIcon("src/graphics/graph.png").getImage());series = new XYSeries("Вхідні дані");series2 = new XYSeries("Отримані дані");[] t = new double[(n+l*(n-1))+l];[0] = spl.x[0];(i = 1; i < (n+l*(n-1))+l; i++) {[i] = t[i-1] + delta;

}(i = 0; i < n; i++) {.add(spl.x[i], spl.y[i]);

}(i = 0; i < n*(l+1); i++) {.add(t[i], S[i]);

}data = new XYSeriesCollection();.addSeries(series);.addSeries(series2);numberaxis = new NumberAxis("X");.setAutoRangeIncludesZero(false);numberaxis1 = new NumberAxis("Y");.setAutoRangeIncludesZero(false);xysplinerenderer = new XYSplineRenderer();xyplot = new XYPlot (data, numberaxis, numberaxis1, xysplinerenderer);.setBackgroundPaint(Color.lightGray);.setDomainGridlinePaint(Color.white);.setRangeGridlinePaint(Color.white);.setAxisOffset(new RectangleInsets(4, 4, 4, 4));jfreechart = new JFreeChart("Сплайн", JFreeChart.DEFAULT_TITLE_FONT, xyplot, true);.applyCurrentTheme(jfreechart);chartPanel = new ChartPanel(jfreechart);.setContentPane(chartPanel);.pack();.setVisible(true);

}

}.javasplain;Jama.Matrix;java.awt.Color;java.awt.Dimension;java.io.*;java.text.NumberFormat;java.util.ArrayList;javax.swing.ImageIcon;javax.swing.JFrame;javax.swing.JOptionPane;org.jfree.chart.ChartPanel;org.jfree.chart.ChartUtilities;org.jfree.chart.JFreeChart;org.jfree.chart.axis.NumberAxis;org.jfree.chart.plot.XYPlot;org.jfree.chart.renderer.xy.XYSplineRenderer;org.jfree.data.xy.XYSeries;org.jfree.data.xy.XYSeriesCollection;org.jfree.ui.RectangleInsets;

/**

* SplineOpen

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class SplineOpen {spl;SplineOpen(Splain spl){.spl = spl;

}ArrayList<Double> coordSp;Matrix A;Matrix B;Matrix C;int b;int i;int j;PrintWriter out;double[] S, xSp, ySp;int l;double delta;java.io.File f;

/**

* create matrix A

*/Matrix InitializationA() {[][] M = new double[b][b];(i = 0; i < b; i++) {(j = 0; j < b; j++) {(i == j) {[i][j] = 4;

}((i - j) == 1) {[i][j] = 1;

}((j - i) == 1) {[i][j] = 1;

}((i - j) == b - 1) {[i][j] = 1;

}((j - i) == b - 1) {[i][j] = 1;

}

}

}new Matrix(M);

}

/*

* solve of spline

*/String Solve() {= new ArrayList<>();{in =BufferedReader(new FileReader(spl.choose)); line; ((line = in.readLine()) != null) { [] tmp = line.split(";");.add(Double.parseDouble(tmp[0])); .add(Double.parseDouble(tmp[1]));

}

} catch (IOException ex) {.getLocalizedMessage();.showMessageDialog(null, "I/O Error!");

} catch (NullPointerException e) {.showMessageDialog(null, "File not found!");

}jx = -1;jy = -1;= coordSp.size()/2;= new double[b];= new double[b];(i = 0; i<coordSp.size(); i++){.out.println(coordSp.get(i));

}(i = 0; i < coordSp.size(); i++) {((i % 2) == 0) {++;[jx] = coordSp.get(i);

} else {++;[jy] = coordSp.get(i);

}

}= InitializationA(); (A, "Matrix A.txt");= A.inverse(); (A, "Matrix inverse.txt"); = InitializationB();= B.timesEquals(6.0); (B, "Multiply.txt");= A.times(B);nameFileReturn = f + System.getProperty("file.separator") + "Matrix C.txt";[][] old = C.getArray(); [][] newC = new double[b+4][old[0].length];(i = 0; i < b; i++) {(j = 0; j < old[0].length; j++) {[i + 2][j] = old[i][j];

}

}(j = 0; j < old[0].length; j++) {[0][j] = newC[b][j];[1][j] = newC[b + 1][j];[b + 2][j] = newC[2][j];[b + 3][j] = newC[3][j];

}Cnew = new Matrix(newC);(Cnew, "Matrix C.txt");h = 1;= 0;[] z1 = new double[b];[] z2 = new double[b];[] z3 = new double[b];[] z4 = new double[b];q = 0; //индекс массивов z(i = 1; i < b + 1; i++) {[q] = (newC[i+2][j] + 4 * newC[i+1][j] + newC[i][j]) / 6;[q] = (newC[i+2][j] - newC[i][j]) / (2 * h);[q] = (newC[i+2][j] - 2 * newC[i+1][j] + newC[i][j]) / (2 * h * h);[q] = (newC[i+3][j]-3*newC[i+2][j]+3*newC[i+1][j]-newC[i][j])/(6*h*h*h);++;

}("Z1.txt", b, z1);("Z2.txt", b, z2);("Z3.txt", b, z3);("Z4.txt", b, z4);t;k;input = JOptionPane.showInputDialog("Скільки проміжних значень на кожному інтервалі Ви хочете взяти для обчислення сплайну?");= Integer.parseInt(input);= new double[b*(l+1)];= (xSp[2]-xSp[1])/l;(i=0; i<b; i++){(j = 0; j < l+1; j++){ = j * delta; = (l+1) * i +j; [k] = z1[i] + z2[i]*t + z3[i]*t*t + z4[i]*t*t*t;

}

}("S.txt", b*(l+1), S);();nameFileReturn;

}

/*

* инициализация массива-столба y

*/Matrix InitializationB() {[] N = new double[b];(i = 0; i < b; i++) {[i] = ySp[i];

}new Matrix(N, b);

}

/*

* input matrix in file

*/void PrintMatrix(Matrix mas, String name) {nf = NumberFormat.getInstance();= new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "SplineOpenMethod");.mkdir();{row = mas.getRowDimension();col = mas.getColumnDimension();= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(i = 0; i < row; i++) {(j = 0; j < col; j++) {.print(nf.format(mas.get(i, j)));.print(" ");

}.println();

}.flush();

} catch (IOException ex) {.getMessage();

}

}

/**

* print all masivs

*/void PrintMassiv(String name, int r, double[] a) {.io.File f = new java.io.File(System.getProperty("user.dir") + System.getProperty("file.separator") + "SplineOpenMethod");.mkdir();nf = NumberFormat.getInstance();{= new PrintWriter(new BufferedWriter(new FileWriter(f + System.getProperty("file.separator") + name)));(j = 0; j < r; j++) {.print(nf.format(a[j]));.println();

}.flush();

} catch (IOException ex) {.getMessage();

}

}void createGraphic(){frame = new JFrame("Графік сплайну на основі згладжених даних");.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);.setPreferredSize(new Dimension(682, 565));.setIconImage(new ImageIcon("src/graphics/graph.png").getImage());series = new XYSeries("Вхідні дані");series2 = new XYSeries("Отримані дані");[] t = new double[b*(l+1)];[0] = xSp[0];(i = 1; i < b*(l+1); i++) {[i] = t[i-1] + delta;

}(i = 0; i < b; i++) {.add(xSp[i], ySp[i]);

}(i = 0; i < b*(l+1); i++) {.add(t[i], S[i]);

}data = new XYSeriesCollection();.addSeries(series);.addSeries(series2);numberaxis = new NumberAxis("X");.setAutoRangeIncludesZero(false);numberaxis1 = new NumberAxis("Y");.setAutoRangeIncludesZero(false);xysplinerenderer = new XYSplineRenderer();xyplot = new XYPlot (data, numberaxis, numberaxis1, xysplinerenderer);.setBackgroundPaint(Color.lightGray);.setDomainGridlinePaint(Color.white);.setRangeGridlinePaint(Color.white);.setAxisOffset(new RectangleInsets(4, 4, 4, 4));jfreechart = new JFreeChart("Сплайн на основі згладжених даних", JFreeChart.DEFAULT_TITLE_FONT, xyplot, true);.applyCurrentTheme(jfreechart);chartPanel = new ChartPanel(jfreechart);.setContentPane(chartPanel);.pack();.setVisible(true);

}

}.javasplain;java.awt.Color;java.awt.Dimension;java.awt.GridLayout;java.awt.event.ActionEvent;java.awt.event.ActionListener;javax.swing.ImageIcon;javax.swing.JColorChooser;javax.swing.JFrame;

/**

* Method

*

* @version 1.1 30 May 2013

* @author Rimma Berdo

*/class Method extends javax.swing.JFrame {spl;Method(Splain spl) {();(new ImageIcon("src/graphics/graph.png").getImage());.spl = spl;

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code"> void initComponents() {= new javax.swing.ButtonGroup();= new javax.swing.JPanel();= new javax.swing.JLabel();= new javax.swing.JRadioButton();= new javax.swing.JRadioButton();= new javax.swing.JRadioButton();= new javax.swing.JSeparator();= new javax.swing.JLabel();= new javax.swing.JLabel();= new javax.swing.JTextField();= new javax.swing.JLabel();= new javax.swing.JTextField();= new javax.swing.JLabel();= new javax.swing.JTextField();= new javax.swing.JRadioButton();= new javax.swing.JLabel();= new javax.swing.JTextField();= new javax.swing.JMenuBar();= new javax.swing.JMenu();= new javax.swing.JMenuItem();= new javax.swing.JMenuItem();= new javax.swing.JMenu();= new javax.swing.JMenuItem();= new javax.swing.JMenuItem();(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

setTitle("Згладжування даних за допомогою сплайна: Вибір методу");

setPreferredSize(new java.awt.Dimension(682, 700));(new java.awt.event.WindowAdapter() {void windowClosed(java.awt.event.WindowEvent evt) {(evt);

}

});.setBackground(new java.awt.Color(153, 255, 153));.setPreferredSize(new java.awt.Dimension(682, 700));.setFont(new java.awt.Font("Cambria", 1, 18)); // NOI18N.setText("Оберіть метод згладжування даних");.setBackground(new java.awt.Color(153, 255, 153));.add(rbUpdate);.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("уточнений метод");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.setBackground(new java.awt.Color(153, 255, 153));.add(rbTriangle);.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("метод центра трикутника");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.setBackground(new java.awt.Color(153, 255, 153));.add(rbSpline);.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N

rbSpline.setText("за допомогою сплайна");

rbSpline.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.setForeground(new java.awt.Color(102, 102, 0));.setFont(new java.awt.Font("Cambria", 1, 18)); // NOI18N.setText("Отримані дані збережені у файлах");.setToolTipText("");.setFont(new java.awt.Font("Cambria", 2, 18)); // NOI18N

jLabel3.setText("Метод центра тикутника:");

triangleFile.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setDisabledTextColor(new java.awt.Color(51, 0, 102));.setEnabled(false);.setName("");.setFont(new java.awt.Font("Cambria", 2, 18)); // NOI18N.setText("Уточнений метод:");.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setDisabledTextColor(new java.awt.Color(51, 0, 102));.setEnabled(false);.setName("");.setFont(new java.awt.Font("Cambria", 2, 18)); // NOI18N.setText("Сплайн:");.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setDisabledTextColor(new java.awt.Color(51, 0, 102));.setEnabled(false);.setName("");.setBackground(new java.awt.Color(153, 255, 153));.add(rbSpline1);.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setText("<html>за допомогою сплайна використовуючи згладжені дані</html>");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {ActionPerformed(evt);

}

});.setFont(new java.awt.Font("Cambria", 2, 18)); // NOI18N

jLabel6.setText("Сплайн на основі згладжених даних:");

jLabel6.setToolTipText("");.setFont(new java.awt.Font("Cambria", 0, 18)); // NOI18N.setDisabledTextColor(new java.awt.Color(51, 0, 102));.setEnabled(false);.setName("");.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);.setLayout(jPanel1Layout);Layout.setHorizontalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(171, 171, 171)

.addComponent(jLabel1)

.addContainerGap())

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(47, 47, 47)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel6)

.addComponent(splineOpenFile1, javax.swing.GroupLayout.PREFERRED_SIZE, 583, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel4)

.addComponent(jLabel3)

.addComponent(jLabel5)

.addComponent(splineFile, javax.swing.GroupLayout.PREFERRED_SIZE, 583, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 583, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)

.addComponent(triangleFile, javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(updateFile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 583, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(136, 136, 136)

.addComponent(jLabel2))

.addGroup(jPanel1Layout.createSequentialGroup()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(rbUpdate)

.addComponent(rbTriangle))

.addGap(67, 67, 67)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(rbSpline)

.addComponent(rbSpline1, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE))))

.addGap(0, 27, Short.MAX_VALUE))

);Layout.setVerticalGroup(Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addGap(23, 23, 23)

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(rbSpline, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(rbTriangle))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(rbUpdate)

.addComponent(rbSpline1, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(18, 18, 18)

.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 11, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jLabel2)

.addGap(18, 18, 18)

.addComponent(jLabel3)

.addGap(18, 18, 18)

.addComponent(triangleFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(28, 28, 28)

.addComponent(jLabel4)

.addGap(18, 18, 18)

.addComponent(updateFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel5)

.addGap(18, 18, 18)

.addComponent(splineFile, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jLabel6)

.addGap(18, 18, 18)

.addComponent(splineOpenFile1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap(129, Short.MAX_VALUE))

);.setText("Файл");.setText("Змінити колір фону");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.add(itemColor);.setText("Вихід");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.add(itemExit);.add(menuFile);.setText("Довідка");.setText("Переглянути довідку");.add(itemShowHelp);.setText("Про програму");.addActionListener(new java.awt.event.ActionListener() {void actionPerformed(java.awt.event.ActionEvent evt) {(evt);

}

});.add(itemAbout);.add(menuHelp);(jMenuBar1);.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());().setLayout(layout);.setHorizontalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addGap(0, 0, Short.MAX_VALUE)

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

);.setVerticalGroup(.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addGap(0, 0, Short.MAX_VALUE)

.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))

);();

}// </editor-fold> void rbTriangleActionPerformed(java.awt.event.ActionEvent evt) {

spl.title = "Згладжування методом трикутника";

triangleFile.setText(spl.tr_m());.nonShowGr1();

} void rbUpdateActionPerformed(java.awt.event.ActionEvent evt) {

spl.title = "Згладжування уточненим методом";

updateFile.setText(spl.up_m());.nonShowGr1();

} void rbSplineActionPerformed(java.awt.event.ActionEvent evt) { .nonShowGr1();.setText(spl.spli());

} void formWindowClosed(java.awt.event.WindowEvent evt) { .exit(0);

} void itemExitActionPerformed(java.awt.event.ActionEvent evt) { .exit(0);

} void itemAboutActionPerformed(java.awt.event.ActionEvent evt) { .help();

} void itemColorActionPerformed(java.awt.event.ActionEvent evt) { colorFrame = new JFrame();.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);defaultColor = getBackground();selected = JColorChooser.showDialog(,

"Set background",);(selected != null) {.setBackground(selected);.setBackground(selected);.setBackground(selected);.setBackground(selected);.setBackground(selected);

}.setVisible(true);

} void rbSpline1ActionPerformed(java.awt.event.ActionEvent evt) { JFrame frame = new JFrame("Вибір файлу");.setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);.setPreferredSize(new Dimension(400, 200));.setIconImage(new ImageIcon("src/graphics/graph.png").getImage());.swing.ButtonGroup buttonGroup2 = new javax.swing.ButtonGroup();.swing.JRadioButton rbTr = new javax.swing.JRadioButton();.swing.JRadioButton rbUp = new javax.swing.JRadioButton();.swing.JLabel labRB = new javax.swing.JLabel();.swing.JPanel panelRB = new javax.swing.JPanel();.setBackground(new java.awt.Color(153, 255, 153));.setFont(new java.awt.Font("Cambria", 0, 18));

rbTr.setText("методом центра трикутника");

buttonGroup2.add(rbTr);.setBackground(new java.awt.Color(153, 255, 153));.setFont(new java.awt.Font("Cambria", 0, 18));.setText("уточненим методом");.add(rbUp);.setFont(new java.awt.Font("Cambria", 1, 18));.setText("<html>Оберіть згладжені яким методом дані використовувати для побудови сплайну</html>");.setBackground(new java.awt.Color(153, 255, 153));.setLayout(new GridLayout(3,1));.add(labRB);.add(rbTr);.add(rbUp);.addActionListener(new ActionListener() {

@Overridevoid actionPerformed(ActionEvent ae) {.choose = triangleFile.getText();.setVisible(false);.setText(spl.spli1());

}});.addActionListener(new ActionListener() {

@Overridevoid actionPerformed(ActionEvent ae) {.choose = updateFile.getText();.setVisible(false);.setText(spl.spli1());

}});.frameDisplayCenter(400, 200, frame);.add(panelRB);.setVisible(true);.pack();

} javax.swing.ButtonGroup buttonGroup1;javax.swing.JMenuItem itemAbout;javax.swing.JMenuItem itemColor;javax.swing.JMenuItem itemExit;javax.swing.JMenuItem itemShowHelp;javax.swing.JLabel jLabel1;javax.swing.JLabel jLabel2;javax.swing.JLabel jLabel3;javax.swing.JLabel jLabel4;javax.swing.JLabel jLabel5;javax.swing.JLabel jLabel6;javax.swing.JMenuBar jMenuBar1;javax.swing.JPanel jPanel1;javax.swing.JSeparator jSeparator1;javax.swing.JMenu menuFile;javax.swing.JMenu menuHelp;javax.swing.JRadioButton rbSpline;javax.swing.JRadioButton rbSpline1;javax.swing.JRadioButton rbTriangle;javax.swing.JRadioButton rbUpdate;javax.swing.JTextField splineFile;javax.swing.JTextField splineOpenFile1;javax.swing.JTextField triangleFile;javax.swing.JTextField updateFile;

}

Додаток Б

Відгук керівника

ВІДГУК

на дипломний проект бакалавра на тему:

"Розробка програми фільтрації шуму за допомогою сплайнів"

студентки групи ПІітС-11-1 Бердо Рімми Сергіївни

1. Ціль дипломного проекту - розробка програмного продукту фільтрації шуму за допомогою сплайнів.

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

3. Тема дипломного проекту безпосередньо повязана з об’єктом діяльності бакалавра напрямку 6.050103 "Програмна інженерія".

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

5. Оригінальність технічних рішень заключається в розробці програми фільтрації шумів за допомогою сплайнів з використанням мови програмування Java і її бібліотеки JAMA.

6. Практичне значення результатів роботи заключається у підвищенні ефективності первинної обробки даних.

7. Оформлення матеріалов дипломного проекту виконано на сучасному рівні і відповідає вимогам, що пред’являються до робіт даної кваліфікації.

8. Степінь самостійності виконання дипломного проекту достатня.

9. Даний дипломний проект в цілому заслуговує оцінки "відмінно".

Додаток В

Рецензія

на дипломний проект бакалавра на тему:

"Розробка програми фільтрації шуму за допомогою сплайнів"

студентки групи ПІітС-11-1 Бердо Рімми Сергіївни

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

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

Використовувані технології розробки системи обробки інформації напряму повязані з об’єктом діяльності бакалавра напрямку 6.050103 "Програмна інженерія".

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

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

Степінь проробки компонентів даного проекту дозволяє оцінити роботу Р.С. Бердо на "відмінно".

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!