• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

C++ Линейный Метод Наименьших Квадратов

  • Автор темы prettynetty
  • Дата начала
P

prettynetty

#1
Разработка программы аппроксимации табличной функции степенным рядом( линейный метод наименьших квадратов). использование глобальных переменных не допускается. Думаю, что проблема тут

[highlight=yellow] while(!strstr(s1,"EOF"))
{
fscanf(f,"%s%s",s1,s2);
x[nCount]=atof(s1);
y[nCount]=atof(s2);
nCount++;
x = (double *)realloc((void *)x,(nCount + 1)*sizeof(double));
y = (double *)realloc((void *)y,(nCount + 1)*sizeof(double));
}[/highlight]
<!--shcode--><pre><code class='SELECT AnyThing FROM SomeThing'>#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>

void p1();
void p2();
double * MNK(double *x, double *y, int n, int k);
void PryamoiHod(int n, double **a, double *b);
void ObratniHod(int n, double **a, double *b, double *x);
double F(double x, double *c, int k);


void main()
{
SetConsoleOutputCP(1251);
int key;
printf("\t\tАппроксимация методом НК\r\n");
printf("\tМеню:\r\n");
printf("1 - Диалоговый ввод\r\n");
printf("2 - Данные из файла\r\n");
scanf("%d", &key);
if(key == 1)
p1();
if(key == 2)
p2();
if(key!=1 && key!=2){ printf("Неверный ввод!"); exit(0);}
}

void p1()
{
int nCount;
double *x, *y;
int k;
double a,rez, *c;
printf("Введите число эксперементальных точек\r\n");
scanf("%d", &nCount);
x=(double *)malloc(nCount*sizeof(double));
y=(double *)malloc(nCount*sizeof(double));
for(int i=0; i<nCount; i++)
{
printf("\tТочка %d:\r\n", i+1);
printf("Аргумент\t"); scanf("%f", &x);
printf("Функция \t");scanf("%f", &y);
}
printf("Ввод окончен\r\n");
printf("Данные введены\r\n");
printf("Введите степень разложения\r\n");
printf("Большие значения степени (более 10) увеличивают точность расчёта\r\n");
scanf("%d", &k);
c=MNK(x,y,nCount,k);
printf("Введите значение аргумента\t");
scanf("%f", &a);
rez = F(a,c,k);
printf("Расчётное значение функции :\t%f\r\n", rez);
}

void p2()
{
FILE *f;
double *x, *y, *c;
int k;
if((f=fopen("dannie.txt","rb")) )
{
fseek(f,0,SEEK_END);
long fLen=ftell(f);
fseek(f,0,SEEK_SET);
char s1[16], s2[16];
int nCount=0;
x=(double *)malloc((nCount + 1)*sizeof(double));
y=(double *)malloc((nCount + 1)*sizeof(double));
while(!strstr(s2,"y"))
fscanf(f,"%s%s",s1,s2);
while(!strstr(s1,"EOF"))
{
fscanf(f,"%s%s",s1,s2);
x[nCount]=atof(s1);
y[nCount]=atof(s2);
nCount++;
x = (double *)realloc((void *)x,(nCount + 1)*sizeof(double));
y = (double *)realloc((void *)y,(nCount + 1)*sizeof(double));
}
nCount--;
fclose(f);
printf("Данные введены\r\n");
printf("Введите степень разложения\r\n");
printf("Большие значения степени (более 10) увеличивают точность расчёта\r\n");
scanf("%d",&k);
c = MNK(x, y, nCount, k);
double a,rez;
printf("Введите значение аргумента\t");
scanf("%f",&a);
rez = F(a,c,k);
printf("Расчётное значение функции :\t%f\r\n", rez);
}
}

double * MNK(double *x, double *y, int n, int k)
{
double **a =new double *[k];
double *b=new double [k];
double *c=new double [k];
for(int m=0,i,j; m < k; m++)
{
a[m]=new double[k];
for(j=0; j<k; j++)
{
a[m][j]=0;
for(i=0; i<n;i++)
a[m][j]+=pow(x,m+j);
}
b[m]=0;
for(i=0; i<n; i++)
b[m]+=pow(x,m)*y;
}
PryamoiHod(k,a,b);
ObratniHod(k,a,b,c);
return c;
}

void PryamoiHod(int n, double **a, double *b)
{
double v;
for(int k=0,i,j,im; k<n-1; k++)
{
im=k;
for(i=k+1; i<n; i++)
{
if(fabs(a[im][k]) < fabs(a[k]))
{im=i;}}
if(im!=k)
{for(j=0; j<n; j++)
{v=a[im][j];
a[im][j]=a[k][j];
a[k][j]=v;}
v=b[im];
b[im]=b[k];
b[k]=v;}
for(i=k + 1; i<n; i++)
{
v=a[k]/a[k][k];
a[k]=0;
b=b-v*b[k];
for(j=k+1; j<n; j++)
{a[j]=a[j]-v*a[k][j];}}}}

void ObratniHod(int n, double **a, double *b, double *x)
{
double s=0;
x[n-1]=b[n-1]/a[n-1][n-1];
for(int i=n-2,j; 0<=i; i--)
{ s=0;
for(j=i+1; j<n; j++)
{ s=s+a[j]*x[j];}
x=(b-s)/a;
}
}

double F(double x, double *c, int k)
{
double RetVal=1;
for(int i=0; i<k; i++)
RetVal+=c*pow(x,i);
return RetVal;
}[/CODE]