Курсовая работа по информатике

Чикина Елена Юрьевна
  1. Цель работы

Данная работа предназначена для закрепления учебного материала, изученного по курсу “Информатика и программирование”.

Практическое выполнение курсовой работы предполагает решение типовых инженерных задач обработки данных с использованием методов матричной алгебры, решение систем линейных алгебраических уравнений.

Цель курсового проекта – практическое освоение методов вычисления прикладной математики, совершенствования навыков разработки алгоритмов и построения программ на языке высокого уровня; использования принципов модульного программирования и совершенствования техники использования подпрограмм закрепления знаний по программированию на языке С.

Кроме указанного, курсовая работа предназначена для приобретения навыков по оформлению документации на программные среды.

 

Скачать:

ВложениеРазмер
Файл kursovaya_rabota_po_informatike.docx705.08 КБ

Предварительный просмотр:

Содержание

1.        Цель работы        3

2.        Методические указания        3

2.1.        Методические рекомендации по аппроксимации методом наименьших квадратов        3

2.1.1.        Постановка задачи        3

2.2.        Методика выбора аппроксимирующей функции        4

2.3.        Общая методика решения        5

2.4.        Методика решений нормальных уравнений        6

2.4.1.        Методика вычислений методом Обратной матрицы        6

2.5.        Оценка погрешности аппроксимации        8

3.        Ручной счет        9

4.        Схема алгоритма        11

5.        Код программы        14

6.        Результаты машинного счета        19

7.        Вывод        19


  1. Цель работы

Данная работа предназначена для закрепления учебного материала, изученного по курсу “Информатика и программирование”.

Практическое выполнение курсовой работы предполагает решение типовых инженерных задач обработки данных с использованием методов матричной алгебры, решение систем линейных алгебраических уравнений.

Цель курсового проекта – практическое освоение методов вычисления прикладной математики, совершенствования навыков разработки алгоритмов и построения программ на языке высокого уровня; использования принципов модульного программирования и совершенствования техники использования подпрограмм закрепления знаний по программированию на языке С.

Кроме указанного, курсовая работа предназначена для приобретения навыков по оформлению документации на программные среды.

  1. Методические указания
  1. Методические рекомендации по аппроксимации методом наименьших квадратов
  1. Постановка задачи

Пусть проводится ряд измерений, цель которых – исследование зависимости некоторой физической величины от другой физической величины X.

Предполагается, что величины и связаны функциональной зависимостью. Вид этой зависимости требуется определить исходя из результатов измерений, причем число этих измерений n невелико (табл. 1.1).

                                                        Таблица 1.1

i

1

2

3

n

x1

x2

x3

y1

y2

y3

В табл. 1.1:– номер измерения, – значение аргумента, – значение функции (= 1, …,n). По данным таблицы можно построить график зависимости от (рис. 1.1)На графике отдельные точки соответствуют значениям в точках (= 1,...,n).

Рис.1.1. Задание Y на дискретном множестве значений Х

Пусть из теоретических или иных соображений (например, по графику) выбран вид аппроксимирующей функции (x). Эта функция в качестве параметров помимо содержит еще ряд числовых параметров ,…,. Требуется определить такие значения этих параметров (,…,), чтобы кривая y=φ(x,,…,) наилучшим образом аппроксимировала зависимость, полученную экспериментальным путем.

Наиболее применимым на практике для решения таких задач является метод наименьших квадратов (МНК), при котором требование согласования кривой y =φ(x) и экспериментальных точек сводится к тому, чтобы сумма квадратов отклонений (δi) значений  от значений аппроксимирующей

функции в соответствующих точках φ () (= 1, …,n) обращалась в минимум (рис. 1.1).

(1.1)

Запишем требование МНК аналитически

Выражение (1.1) определяет критерий выбора аппроксимирующей функции.

  1. Методика выбора аппроксимирующей функции

Аппроксимирующую функцию φ(x), имеющую вид

 ϕ(x) =ϕ(x, ,…,),                                                                (1.2)

 выбирают из некоторого семейства функций, для которого задан вид функции, но неизвестны и подлежат определению ее параметры ,…,. Определение аппроксимирующей функции φ(x) подразделяется на два основных этапа:

−подбор подходящего вида функции φ(х);

−нахождение параметров функции φ(х) в соответствии с критерием МНК.

Уравнения

)                                                                  (1.4)

 используемые в МНК, называются нормальными, поэтому описываемый способ решения задачи будем называть методом нормальных уравнений.

Структура этих уравнений получается более простой в том случае, когда аппроксимирующая функция ϕ(x) выбирается линейной функцией искомых параметров, и выражение (2.2) имеет вид:

где – определяемые параметры; ϕ1(x), ϕ2(x), …, ϕm(x) – система линейно-независимых функций, называемых в курсовой работе базисными функциями.

В этом случае, подставляя (1.3) в выражение (1.1) и выполняя дифференцирование в соответствии с (1.4), получим систему уравнений относительно искомых.

(1.6)

Применим операцию дифференцирования (1.4) к параметру, и, выполняя необходимые алгебраические преобразования, получим уравнение:

Аналогичные уравнения можно получить, применяя описанные выше действия по отношению к переменным ,…,. Эти уравнения образуют систему нормальных уравнений:

                                           (1.7)

где коэффициенты и величины (k, l = 1, 2,…, m) определяются выражениями:

(1.8)

  1. Общая методика решения

Уравнения (1.7) представляют собой систему линейных алгебраических уравнений, где квадратная матрица A называется матрицей системы, вектор C - вектором-столбцом неизвестных системы, а вектор B - вектором-столбцом свободных членов.

 

(1.9)

Решение системы линейных уравнений сводится к отысканию значений элементов вектора-столбца С, называемых корнями системы. для получения единственного решения системы, входящие в нее m уравнений должны быть линейно независимыми. необходимым и достаточным условием этого является неравенство нулю определителя данной системы, то есть detA ≠ 0.

  1. Методика решений нормальных уравнений
  1. Методика вычислений методом Обратной матрицы

Один из методов решения системы линейных алгебраических уравнений (1.7), записываемой в матричной форме, связан с использованием обратной матрицы

В этом случае решение системы уравнений получается в виде

         (2.1)

где  - матрица, определяемая следующим образом. Пусть А - квадратная матрица размером  c ненулевым определителем det A ≠ 0. Тогда существует обратная матрица          (2.2)

  |A|== +…+=

= ,            (2.3)

A=     , (2.4)

Миноры находим следующим образом:
 

 

                             …

 ,       (2.5)

Теперь транспонируем полученную матрицу А :

 , (2.5)

После нахождения  , находим  по формуле (2.2)

Вычислив матрицу , находим матрицу коэффициентов С в соответствии с (2.1).

  1. Оценка погрешности аппроксимации

Результатом этапа решения системы нормальных уравнений (2.1) является получение значений параметров аппроксимирующей функции (1.2) для заданного набора базисных аппроксимирующих функций

+ (2.6)

,….,

Решение () системы нормальных уравнений определяет значения параметров, при которых критерий качества аппроксимации J принимает минимально возможное значение При всех других допустимых значениях параметров величина критерия будет больше. тем самым полученное значение может быть принято за характеристику эффективности аппроксимации заданной функциональной зависимости функциями выбранного класса. При изменении класса аппроксимирующих функций, а также при изменении набора базисных функций значение может меняться. Сравнение различных классов функций по их эффективности (качеству) аппроксимации может осуществляться на основе сравнений соответствующих значений.

Для количественной оценки погрешности аппроксимации может использоваться также величина (Δ) максимального отклонения исходной функциональной зависимости от найденной аппроксимирующей. Для этого определяется отклонение во всех заданных точках и определяется максимальное из этих отклонений:

(2.7)

  1. Ручной счет
  1.  Исходные данные


в-та

1

2

3

4

5

Метод решения СЛАУ

0,52

0,79

1,05

1,57

2,08

3sin(x)

1

sin(2x)

Обратной матрицы

0,35

0,79

1,4

3,14

5,58

Выражение для аппроксимирующей функции будет иметь следующий вид:

Выражение для аппроксимирующей функции и в соответствии с условиями локального минимума функции найдем частные производные и приравняем их к нулю:

Приведем полученную систему уравнений к нормальному виду, перенеся свободные члены вправо и поделив обе части уравнений на 2:

Для удобства представим промежуточные результаты вычислений в соответствии с (3.1) в табл.3.2. Используя значения из табл. 3.2, запишем систему уравнений (3.1) в окончательном виде:

x

y

Y*3sin(x)

9*sin^2(x)

3sin(x)

3sin(x)*sin(2x)

sin(2x)

y*sin(2x)

sin^2(2x)

0,52

0,35

0,522

2,222

1,491

1,286

0,862

0,302

0,744

0,79

0,79

1,684

4,541

2,131

2,131

1,000

0,790

1,000

1,05

1,4

3,643

6,772

2,602

2,246

0,863

1,208

0,745

1,57

3,14

9,420

9,000

3,000

0,005

0,002

0,005

0,000

2,08

5,58

14,616

6,861

2,619

-2,230

-0,851

-4,750

0,725

6,01

11,26

29,885

29,396

11,843

3,438

1,876

-2,445

3,213

Таблица(3.2)

29,396*C1+11,843*C2+3,438*C3=29,885
11,843*C
1+5*C2+1,876*C3=11,26

3,438*C1+1,876*C2+3,213*C3= -2,445

        

Полученную систему уравнений решаем методом обратной матрицы. Находим определитель матрицы
 Находим миноры матрицы А. Находим транспонированную матрицу. Находим обратную матрицу , рассчитываем коэффициенты С:

A=, C=, B=

=

C==

   2.5 Оценка погрешности аппроксимации.

Рассчитаем по формуле (1.6) значения аппроксимирующей функции взаданных точках  (i=C1,C2…,C5) и соответствующие отклонения δ (табл. 3.3). В соответствии с табл. 3.3 построим графики исходной и аппроксимирующей функций (рис. 3.1).

Таблица(3.3)

Значения аппроксимирующей функции

Значения отклонений

0,564

0,214

0,599

0,191

1,202

0,198

3,522

0,382

5,374

0,206

        

        Исходная аппроксимирующая функция:

ϕ(x)=С1*3sin(x)+C2+C3*sin(2x)

Искомая аппроксимирующая функция:

ϕ(x)=0,575*3sin(x)+1,800-2,428*sin(2x)


Рис.3.1. График исходной и аппроксимирующей функции


  1. Схема алгоритмаhttps://pp.vk.me/c628016/v628016885/6191/PBqeaZbmb14.jpg

Начало

i

i

Начало

                                                                Нет

                                        Да

j

i

https://pp.vk.me/c628016/v628016885/6198/YymH-TfX1bE.jpg

Конец


https://pp.vk.me/c628016/v628016885/61a0/Pj7EjLlGs6s.jpg

i

k

Начало

Начало

Начало

        

l

Конец

j

https://pp.vk.me/c628016/v628016885/61a8/vjS37HkgeHU.jpg

j

k

l

l

i

i

Конец

Конец


https://pp.vk.me/c628016/v628016885/61b0/kfBJddXofdg.jpg

Начало

Начало

k

i

l

Конец

i

Конец

https://pp.vk.me/c628016/v628016885/61b8/NO7mavBt7pg.jpg

Начало

i

Начало

                                Даhttps://pp.vk.me/c628016/v628016885/61c0/9QorWQqNkww.jpg

        Нет 

                                Да

Нет


  1. Код программы

#include

#include

#include

#include

#define n 5

#define m 3

 

void vvod(float E[n])

{

    for(int i=0;i

    {

     scanf("%f",&E[i]);

    }  

    printf("\n");

}

float  Fl(int i, float f)

{

      if (i==0)

         return 3sin(f);

      if (i==1)

         return 1;

      if (i==2)

         return sin(2x);

 else return 0;

}

void koeff(float A[(m)][(m)],float X[n],float Y[n],float B[(m)])

{

    for(int k=0;k

    {

            B[k]=0;

            for(int i=0;i

            {

             B[k]=B[k]+Y[i]*Fl(k,X[i]);

            }

        for(int l=0;l

        {

            A[k][l]=0;  

            for(int i=0;i

            {              

                A[k][l]=A[k][l]+Fl(k,X[i])*Fl(l,X[i]);

                               

            }

        }      

    }  

}

 

void prguss(float A[m][m],float B[m],float E[m][m])

{    float Q;

    for(int i=0;i<=(m-2);i++)

    {

        for(int l=(i+1);l<=(m-1);l++)

        {

            Q=A[l][i]/A[i][i];

            A[l][i]=0;

             

            for(int j=(i+1);j

            {      

                A[l][j]=A[l][j]-Q*A[i][j];

            }

            for(int k=0;k

            {

                E[l][k]=E[l][k]-Q*E[i][k];

            }

        }  

    }  

}

 

void obguss(float A[m][m],float R[m][m],float E[m][m],float B[m],float C[m])

{

    float Sum;

    for(int k=0;k

    {  

        for(int l=0;l

        {

            R[k][l]=E[k][l]/A[k][k];

        }

    }

     

    for(int i=(m-2);i>=0;i--)

    {

        for(int l=0;l

        {  

            Sum=E[i][l];

            for(int j=i+1;j

            {

                Sum=Sum-A[i][j]*R[j][l];

            }

            R[i][l]=Sum/A[i][i];

        }

    }      

}

 

void rkoefC(float R[m][m],float C[m],float B[m])

{

    for(int i=0;i<=(m-1);i++)

    {

        C[i]=0;

     

        for(int k=0;k<=(m-1);k++)

        {

        C[i]=C[i]+R[i][k]*B[k];

        }

    }

}

 

void obrmat(float E[m][m],float R[m][m],float B[m],float C[m],float A[m][m])

{

    for(int i=0; i

    {

        for(int j=0;j

        {

                if(i==j)

                {

                    E[i][j]=1;

                }

                 

                else

                {

                    E[i][j]=0;

                }                  

        }

    }

    prguss(A,B,E);

    obguss(A,R,E,B,C);

    rkoefC(R,C,B);

}

 

float approcs(float C[m],float Yl[n],float D[n],float X[n],float Y[n])

{

    float Kr;

    int k;

    Kr=0; k=0;

    for(int i=0;i

    {

        Yl[i]=C[0]*Fl(k,X[i])+C[1]*Fl((k+1),X[i])+C[2]*Fl((k+2),X[i]);

        D[i]=fabsf(Y[i]-Yl[i]);

        Kr=Kr+pow(D[i],2);      

    }

    return Kr;

}

void kappr(float Y[m],float Yl[n],float D[n],float *Dmax,int *IM)

{  

    *Dmax=fabsf(D[0]);

    *IM=0;

    for(int i=1;i

    {

        if(fabsf(D[i])>*Dmax)

        {

            *Dmax=fabsf(D[i]);

            *IM=i;  

        }

    }

}

 void vyvod(float E[n])

{

    for(int i=0;i

    {

     printf("%.3f ",E[i]);

    }  

    printf("\n");  

}

 

void vyvod1(float E[m])

{

    for(int i=0;i

    {

     printf("%.3f ",E[i]);

    }  

    printf("\n");  

}

int main()

{

    float X[n],Y[n], A[m][m],E[m][m],B[m],R[m][m],C[m],Yl[n],D[n],Dmax,Kr;

    int IM;

    printf("vvedite X\n");

    vvod(X);

    printf("vvedite Y\n");

    vvod(Y);

    koeff(A,X,Y,B);

    obrmat(E,R,B,C,A);

    printf("C:\n");

    vyvod1(C);

    Kr=approcs(C,Yl,D,X,Y);

    kappr(Y,Yl,D,&Dmax,&IM);

    printf("Znachenie appr f(x):\n");

    vyvod(Yl);

    printf("Znachenie otkloneniy:\n");

    vyvod(D);

    printf("Max pri =%.3f pri X=%.3f \n",Dmax,X[IM]);

    printf("Znachenie kriter=%.3f\n",Kr);  

    getch ();

    return 0;

}    


  1. Результаты машинного счета

x

0,52

0,79

1,05

1,57

2,08

F(x)

1,000

y

0,35

0,79

1,4

3,14

5,58

Метод

Обр Матр

Коэффициенты

с1

0,575

с2

1,800

с3

-2,427

Значения аппроксимирующей функции

Значения отклонений

0,564

0,214

0,599

0,191

1,202

0,198

3,522

0,382

5,374

0,206


7.Вывод

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

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

7.3.Был получен базовый комплект знаний по документированию программного обеспечения, согласно принятым государственным стандартам.