- •Программа и результаты расчётов параметров на компьютере………………… 17
- •Заключение …………………………………………………………………………. 20
- •Цель работы
- •Постановка задачи
- •Представление исходных данных
- •Описание критерия аппроксимации и способа его минимизации:
- •Описание метода вычисления коэффициентов нормальных уравнений:
- •Описание метода Гаусса
- •Ручной счёт
- •Схемы алгоритмов и их описание
- •Общая схема алгоритма
- •Схемы алгоритмов вычисления koef (X,y,a,b)
- •9. Программа и результаты расчётов параметров на компьютере
- •10. Заключение
9. Программа и результаты расчётов параметров на компьютере
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <stdlib.h>
#define n 5
#define m 3
float fi(float x, int g);
void koef (float x[n],float y[n],float A[m][m],float B[m]);
void krit(float x[n],float y[n],float C[m],float *Kr,float Yl[n],float D[n],float *Dmax, int *IM);
int ved(float A[m][m], int i);
void perest(float A[m][m],float B[m], int i, int IM);
void rkoeff (float A[m][m],float B[m],int i,int l);
void prgauss(float A[m][m],float B[m]);
void obrgauss(float A[m][m],float B[m],float C[m]);
void gauss (float A[m][m], float B[m], float C[m]);
int main ()
{
float A[m][m], B[m],C[m],Yl[n],Kr,Dmax,D[n],x[n],y[n];
int i,k,l,IM;
printf("Vvedite x[%i]:\n",n);
for(i=0;i<n;i++)
{
scanf("%f",&x[i]);
}
printf("Vvedite y[%i]:\n",n);
for(i=0;i<n;i++)
{
scanf("%f",&y[i]);
}
printf ("approksim. funkcii metodom naimenshih kvadratov\n metod gauusa\n\n");
koef(x,y,A,B);
printf(" Matrica A Vektor B:\n");
for(i=0;i<m;i++)
{
for(k=0;k<m;k++) printf("%9.3f ",A[i][k]);
printf("%9.3f \n",B[i]);
}
gauss(A,B,C);
printf("\n Vektor C:\n");
for(i=0;i<m;i++)
printf("C[%d]=%.3f\n",i,C[i]);
krit(x,y,C,&Kr,Yl,D,&Dmax,&IM);
printf("\n znachenia approcsim. funkcii\n");
for (i=0;i<n;i++)
{
printf("%.3f ",Yl[i]);
}
printf("\notklonenie approcsim. funkcii\n");
for (i=0;i<n;i++)
{
printf("%.3f ",D[i]);
}
printf("\n kriterii approksimacii J=%.3f",Kr);
printf("\n\n maksimalnoe otkolnenie = %.3f, pri x[%i]=%.1f\n\n",fabs(Dmax),IM+1,x[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*x);
}
void koef (float x[n],float y[n],float A[m][m],float B[m])
{
int k,l,i;
float S;
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]+=fi(x[i],k)*fi(x[i],l);
}
}
for (k=0;k<m;k++)
{
B[k]=0;
for (i=0;i<n;i++)
B[k]+=y[i]*fi(x[i],k);
}
}
void krit(float x[n],float y[n],float C[m],float *Kr,float Yl[n],float D[n],float *Dmax, int *IM)
{
int i,k;
*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];
}
*Dmax=D[0];
*IM=0;
for (i=0;i<n;i++)
{
if (fabs(D[i])>fabs(*Dmax))
{
*Dmax=D[i];
*IM=i;
}
}
}
int ved(float A[m][m], int i)
{
int g,h,k;
float maxa,temp;
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("\n vyrojdennaya matrica \n");
exit (1);
}
return h;
}
void perest(float A[m][m],float B[m], int i, int IM)
{
int j;
float temp;
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 rkoeff (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])
{
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++) rkoeff(A,B,i,l);
}
}
void obrgauss(float A[m][m],float B[m],float C[m])
{
int j,k;
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);
}
Результаты:
