Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

kursovaya_rabota (1)

.pdf
Скачиваний:
24
Добавлен:
14.03.2016
Размер:
1.09 Mб
Скачать

( 1) = 5,055 − 4,036 0,79 + +1,001 (0,79)2=2,49( 2) = 5,055 − 4,036 1,57 + +1,001 (1,57)2=1,19( 3) = 5,055 − 4,036 2,36 + +1,001 (2,36)2=1,11( 4) = 5,055 − 4,036 3,12 + +1,001 (3,12)2=2,21( 5) = 5,055 − 4,036 3,81 + +1,001 (3,81)2=4,211=|2,5 − 2,49|=0,012=|1,2 − 1,19|=0,013=|1,12 − 1,11|=0,014=|2,25 − 2,21|=0,045=|4,28 − 4,21|=0,07

Вычислю значение критерия аппроксимации:

= ( 1, 2 , 3)= (0,01)2 + (0,01)2 + (0,01)2 + (0,04)2 + (0,07)2 = 0,0068

Максимальное по модулю отклонение:

=0,07 при 5=3,81.

График

11

8)Схемы алгоритмов и их описание

Схема общего алгоритма

Начало

x={0.0, 0.25, 0.5, 0.75, 1.0, 1.25}

y={-2.0, -4.0, -7.0, -12.0, -21.0, -38.0}

вывод(“ДК”)

i=0..n-1

вывод(x[i])

i i=0..n-1

вывод(y[i])

i

koeff(x,y,A,B)

Вывод(“ДК”)

i=0..m-1

k=0..m-1

Вывод(A[i][k])

k

Вывод(B[i])

i

gauss(A,B,C)

Вывод(“ДК”)

i=0..m-1

Вывод(С[i])

i

value(x,y,C,Kr,Yl,D)

max(D,x,Dmax,JM)

конец

12

Обощеная схема метода Гаусса

Начало

prgauss(A,B)

obrgauss(A,B,C)

Конец

Функция прямого хода метода Гаусса

Начало

i=0..m-1

ved(A,I,IM)

perest(A,B,i,IM)

l=l+1..m-1

rkoef(A,B,I,L)

l

i

Конец

Функция перестановки уравнений системы

Начало

Нет

IM!=i

Да j=i..m-1

temp=A[i][j]

A[i][j]=A[IM][j]

A[IM][j]=temp

j

temp=B[i]

B[i]=B[IM]

B[IM]=temp

Конец

 

Функцию обратного хода

Функция определения

 

 

 

 

 

метода Гаусса

ведущего уравнения

 

 

 

 

 

Начало

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

maxa=0

 

 

 

 

C[m-1]=B[m-1]/A[m-1][m-1]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h=-1

 

 

 

 

 

 

 

k=m-2..0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k=i..m-1

 

 

 

 

 

sum=B[k]

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j=k+1..m-1

 

|A[k][i]|>|maxa|

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sum=sum-A[k][j]*C[j]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

maxa=A[k][i]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

h=k

 

 

 

 

 

 

 

C[k]=sum/A[k][k]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

k

 

 

 

 

 

k

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

 

h=-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод(“ДК”)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

exit(1)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return (h)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

Функция пересчета коэффициентов

 

 

 

 

 

 

 

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A[l][i]=0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j=i+1..m-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

j

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B[l]=B[l]-Q*B[i]

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конец

 

 

 

 

 

 

 

13

Схема алгоритма формирования матриц koeff(x,y,A,B)

Начало

i=0..m-1

j=0..m-1

A[i][j]=0

l=0..n-1

S=0

S=S+fi(x[l],i)*fi(x[l],j)

A[i][j]=S

j

l

S=0

l=0..n-1

S=S+y[l]*fi(x[l],i)

B[i]=S

l

i

Конец

Схема алгоритма функции fi(x[i],g)

Начало

 

k=0

Да

 

Нет

return (1)

k=1

Да

 

Нет

return (x)

return (x*x)

 

Конец

14

Схема алгоритма вычисления значения критерия аппроксимации value(C,x,y,Yl,D,Kr)

Начало

kr=0

k=0

Yl[0]=0

i=0..n-1

Yl=C[0]*Fi(x[i],k)+C[1]*Fi(x[i],k+1)+C[2]*Fi(x[i],k+2)

D[i]=y[i]-Yl[i]

Kr=Kr+D[i]*D[i]

i

Вывод(“ДК”)

i=0..n-1

Вывод(Yl[i])

i

Вывод(“ДК”)

i=0..n-1

Вывод(D[i])

i

Вывод(Kr)

Конец

Схема алгоритма вычисления Значений максимального отклонения и его

координаты max(D,x,Dmax,IM)

Начало

Dmax=D[0]

JM=0

i=0..n-1

Нет

|D[i]|>|Dmax|

Да

Dmax=D[i]

IM=i

i

Вывод(|Dmax|,x[JM])

Конец

15

9)Программа и результаты расчетов параметров на компьютере

#include <stdio.h> #include <math.h> #include <conio.h> #include <stdlib.h> #include <locale.h>

#define n 5 #define m 3

void koeff(float x[n], float y[n], float A[m][m], float B[m]);

void value(float C[m], float x[n], float y[n], float Kr, float Yl[n], float D[n]); void maxi(float D[n], float x[n], float Dmax, int IM);

float fi(float x,int g);

void gauss(float A[m][m], float B[m], float C[m]); void obrgauss(float A[m][m], float B[m], float C[m]); void prgauss(float A[m][m], float B[m]);

void rkoef(float A[m][m], float B[m], int i, int l); void perest(float A[m][m],float B[m],int i, int IM); int ved(float A[m][m], int i);

int main()

{ setlocale(LC_ALL, "RUS"); int l,k,i,IM;

float A[m][m],B[m],C[m],Yl[n],D[n],Kr,Dmax, x[5]={0.79, 1.57, 2.36, 3.12, 3.81}, y[5]={2.50, 1.20, 1.12, 2.25, 4.28};

printf("АППРОКСИМАЦИЯ ФУНКЦИИ МЕТОДОМ НАИМЕНЬШИХ КВАДРАТОВ\n");/ printf("Метод гаусса\n\n");

printf("x: "); for(i=0;i<n;i++) printf("%.1f ",x[i]); printf("\n"); printf("y: "); for(i=0;i<n;i++) printf("%.1f ",y[i]); printf("\n\n"); koeff(x,y,A,B);

printf("Матрица A Вектор В:\n"); for(i=0;i<m;i++)

{

for(k=0;k<m;k++) printf("%.3f \t",A[i][k]); printf("%.3f \n",B[i]);

}

gauss(A,B,C); printf("\nМатрица С:\n");

for(i=0;i<m;i++) printf("C[%d]=%.3f\n",i,C[i]); value(x,y,C,Kr,Yl,D);

maxi(D,x,Dmax,IM);

getch(); return 0;

}

float fi(float x,int g)

{

if (g==0) return (1); else

if (g==1) return (x); else

if (g==2) return (x*x);

}

void koeff(float x[n],float y[n],float A[m][m],float B[m])

16

{

int i,j,l; float S;

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

{

for(j=0;j<m;j++)

{

S=0;

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

S=S+fi(x[l],i)*fi(x[l],j);

A[i][j]=S;

}

S=0;

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

S=S+y[l]*fi(x[l],i);

B[i]=S;

}

}

void value(float x[n], float y[n], float C[m], float Kr, float Yl[n], float D[n])

{

int k,i; Kr=0; k=0; Yl[0]=0;

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

{

Yl[i]=C[0]*fi(x[i],k)+C[1]*fi(x[i],k+1)+C[2]*fi(x[i],k+2); D[i]=y[i]-Yl[i];

Kr=Kr+D[i]*D[i];

}

printf("\nЗначение аппроксимирующей функции\n"); for(i=0;i<=n-1;i++)

{

 

printf("%.3f

",Yl[i]);

}

 

printf("\nЗначение отклонения аппроксимирующей функции от заданного зачения\n"); for(i=0;i<=n-1;i++)

{

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

}

printf("\n\nКритерий аппроксимации J = %.3f",Kr);

}

void maxi(float D[n], float x[n], float Dmax, int IM)

{

int i; Dmax=D[0]; IM=0; for(i=0;i<n;i++)

{

if(fabs(D[i])>fabs(Dmax))

{

Dmax=D[i];

IM=i;

}

}

printf("\n\nМаксимальное значение отклонения = %.3f, при x[%i] = %.1f\n\n",fabs(Dmax),IM+1,x[IM]);

}

int ved(float A[m][m], int i)

{

int g,h,k; float maxa; maxa=0; h=-1;

for(k=i;k<m;k++)

if (fabs(A[k][i])>fabs(maxa))

{

17

maxa=A[k][i];

h=k;

}

if(h==-1)

{

printf("\nМатрица вырождена\n"); exit(1);

}

return h;

}

void perest(float A[m][m],float B[m],int i, int IM)

{

float temp; int j; if(IM!=i)

{

for(j=i;j<m;j++)

{

temp=A[i][j];

A[i][j]=A[IM][j];

A[IM][j]=temp;

}

temp=B[i];

B[i]=B[IM];

B[IM]=temp;

}

}

void rkoef(float A[m][m], float B[m], int i, int l)

{

float Q; int j;

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

A[l][i]=0;

for(j=i+1;j<m;j++) A[l][j]=A[l][j]-Q*A[i][j]; B[l]=B[l]-Q*B[i];

}

void prgauss(float A[m][m], float B[m])

{

int i,l,IM; float Q;

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

{

IM=ved(A,i);

perest(A,B,i,IM); for(l=i+1;l<m;l++) rkoef(A,B,i,l);

}

}

void obrgauss(float A[m][m], float B[m], float C[m])

{

int k,j; float sum;

C[m-1]=B[m-1]/A[m-1][m-1]; for(k=m-2;k>=0;k--)

{

sum=B[k];

for(j=k+1;j<m;j++) sum=sum-A[k][j]*C[j]; C[k]=sum/A[k][k];

}

}

void gauss(float A[m][m], float B[m], float C[m])

{

prgauss(A,B);

obrgauss(A,B,C);

}

18

10)Вывод

Введя исходные данные (набор координат X и Y), я получила матрицу 3х3 из коэффициентов линейных уравнений и вектор из свободных членов. Методом Гаусса я нашла искомые коэффициенты для аппроксимирующей функции. На всех этапах работы я сверяла значения со значениями, полученными в ручном счете, и удостоверилась в их правильности.

Далее я вычислила все отклонения, определила максимальное и вывела критерий аппроксимации.

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

В ходе данной работы я освоила:

а) типовые вычислительные методы прикладной математики; б) навыки разработки алгоритмов и построения программ на языке высокого уровня; в) принципы модульного программирования;

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

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

19

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]