Знаходження функції методом найменших квадратів

Графічне представлення апроксимації. Принципи, завдання та використання методу найменших квадратів. Написання програми, що містить у собі хід аналізу даного методу. Апроксимація як наближене вираження одних математичних об'єктів іншими, простішими.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 22.06.2012
Размер файла 146,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Курсова робота

З програмування

На тему:

«Знаходження функції методом найменших квадратів»

Зміст

  • 1.Постановка задачі
  • 2.Математична модель
  • 3.Короткий алгоритм задачі
  • 4.Программа
  • 5.Результати розрахунку
  • Висновок
  • Список використаної літератури

1. Постановка задачі

Аналітичний опис результатів 9 експериментів, у кожному з яких на вхід системи подається значення параметра Х, а на виході реєструється реакція У.

1.Вибрати вид функції.

2. Методом найменших квадратів знайти параметри вибраної залежності.

3. Обчислити коефіцієнт детермінації та записати висновки.

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

Вхідні дані:

Номер

Вар. 10

X1

Y1

X2

Y2

X3

Y3

X4

Y4

X5

Y5

X6

Y6

X7

Y7

X8

Y8

X9

Y9

Х

1

2

3

4

5

6

7

8

9

У

2.4

2.9

3.6

4.2

5.1

5.8

6.3

7.8

9.5

2. Математична модель

У будь-якій діяльності часто виникає необхідність описати у вигляді функціональної залежності зв'язок між величинами, заданими табличний або у вигляді набору точок з координатами (xi, yi), i=0,1,2,..n, де n - загальна кількість точок. Як правило, ці табличні дані отримані експериментально і мають погрішності. При апроксимації бажано отримати відносно просту функціональну залежність, яка дозволила б "згладити" експериментальні погрішності, набути проміжних і екстраполяційних значень функцій, що спочатку не містяться в початковій табличній.

Рис 1. Графічне представлення апроксимації

Ця функціональна залежність повинна з достатньою точністю відповідати початковій табличній залежності. Критерієм точності можуть служити декілька умов. Виходячи з постановки завдання, має місце апроксимація, набутих досвідченим шляхом значень, рівнянням, загальний вигляд якого заданий y=a*x+b .У цьому рівнянні є дві константи a і b:

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

Потрібно зазначити,що:

1)Коефіцієнт а характеризує точку перетину прямої регресії з лінією координат.

2)Коефіцієнт b характеризує кут нахилу цієї прямої до осі абсцис, а також на яку величину зміниться при зміні х на одиницю.

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

(1)

у якому сума квадратів відхилень експериментальних даних буде буде мінімальною. Його ще називають рівнянням регресії.

Аналітично ця умова виглядає так:

(2)

Вид функції (2) можна вибрати або з характеру вхідних даних, або аналітичний вид рівняння може бути заданий спочатку. Вважатимемо, що вид функції (1) нам якимсь чином вдалося встановити. Далі необхідно визначити невідомі коефіцієнти a і b. Коефіцієнти знаходимо з того, що задовольняючи рівнянню (2) коефіцієнти повинні забезпечити мінімальність функції. Перед нами встає завдання - екстремум функції декількох змінних. Необхідною умовою екстремуму функції є:

(3)

Отримаємо систему рівнянь,використовуючи правила диференціювання та підставивши вираження разом функції:

(4)

де, частні похідні функції (2)

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

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

хср

уср

Вигляд функції

1

х(ар)

у(ар)

у=ах+b

2

х(геом)

у(ар)

у=b+alnx

3

х(гарм)

у(ар)

y=b+a/x

4

х(ар)

у(гарм)

y=bax

5

х(геом)

у(гарм)

y=bxa

6

х(гарм)

у(гарм)

y=exp(b+a/x)

7

х(ар)

у(гарм)

y=1/(b+ax)

8

х(геом)

у(гарм)

y=1/(b+alnx)

9

х(гарм)

у(гарм)

y=x/(b+ax)

У нас дано 9 вхідних даних Х та У,згідно даній таблиці нам необхідно обчислити всі хср і уср -середні значення,а а саме: арифметичні,геометричні та гармонічні. Далі будемо обчислювати величину у^,а потім безпосередньо будемо шукати значення модуля.

Завдяки пошуку мінімального значення виразу

(5)

і відповідної йому функції - буде встановлюватися рівняння регресії. З якого згодом отримаємо коефіцієнти a і b.

Знайдені числа та вхідні дані Х ми будемо вставляти в рівняння нашої регресії та зможемо отримати нові значення У. І в кінці з вхідних даних Х та нових,обчислених У побудуємо графік. А також будемо вираховувати коефіцієнт детермінації:

, (6)

де yi -дані вхідні У,

fi-знайдені нові У,

ycp-середні значення У.

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

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

Якщо він приймає значення від 0,1 до 0,3, о зв'язок слабкий,якщо 0,3-0,5- сила зв'язку помірна, 0,5-0,7- помітна сила зв'язку, 0,7-0,9 -зв'язок має високу силу, якщо ж коефіцієнт приймає значення від 0,9 до 0,99, то сила зв'язку дуже висока.

Функціональний зв'язок виникає при значенні рівному 1, а відсутність зв'язку - 0. При значеннях показників тісноти зв'язки менше 0,7 величина коефіцієнта детермінації завжди буде нижче 50%. Це означає, що на частку варіації факторних ознак доводиться менша частина в порівнянні з іншими неврахованими в моделі факторами, що впливають на зміну результативного показника. Побудовані за таких умов регресійні моделі мають низьке практичне значення.

Тобто,поступово будемо заповнювати таблицю. Необхідно обчислити середні значення за такими формулами:

х(ар)= (7) у(ар)=

х(геом)= (8) у(геом)=

х(гарм)= (9) у(гарм)=

Потім вираховуємо величину у^.Її обчислюємо так:

Якщо якесь із наших середніх значень Х збігається із будь-яким вхідним Хі,і=1,..,n, то у^=уі. Або якщо лежить на відрізку між Хі і Хі+1, і=1,..,n. ,то проводимо обчислення за такою формулою :

(10)

Обчислюємо даний модуль і отримуємо такі результати:

Пор. №

x

y

хср

уср

y^

Вигляд функції

1

1

2,4

5

5,288889

5,1

0,037037

у=ах+b

2

2

2,9

4,147166

5,288889

4,2

0,259259

у=b+alnx

3

3

3,6

3,181372

5,288889

3,6

0,469136

y=b+a/x

4

4

4,2

5

4,838403

5,1

0,051294

y=bax

5

5

5,1

4,147166

4,838403

4,2

0,152001

y=bxa

6

6

5,8

3,181372

4,838403

3,6

0,344001

y=exp(b+a/x)

7

7

6,3

5

4,415969

5,1

0,134124

y=1/(b+ax)

8

8

7,8

4,147166

4,415969

4,2

0,051421

y=1/(b+alnx)

9

9

9,5

3,181372

4,415969

3,6

0,226658

y=x/(b+ax)

Отже мінімум досягається при N=1.

А отже,функція виду у=ах+b найкраще описує результати експерименту.

Тепер нам необхідно вирахувати коефіцієнти a і b.

Вони визначаються з необхідної умови екстремуму функції

В результаті отримаємо систему рівнянь:

Розв'язуємо її.

(11)

(12)

Підставляємо вираз (12) у друге рівняння системи (11) отримаємо вираз для a , маємо

(13)

Після визначення усіх констант ми отримає функцію, яка апроксимує вхідні дані. Підставляємо їх та вхідні дані Х у наше знайдене рівняння та отримуємо нові значення У.Отже ,коефіцієнти мають наступні значення:

а= 1,0109 b= 0,2345

yn

1,2454

2,2563

3,2672

4,2781

5,289

6,2999

7,3108

8,3217

9,3326

Тепер обчислюємо коефіцієнт детермінації.

R2=0.9201

Коефіцієнт детермінації дорівнює 0.9201

А це означає,що найкраще описує результати експерименту функція:

у=1,0109*х+0,2345

Результати обчислень проілюстровані на графіку.

3. Короткий алгоритм завдання

На початку роботи, програма прочитує дані з вхідного файлу input.txt, після цього програма обчислює значення та коефіцієнти по формулах (7),(8),(9),(10),(5),(12),(13),(6).

Результати, обчислюються за таким ланцюгом:

початок зчитування даних з файлу input.txt обчислення даних

обчислення коефіцієнтів а та b отримання значень обчисленої функції

обчислення коефіцієнта детермінаціїкінець програми.

4. Программа

#include<stdio.h>

#include <conio.h>

#include<math.h>

#define N 9

#define EPS 0.15

double x[N],y[N],ymod[N],y_[N],yn[N]; /*Опис масивів відповідного типу*/

int i;

double xAr,xGr,xGeom,yAr,yGr,yGeom,yAr_,yGr_,yGeom_; /*Опис змінних відповідного типу*/

FILE *in; /*Функція відкриття потоку in - прописуємо його шоблон*/

double getAr (double z[], int n ) /*Функція для обчислення середніх арифметичних значень*/

{

int i ;

double res = 0.0;

for ( i = 0; i < n; i++) /*циклом проходимо по масиву і підраховуемо суму елементів*/

{

res = res + z[i];

}

res = (double)res / n; /*одержану суму ділимо на кількість елементів*/

return res; /*повернаемо значення результату*/

}

double getGr (double z[],int n) /*Функція для обчислення середнього гармонічного значення*/

{

int i;

double rez=0.0;

for(i=0;i<n;i++) /*Проходимо по циклу та підраховуємо суму обернених значень масивів*/

{

rez=rez + 1./z[i];

}

rez=n/rez; /*Кількість елементів ділимо на отриману суму*/

return rez; /*повертаємо отриманий результат*/

}

double getGeom (double z[], int n) /*Функція для обчислення середнього геометричного значення*/

{

int i;

double rez = 1.0;

for(i=0;i<n;i++)/*циклом проходимо по масиву та обчислюємо добуток всіх елементів масиву*/

{

rez =rez*z[i];

}

rez =pow(rez,1./9.); /*отриманий добуток підносимо до степені 1/9 */

return rez; /*повертаемо отриманий результат*/

}

double get_Y(double x[],double y[],int n, double sr) /*Функція длля обчислення значення у^*/

{

int i;

double res;

for(i=0;i<n;i++)

{ /*перевіряємо,чи збігається х ср. та вхідне значення х */

if ( (fabs(sr-x[i])) < EPS ) /*якщо вираз по модулю менше якогось малого числа то повертаємо

відповідне значення у*/

return y[i];

}

for(i=0;i<n;i++)

{

if ( sr > x[i] && sr < x[i+1] ) /*якщо х ср. знаходиться між відповідним йому та наступному х-ами*/

{

res =(((sr - x[i])/(x[i+1]-x[i])) * (y[i+1]-y[i]) +y[i]);/*то проводимо вирахування за такою формулою*/

return res; /*повертаємо результат*/

}

}

return EPS ;

}

void main() /*головна функція програми*/

{

clrscr(); /*функція очистки екрану*/

in=fopen("input.txt","r"); /*відкриття файлу input.txt для отримання вхідних даних х та у*/

for(i=0;i<N;i++)

fscanf(in,"%lf %lf",&x[i],&y[i]); /*зчитуємо з фійла значення х та у*/

fclose(in); /*закриваємо потік*/

xAr=getAr(x,N); /*звертання до функцій та присвоення їх значень відповідним змінним*/

xGr=getGr(x,N);

xGeom=getGeom(x,N);

yAr=getAr(y,N);

yGr=getGr(y,N);

yGeom=getGeom(y,N);

printf("xAr =%.4lf\n ",xAr); /*роздрукавування присвоєних значень*/

printf("xGr =%.4lf \n",xGr);

printf("xGeom =%.4lf \n",xGeom);

printf("yAr =%.4lf \n ",yAr);

printf("yGr =%.4lf \n",yGr);

printf("yGeom =%.4lf \n",yGeom);

yAr_ = get_Y(x,y,N,xAr); /*Звертання до відповідних функцій*/

yGr_ = get_Y(x,y,N,xGr);

yGeom_ = get_Y(x,y,N,xGeom);

y_[0] = y_[3]= y_[6]= yAr_; /*заповнюемо масив у_ отриманими значеннями */

y_[1] =y_[4] =y_[7] =yGeom_;

y_[2] =y_[5] = y_[8] =yGr_;

ymod[0] = fabs((yAr-yAr_)/yAr_); /*заповнюємо масив уmod нашими значеннями,які обчислюються*/

ymod[1] = fabs((yAr-yGeom_)/yGeom_);

ymod[2] = fabs((yAr-yGr_)/yGr_);

ymod[3] = fabs((yGeom-yAr_)/yAr_);

ymod[4] = fabs((yGeom-yGeom_)/yGeom_);

ymod[5] = fabs((yGeom-yGr_)/yGr_);

ymod[6] = fabs((yGr-yAr_)/yAr_);

ymod[7] = fabs((yGr-yGeom_)/yGeom_);

ymod[8] = fabs((yGr-yGr_)/yGr_);

printf("N\t y^\t modul\n");

for(i=0;i<N;i++) /*проходимо по циклу заповнених масивів уmod і у_ та друкуємо № та їх вирахувані значення*/

printf("%d\t%.4lf\t%.4lf\n",i+1,y_[i],ymod[i]);

double min=ymod[0]; /* проводимо пошук у масиві уmod мінімального значення та друкуємо його*/

int z;

z = 0;

for(i=0;i<N;i++)

{

if(ymod[i]<min)

{

min=ymod[i];

z=i;

}

}

printf("min pru N =%d\n",z+1);

printf("Fynksia vida y=b+a*x; \n");

double a,b,s1=0,s2=0,s3=0,s4=0,chisl,znam; /*робимо вираховування всіх необхідних значень

для обчислення коеф. a і b*/

for ( i = 0 ; i < N ; i++)

{

s1 = s1 + x[i]*y[i]; /*Обчислення першої суми добутків х на у та присвоюємо їхнє значення змінній s1*/

s2 = s2 + x[i]; /*обчислення суми х та присвоєння їхнього значення змінній s2*/

s3 = s3 + y[i]; /*обчислення суми у та присвоєння їхнього значення змінній s3*/

s4=s2*s3; /*обчислення добутку отриманих констант s2 на s3 та присвоення їхнього значення змінній s4*/

}

chisl = s1 - ((1/N)*s4); /*по отриманих константах вираховуємо значення чисельника нашого дробу для отримання коеф.а*/

s1 = 0; s2 = 0;s3=0;

for ( i = 0 ; i < N ; i++) /*обчислення всіх виразів у знаменнику для отримання коеф. а*/

{

s1 = s1 + x[i]*x[i]; /*підрахування 1-ого виразу*/

s2 = s2 + x[i];

s3=s2*s2;

}

s2 = s3*(1/N); /*підрахування 2-ого виразу*/

znam = s1 - s2; /*обчислення знаменника дробу*/

a = chisl / znam; /*обчислення коеф.а*/

s1 = 0; s2 = 0; /*обчислення всіх виразів для знаходження коеф. b*/

for ( i = 0 ;i < N;i++)

{

s1 = s1 +y[i]; /*знаходження суми у*/

s2 = s2 + x[i]; /*знаходження суми х*/

}

s1 = s1 / N; /*підрахування 1-ого виразу*/

s2 = s2*(a/N); /*підрахування 2-ого виразу*/

b = s1-s2; /*обчислення коеф. b*/

printf("a=%.4lf\tb=%.4lf\n",a,b);/*роздруковуємо на екран отримані значення коефіціентів a і b*/

printf("Otrumanui yn \n");

for ( i = 0; i < N; i++) /*шляхом підстановки наших коеф. та значень Х, в конкретне

рівняння обчислюємо нові у*/

{

yn[i] =b+(a*x[i]); /*наше рівняння, яке обчислюється*/

printf(" %.4lf\n",yn[i]); /*друкуємо нові у*/

}

double r2 = 0,zn=0,ch=0; /*обчислюємо коефіціент детермінації*/

for ( i = 0; i < N;i++)

{

ch = ch + pow((y[i]-yn[i]),2); /*вираховуємо значення чисельника нашого дробу*/

zn = zn + pow((y[i]-yAr),2); /*вираховуємо значення знаменника нашого дробу*/

}

r2 = 1.0 - (ch/zn); /*вираховуємо значення нашого виразу*/

printf("R2 = %.4lf",r2); /*друкуємо його результат*/

}

5. Результати розрахунку

xAr =5.0000

xGr =3.1814

xAr =5.0000

xGr =3.1814

xGeom =4.1472

yAr =5.2889

yGr =4.4160

yGeom =4.8384

N y^ modul

1 5.1000 0.0370

2 4.2000 0.2593

3 3.7088 0.4260

4 5.1000 0.0513

5 4.2000 0.1520

6 3.7088 0.3046

7 5.1000 0.1341

8 4.2000 0.0514

9 3.7088 0.1907

min pru N =1

Fynksia vida y=b+a*x

a=1.0109 b=0.2345

Otrumanui yn

1.2454

2.2563

3.2671

4.2780

5.2889

6.2998

7.3106

8.3215

9.3324

R2 = 0.9201

Висновок

В ході виконання даної курсової роботи ми розглянули основні принципи,завдання та використання методу найменших квадратів. Написали програму, що описує та містить у собі хід аналізу даного методу. А отримані результати ілюструють собою той факт,що вид функції обраної як базової , дає гарні апроксимаційні результати. Варто зазначити, що апроксимація - наближене вираження одних математичних об'єктів іншими, простішими. Цей факт підтверджується тим, що розрахований коефіцієнт кореляції R2 = 0.9201 близький до 1,що підтверджує силу зв'язку між об'єктами.

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

1.Назаренко А.М.Економетрика.Навчальний посібник.-Суми:Вид-цво СумДУ,2003.с.40.

2.Замкова О.О., Толстопятенко А.В., Черемных Ю.Н. Математические методы в экономике: Учебник.-М.: МГУ им. М.В.Ломоносова, Изд-во “ДИС”, 1997.- С.245-268.

3.Методичні вказівки до виконаня та оформлення контрольної роботі з дисципліни «Чисельні методи» та «Обчислювальна математика»для студетів заочної формі навчання.-Суми.Вид-цтво:СумДУ,2007.с.29-35.

4.Бочков С.О., Субботин Д.М. Язык программирования СИ для персонального компьютера/ Под общ. ред. П.И.Садчикова. - М.: Радио и связь, 1990. - 384 с.

5. Шпак З.Я. Програмування мовою С: Навчальний посібник. - Львів: Оріяна-Нова, 2006. - 432 с.

Размещено на Allbest.ru


Подобные документы

  • Характеристика середовища програмування Microsoft Visual C++ та бібліотеки класів MFC. Знаходження коефіцієнтів при невідомих за допомогою методу найменших квадратів. Створення програми для вирішення задачі обраним методом, її алгоритм та інтерфейс.

    курсовая работа [434,8 K], добавлен 20.01.2014

  • Загальні відомості про С++ Builder. Метод найменших квадратів. Побудова лінійної емпіричної формули. Робота з базою даних MSql засобами PHP. Розрив з’єднання з сервером. Екранування спец-символів. Знаходження функції за методом найменших квадратів.

    курсовая работа [1,4 M], добавлен 11.12.2012

  • Вибір емпіричної формули. Метод оберненої матриці. Розв’язування систем лінійних рівнянь на ПК. Вибір двох апроксимуючих функцій. Розрахунки у середовищі MS Excel для лінійної функції, для квадратичної функції та у середовищі MS Visual Studio (мовою С#).

    курсовая работа [658,8 K], добавлен 18.08.2014

  • Дослідження динамічних рядів методом найменших квадратів та ковзаючого середнього. Опис логічної структури програми. Стандартні методи та елементи середовища програмування Borland Delphi 2007. Опис функцій складових частин програми і зв'язків між ними.

    курсовая работа [135,3 K], добавлен 01.04.2016

  • Ортогонaлізування функцій. Порівняння дискретного та хвильового перетворення. Інтерполяційні поліноми Лагранжа і Ньютона. Метод найменших квадратів. Побудова кривої для заданих результатів вимірювань. Розв’язання задачі по Лапласу операційним методом.

    курсовая работа [2,2 M], добавлен 10.04.2012

  • Приклад реалізації крок за кроком методу сортування масивів "бульбашка", характеристика етапів. Графічне представлення методу, фрагмент програми його реалізації. Алгоритми сортування масивів методами вибору та вставок, опис особливостей їх реалізації.

    презентация [824,2 K], добавлен 26.11.2014

  • Реалізація інтерполяції поліномами за методами найменших квадратів і Лагранжа в Matlab. Наближення даних сплайном нульового порядку. Диференціювання полінома. Геометричний зміст похідної. Чисельне інтегрування функцій. Розв’язування диференційних рівнянь.

    контрольная работа [285,3 K], добавлен 01.06.2015

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

    курсовая работа [184,4 K], добавлен 17.04.2011

  • Знаходження площі фігури методом трапеції. Обчислення площ криволінійних трапецій. Геометричний сенс чисельника. Розробка програми для демонстрації нижчезазначеної математичної функції. Використання базових бібліотек класів, написаних на мові С++.

    курсовая работа [1,0 M], добавлен 24.12.2013

  • Графічне зображення методу половинного ділення. Вибір методу інструментальних засобів вирішення задач. Розробка логічної частини програми для розв’язання нелінійного рівняння методами половинного ділення та січних. Особливість кодування на мові Паскаль.

    курсовая работа [135,5 K], добавлен 30.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.