Формирование матрицы ⇐ ПредыдущаяСтр 3 из 3
Аппроксимация, или приближение – научный метод, состоящий в замене одних объектов другими, в том или ином смысле близкими к исходным, но более простыми.
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))
Оценка погрешности аппроксимации:
График
СХЕМЫ АЛГОРИТМОВ
Алгоритм расчета коэффициентов (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 Все права принадлежат авторам размещенных материалов.
|