- •Оглавление_________________________________________________2
- •Цель работы.
- •Методические указания.
- •Методические рекомендации по аппроксимации методом наименьших квадратов.
- •Постановка задачи.
- •Методика решения системы нормальных уравнений.
- •Ручной счет.
- •Исходные данные.
- •График.
- •Схемы алгоритмов.
- •Текст программы.
- •Результаты контрольного расчета.
- •Выводы.
Ручной счет.
Исходные данные.
Вариант задания: 7.
-
i
1
2
3
4
5
xi
0.0
1.57
3.14
4.71
6.28
yi
0.0
0.5
1.0
2.0
4.0
-
φ1(x)
φ2(x)
φ3(x)
1
cos(x)
cos(2x)
Критерий аппроксимации.
Условие минимума аппроксимации:
Взятие производной и формирование нормальных уравнений:
Первое уравнение:
Второе уравнение:
Третье уравнение:
Система нормальных уравнений.
Решение системы методом Гаусса.
Результаты расчета.
С1=1.375
С2=0.499
С3=0.125
Аппроксимирующая функция.
Оценка погрешности аппроксимации.
-
i
xi
yi
φ(xi)
δi=yi-φ(xi)
1
0.0
0.0
1.999
-1.999
2
1.57
0.5
1.25
-0.75
3
3.14
1.0
1
0.0
4
4.71
2.0
1.249
0.751
5
6.28
4.0
1.999
2.001
Минимальное значение качества аппроксимации:
Jmin=(-1.999)2 + (-0.75)2 +(0.0)2 +(0.751)2 +(2.001)2 = 9.127
Максимальное по модулю отклонение:
max при x = x5 = 6.28
График.
Рис. 4.8.1. График аппроксимирующей функции. Исходные точки.
Построение графика выполнялось при помощи математического пакета MathCAD.
Схемы алгоритмов.
Схема алгоритма основного блока программы.
Рис. 5.1.1. Начало блок – схемы алгоритма.
Рис. 5.1.2. Конец блок – схемы алгоритма.
Схема алгоритма функции решения системы уравнений.
Рис. 5.2.1. Блок – схема алгоритма процедуры.
Текст программы.
#pragma argsused
#include <iostream.h>
#include <conio.h>
#include <math.h>
void GAUSS (float Z1[3][3], float Z2[3],int w,float Z3[3])
{int i,j,l,k,NUM;
float BIG,TEMP,Q,SUM;
for (i=0; i<w-1; i++)
{BIG=0;
NUM=-1;
for (l=i; l<w; l++)
if (abs(Z1[l][i])>abs(BIG))
{BIG=Z1[l][i];
NUM=l;}
if (NUM==-1)
{cout<<"Matrica virozhdennaya! \n";
break;}
if(NUM!=i)
{for (j=i; j<w; j++)
{TEMP=Z1[i][j];
Z1[i][j]=Z1[NUM][j];
Z1[NUM][j]=TEMP;}
TEMP=Z2[i];
Z2[i]=Z2[NUM];
Z2[NUM]=TEMP;}
for (k=i+1; k<w; k++)
{Q=Z1[k][i]/Z1[i][i];
Z1[k][i]=0;
for (j=i+1; j<w; j++)
Z1[k][j]=Z1[k][j]-Q*Z1[i][j];
Z2[k]=Z2[k]-Q*Z2[i];}}
Z3[w-1]=Z2[w-1]/Z1[w-1][w-1];
for (i=w-2; i>=0; i--)
{SUM=Z2[i];
for (j=i; j<w; j++)
SUM=SUM-Z1[i][j]*Z3[j];
Z3[i]=SUM/Z1[i][i];}}
int main()
{int i,j,k,l,m,n,imax;
float x[5],y[5],F0[5],DELTA[5];
float f[3][5], A[3][3],B[3],C[3];
float J0,max;
clrscr();
cout <<"Vvedite kolichestvo zadannix ishodnix tochek \n";
cin>>m;
cout <<"Vvedite kolichestvo zadannix ishodnix funkcii \n";
cin>>n;
cout <<"Vvedite znachenia X: \n";
for (i = 0; i < m; i++)
cin >> x[i];
cout <<"Vvedite znachenia Y: \n";
for (i = 0; i < m; i++)
cin >> y[i];
for (i = 0; i < m; i++)
{f[0][i]=1;
f[1][i]=cos(x[i]);
f[2][i]=cos(2*x[i]);}
cout <<"Matrica koefficientov pri neizvestnix C1, C2, C3: \n";
for (k = 0; k < n; k++)
{for (l = 0; l < n; l++)
{A[k][l]=0;
for (i = 0; i < m; i++)
A[k][l]=A[k][l]+(f[k][i])*(f[l][i]);
cout<<A[k][l]<<" ";}
cout<<"\n";}
cout <<"Matrica-stolbez pravoi chasti sistemi uravnenii: \n";
for (k = 0; k < n; k++)
{B[k]=0;
for (i = 0; i < m; i++)
B[k]=B[k]+y[i]*f[k][i];
cout<<B[k]<<"\n";}
GAUSS(A,B,n,C);
cout<<"Znachenia koefficientov Ck: \n";
for (k = 0; k < n; k++)
{cout<<"C"<<k+1<<"="<<C[k];
cout<<"\n";}
cout <<"Znachenia approksimiruyuwei funkcii v zavisimosti ot x[i]: \n";
for (i = 0; i < m; i++)
{F0[i]=C[0]*f[0][i]+C[1]*f[1][i]+C[2]*f[2][i];
cout<<"F(x"<<i+1<<")="<<F0[i]<<"\n";}
cout <<"Znachenia otklonenii isxodnix tochek ot approksimiruyuwei funkcii: \n";
for (i = 0; i < m; i++)
{DELTA[i]=y[i]-F0[i];
cout<<"DELTA"<<i+1<<"="<<DELTA[i]<<"\n";}
cout <<"Maksimalnoe po modulu otklonenie: \n";
max=DELTA[0];
imax=0;
for (i = 1; i < m; i++)
if (abs(DELTA[i])>abs(max))
{max=DELTA[i];
imax=i;}
cout<<"DELTAmax="<<max<<" pri x=x"<<imax+1<<"="<<x[imax]<<"\n";
cout <<"Minimalnoe znacyenie kachestva approksumacii: \n";
J0=DELTA[0]*DELTA[0];
for (i=1; i < m; i++)
J0=J0+DELTA[i]*DELTA[i];
cout<<"J0="<<J0<<"\n";
return 0;}