Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архив1 / docx56 / Лабораторная работа (4)

.docx
Скачиваний:
18
Добавлен:
01.08.2013
Размер:
65.69 Кб
Скачать

Лабораторная работа №5

Аппроксимация данных

Студента группы ПВ-22

Воробьева Романа Викторовича

Вариант № 3

i

0

1

3

1

2

3,5

2

3

3,67

3

4

3,75

4

5

3,8

/*

Спецификация подпрограмм:

  1. Заголовок: matr approximate(matr p, vect nf,int size_matr,int size_vect)

  2. Назначение: возвращает матрицу с аппроксимирующеми коофицентами, где p- матрица узлов апроксимации, а nf- вектор с номерами базисных функций.

  3. Входные параметры: p, nf, size_matr ,size_vect

  4. Выходные параметры: нет.

*/

/*

Спецификация подпрограмм:

  1. Заголовок: matr Read_file (char *name_file,int* size)

  2. Назначение: возвращает матрицу узлов аппроксимации 2*size считанную из файла name_file, где элементы 0-го столбца-координаты точек по x, и элементы 1-го столбца- координаты по y

  3. Входные параметры: name_file.

  4. Выходные параметры: size.

*/

/*

Спецификация подпрограмм:

  1. Заголовок: void Write_file(char *name_file,matr p,vect nf,matr c,int size_matr, int size_vect)

  2. Назначение: дозапись в файл name_file функции аппроксимирующей точки P, составленной из суммы функций с номерами NFi и коофицентами Ci и среднеквадратичного отклонения, p- матрица узлов апроксимации, а nf- вектор с номерами базисных функций.

  3. Входные параметры: name_file,p, nf, size_matr ,size_vect

  4. Выходные параметры: нет.

*/

/*

Спецификация подпрограмм:

  1. Заголовок: vect select_base(int n)

  2. Назначение: возвращат вектор длинной n с номерами выбранных базовых функций.

  3. Входные параметры: n

  4. Выходные параметры: нет.

*/

#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;

}

Соседние файлы в папке docx56