Лабораторная работа №5
Аппроксимация данных
Студента группы ПВ-22
Воробьева Романа Викторовича
Вариант № 3
i |
||
0 |
1 |
3 |
1 |
2 |
3,5 |
2 |
3 |
3,67 |
3 |
4 |
3,75 |
4 |
5 |
3,8 |
/*
Спецификация подпрограмм:
-
Заголовок: matr approximate(matr p, vect nf,int size_matr,int size_vect)
-
Назначение: возвращает матрицу с аппроксимирующеми коофицентами, где p- матрица узлов апроксимации, а nf- вектор с номерами базисных функций.
-
Входные параметры: p, nf, size_matr ,size_vect
-
Выходные параметры: нет.
*/
/*
Спецификация подпрограмм:
-
Заголовок: matr Read_file (char *name_file,int* size)
-
Назначение: возвращает матрицу узлов аппроксимации 2*size считанную из файла name_file, где элементы 0-го столбца-координаты точек по x, и элементы 1-го столбца- координаты по y
-
Входные параметры: name_file.
-
Выходные параметры: size.
*/
/*
Спецификация подпрограмм:
-
Заголовок: void Write_file(char *name_file,matr p,vect nf,matr c,int size_matr, int size_vect)
-
Назначение: дозапись в файл name_file функции аппроксимирующей точки P, составленной из суммы функций с номерами NFi и коофицентами Ci и среднеквадратичного отклонения, p- матрица узлов апроксимации, а nf- вектор с номерами базисных функций.
-
Входные параметры: name_file,p, nf, size_matr ,size_vect
-
Выходные параметры: нет.
*/
/*
Спецификация подпрограмм:
-
Заголовок: vect select_base(int n)
-
Назначение: возвращат вектор длинной n с номерами выбранных базовых функций.
-
Входные параметры: n
-
Выходные параметры: нет.
*/
#ifndef APROCSIMAC_H_INCLUDED
#define APROCSIMAC_H_INCLUDED
#include "gauss.h"
#include <math.h>
#define NUMF 13
typedef double (*function)(double);
typedef double** matr;
typedef int* vect;
double cnst(double x); //возращает 1;
double line(double x); //возращает x
double sqr(double x); //возвращает x^2
double hyp(double x); //возвращает x^3
void free_matr (matr a, int n); //освобождение памяти из под матрицы a, c n стоками
matr get_matr (int n,int m); //выделение памяти под матрицу nXm
matr Add_mem (matr a,int n,int m); //перевыделение памяти матрицы a на nXm
vect select_base(int n); //возращает вектор с n выбраными базавыми функциями
matr gram_matrix(matr p, vect nf,int size_matr,int size_vect); //возращает матрицу Грамма
matr approximate(matr p, vect nf,int size_matr,int size_vect); //возращает матрицу с апраксимируемыми коэффициентами
double functi(vect nf,matr c, double x,int size_vect); //возращает значение функции составленной из суммы функций и коэффициентов
double stddev(matr p,vect nf,matr c,int size_matr, int size_vect); //возвращает среднеквадратичное отклонение функции
matr Read_file (char *name_file,int* size); //
void Write_file(char *name_file,matr p,vect nf,matr c,int size_matr, int size_vect); //дозапись в файл name_file функции апроксимируещей точки и среднеквадратичное отклонение
static function fbase[NUMF]={cnst, line, sqr, hyp, sqrt, exp, log, sin, sinh, tan, tanh, asin, atan};
static char *fname[NUMF]={"1", "x", "x^2", "x^3", "x^(1/2)", "e^x", "ln(x)", "sin(x)", "sh(x)", "tg(x)", "th(x)", "arcsin(x)", "arctg(x)"};
double cnst(double x)
{
return 1;
}
double line(double x)
{
return x;
}
double sqr(double x)
{
return x*x;
}
double hyp(double x)
{
return x*x*x;
}
void free_matr (matr a, int n)
{
int i;
for (i=n-1; i>=0; i--)
free(a[i]);
free(a);
}
matr get_matr (int n,int m)
{
matr b;
int i;
b=(matr ) malloc (n*sizeof(double*));
for (i=0; i<n; i++)
b[i]=(double*) malloc (m*sizeof(double));
return b;
}
matr Add_mem (matr a,int n,int m)
{
matr b;
int i;
if (a!=NULL)
{
b=get_matr(n-1,m);
for (i=0; i<n-1; i++)
{
b[i][0]=a[i][0];
b[i][1]=a[i][1];
}
free_matr(a,n-1);
a=get_matr(n,m);
for (i=0; i<n-1; i++)
{
a[i][0]=b[i][0];
a[i][1]=b[i][1];
}
free_matr(b,n-1);
}
else
a=get_matr(n,m);
return a;
}
vect select_base(int n)
{
vect a;
int i;
a=(vect ) malloc (n*sizeof(int));
printf("input %d number of functions, when :\n", n+1);
for(i=0; i<NUMF; i++)
printf("%d: %s\n", i, fname[i]);
for(i=0; i<n; i++)
scanf("%d",&a[i]);
return a;
}
matr gram_matrix(matr p, vect nf,int size_matr,int size_vect)
{
matr a=get_matr(size_vect,size_vect+1);
int i, j, k;
for(j=0; j<size_vect; j++)
for(k=0; k<size_vect; k++)
{
a[j][k]=0;
for(i=0; i<size_matr; i++)
a[j][k]+=fbase[nf[j]](p[i][0])*fbase[nf[k]](p[i][0]);
}
for(j=0; j<size_vect; j++)
{
a[j][k]=0;
for(i=0; i<size_matr; i++)
a[j][k]+=fbase[nf[j]](p[i][0])*p[i][1];
}
return a;
}
matr approximate(matr p, vect nf,int size_matr,int size_vect)
{
matr a=gram_matrix(p,nf,size_matr, size_vect);
matr x=get_matr(size_vect, 1);
int i;
DecisionSystems(a,x,size_vect,1);
free_matr(a,size_vect);
return x;
}
double functi(vect nf,matr c, double x,int size_vect)
{
int i;
double f=0;
for(i=0; i<size_vect; i++)
f+=c[0][i]*fbase[nf[i]](x);
return f;
}
double stddev(matr p,vect nf,matr c,int size_matr, int size_vect)
{
int i;
double q=0;
for(i=0; i<size_matr; i++)
{
q+=sqr(-p[i][1]+functi(nf,c,p[i][0],size_vect));
}
return sqrt(q/(size_matr));
}
matr Read_file (char *name_file,int* size)
{
matr a;
double x,y;
int i=0;
FILE *f;
f=fopen(name_file,"r");
while(!feof(f))
{
i++;
fscanf(f,"%lf %lf",&x,&y);
a=Add_mem(a,i,2);
a[i-1][0]=x;
a[i-1][1]=y;
}
fclose(f);
*size=--i;
return a;
}
void Write_file(char *name_file,matr p,vect nf,matr c,int size_matr, int size_vect)
{
double a;
int i;
FILE *f=fopen(name_file, "a");
fprintf(f, "\n\nf(x)=");
fprintf(f, "%lf*%s", c[0][0],fname[nf[0]]);
for(i=1; i<size_vect; i++)
fprintf(f, "%+lf*%s", c[0][i],fname[nf[i]]);
fprintf(f, "\nstdev(x)=%lf",stddev(p,nf,c,size_matr,size_vect));
fclose(f);
}
#endif // APROCSIMAC_H_INCLUDED
// Aproc.cpp: главный файл проекта.
#include "stdafx.h"
#include <iostream>
#include "Aprocsimac.h"
using namespace System;
using namespace std;
int main(array<System::String ^> ^args)
{
matr a,c;
int size_matr,j,size_vect,*nf;
char *name={"input_point.txt"};
printf("Point in file: \n");
a=Read_file(name,&size_matr);
for (j=0; j<size_matr; j++)
printf("%lf %lf\n",a[j][0], a[j][1]);
printf("input number of base functions:");
scanf("%d", &size_vect);
nf=select_base(size_vect);
c=approximate(a,nf,size_matr,size_vect);
Write_file(name,a,nf,c,size_matr,size_vect);
system("pause");
return 0;
}