Здавалка
Главная | Обратная связь

Формирование матрицы



Аппроксимация, или приближение – научный метод, состоящий в замене одних объектов другими, в том или ином смысле близкими к исходным, но более простыми.

 

D i=yi-φ(xi) – определение ошибки

 

На основе изучения ошибок формируются различные критерии аппроксимации. Один из распространенных подходов является метод наименьших квадратов (МНК), в соответствии с которым достигается наименьшая сумма квадратов ошибок Ϭ.

Требование имеет вид:

 

 

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

, где k = 1...3 – условие минимума

 

Исходя из критерия аппроксимации:

 

 

 

Система нормальных уравнений примет вид

 

 

Обозначение:

Матрица системы:

 

Вектор-столбец свободных членов:

Вектор-столбец неизвестных:

 

Контрольный расчёт параметров аппроксимирующей функции (без использования ЭВМ)

Вычисление коэффициентов нормальных уравнений

 

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

 

 

52.05 * С1 + 14.5 * С2 + 0.924 * С3 = 275.9

14.5 * С1 + 5 * С2 + 0.6387 * С3 = 61

0.924 * С1 + 0.6387 * С2 + 0.19 * С3 = 06717

 

Искомые параметры С1; C2; C3

С1=19

С2=-55

С3=98

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

Y=(19)*(x)+(-55) (1)+(98) (exp(-x))

 

 

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

i xi yi y(xi) Di=yi-φ(xi)
0.9 -0.5 1.536 2.036
1.9 0.0 -4.728 4.7285
2.9 4.5 5.06 -0.56
3.9 20.684 -4.7
4.9 38.4445 2.56

 

График

 

 

СХЕМЫ АЛГОРИТМОВ

 

 

Алгоритм расчета коэффициентов (1)

 

 

Метод Гаусса

 

 

 

Определение ведущего элемента

 

 

Перестановка i-й и IM-й строк Расчет коэффицентов уравнений

 

 


 

Обратный ход

 

 

НЕПРАВИЛЬНо

 


 

Функция Massiv

 

 

Алгоритм для 3 и 4 процессов (аппроксимация и вычисление критериев)

 

 

 

ПРОГРАММА

Текст программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

# include <stdlib.h>

#define m 3

#define n 5

 

int i,j,k,l, IM;

float X[n],Y[n],F1[m][n],A[m][m],B[m],C[m],Y1[n],D[n],Dmax,Q,Kr,Sum;

 

void Massiv(float *M, char *Name, int x, int y)

{

int i, j, ChisloJ = 0;

printf("Array %s:\n", Name);

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

{

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

{

printf("%5.3f\t", M[ChisloJ++]);

}

putchar(10);

}

putchar(10);

}

void znachenia(float X[n], float Y[n])

{

printf("vvedite:\n");

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

{

printf("X[%i]= ",i+1);

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

printf("Y[%i]= ",i+1);

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

}

}

float function(float F1[m][n])

{

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

{

F1[0][i]= X[i];

F1[1][i]=1

F1[2][i]=exp(-X[i]);

}

}

float koefficent(float A[m][m], float B[m])

{

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

{

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

{

A[k][l] = 0;

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

{

A[k][l] = A[k][l]+ F1[k][i] * F1[l][i];

}

}

}

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

{

B[k]=0;

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

{

B[k]= B[k]+Y[i]*F1[k][i];

}

}

Massiv(*A, "A", m, m);

Massiv(B, "B", m, 1);

}

 

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

{

int h,k;

float MaxA;

MaxA=0;

h=-1;

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

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

{

MaxA=A[k][i];

h=k;

}

if(h==-1)

{

printf("Matrix virogdena\n");

abort();

}

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)

{

int j; float Q;

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])

{

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 obgauss(float C[m])

{ 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 apr( )

{

 

Kr=0;

k=0;

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

{

Y1[i] = C[0] * F1[0][i] + C[1] * F1[1][i] + C[2] *F1[2][i];

D[i]=fabs(Y[i]-Y1[i]);

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

}

}

Void krappr()

{

Dmax=D[0];

IM=0;

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

{

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

Dmax=D[i];

IM=i+1;

}

}

Void vivodvsego()

{

Massiv(C, "C", m, 1);

Massiv(Y1, "Y1", n, 1);

Massiv(D, "D", n, 1);

printf("Dmax = %5.3f\nIM=%i\n", Dmax,IM+1);

printf("Kr=%5.4f\n", Kr);

system ("pause");

}

Int main()

{

znachenia(X,Y);

function(F1);

koefficent(A,B);

prgauss(A,B);

obgauss(C);

apr();

krappr();

vivodvsego();

return 0;

}







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.