kursovaya_rabota (1)
.pdf( 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