- •Министерство образования и науки российской федерации
- •Глава 1Цель работы
- •Методические указания
- •2.1 Постановка задачи
- •2.2 Методика выбора аппроксимирующей функции
- •2.3 Общая методика решения
- •2.4 Методика решения нормальных уравнений
- •Глава 2Ручной счёт.
- •Глава 3Текст программы и результат расчётов параметров на эвм.
- •4.1. Схемы алгоритмов
- •4.2. Текст программы и результат расчётов параметров на эвм
- •Глава 4Заключение
4.2. Текст программы и результат расчётов параметров на эвм
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <cmath>
#define n 5
#define m 3
void koeff(float A[m][m], float B[m], float x[n], float y[n]);
float fi(float x, int k);
void metodgaussa(float A[m][m], float B[m], float C[m]);
void otkl(float G[n], float X[n]);
void approk(float G[n]);
void res(float X[n], float Y[n], float C[m], float G[n]);
int main()
{
int i, k, j;
float A[m][m], B[m], C[m], D[n], x[n], y[n];
printf("Vvedite X:\n");
for (i = 0; i<n; i++)
{
scanf_s("%f", &x[i]);
}
printf("Vvedite Y:\n");
for (i = 0; i<n; i++)
{
scanf_s("%f", &y[i]);
}
koeff(A, B, x, y);
printf("matrica A: ");
for (i = 0; i<m; i++)
{
printf("\n");
for (j = 0; j<m; j++)
printf("%9.4f ", A[i][j]);
}
printf("\nVektor B:\n");
for (i = 0; i<m; i++)
{
printf("%5.4f ", B[i]);
}
metodgaussa(A, B, C);
printf("\n");
printf("\nKoefficienti C1=%5.4f, C2=%5.4f, C3=%5.4f", C[0], C[1], C[2]);
printf("\n");
printf("\nF=%4.4f+%4.4f(x)+%4.4f(x*x)", C[0], C[1], C[2]);
printf("\n");
res(x, y, C, D);
printf("\n");
approk(D);
printf("\n");
otkl(D, x);
_getch();
}
float fi(float x, int k)
{
if (k == 0)
return (1);
else
if (k == 1)
return (log(x));
else
if (k == 2)
return (x);
}
void koeff(float A[m][m], float B[m], float x[n], float y[n])
{
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 res(float X[n], float Y[n], float C[m], float D[n])
{
int i;
float F[n];
printf("\nRezultati vichislenii:\n");
printf("i X[i] Y[i] F[i] D[i]\n");
for (i = 0; i<n; i++)
{
F[i] = C[0] + C[1] * (log(X[i])) + C[2] * (X[i]);
D[i] = Y[i] - F[i];
printf("%i %5.4f %5.4f %6.4f %6.4f\n", i + 1, X[i], Y[i], F[i], D[i]);
}
}
void approk(float D[n])
{
int i;
float Kr;
Kr = 0;
for (i = 0; i<n; i++)
Kr = Kr + D[i] * D[i];
printf("\nMin. znachenie kachestva approksimacii:");
printf("Kr=%7.6f ", Kr);
}
void otkl(float D[n], float X[n])
{
int i, max;
float g;
g = fabs(D[0]);
max = 0;
for (i = 1; i<n; i++)
if (fabs(D[i])>g)
{
g = fabs(D[i]);
max = i;
}
printf("\n\nMax. po modulu otklonenie:\n");
printf("max|g[i]|=%5.4f pri x=x[%d]=%5.4f\n", g, max + 1, X[max]);
}
void metodgaussa(float A[m][m], float B[m], float C[m])
{
int i, k, j;
float sum;
for (i = 0; i<m - 1; i++)
{
for (k = i + 1; k<m; k++)
{
C[i] = A[k][i] / A[i][i];
A[k][i] = 0;
for (j = i + 1; j<m; j++)
A[k][j] = A[k][j] - C[i] * A[i][j];
B[k] = B[k] - C[i] * B[i];
}
}
for (i = m - 1; i >= 0; i--)
{
sum = 0;
for (j = i + 1; j<m; j++)
sum = sum + A[i][j] * C[j];
C[i] = (B[i] - sum) / (A[i][i]);
}
}
Скриншот работы программы :
Глава 4Заключение
В результате проделанной работы был описан критерий аппроксимации, способ его минимизации, составлена система нормальных уравнений, параметры которой вычислили при помощи метода Гаусса, рассчитаны отклонения аппроксимирующей функции, а также максимальное по модулю отклонение. Расчёты составлены двумя способами:
-подсчитанные вручную
-подсчитанные на ЭВМ, при помощи составленной программы
