jmax=j;
}
if(jmax>i)
{
for(j=i;j<m+1;j++)
{
max=A[i][j];
A[i][j]=A[jmax][j];
A[jmax][j]=max;
}
max=F[i];
F[i]=F[jmax];
F[jmax]=max;
}
F[i]/=A[i][i];
for(j=m;j>=i;j--) A[i][j]/=A[i][i];
for(j=i+1;j<m+1;j++)
{
F[j]-=F[i]*A[j][i];
for(int k=m;k>=i;k--) A[j][k]-=A[i][k]*A[j][i];
}
}
for(i=m;i>=0;i--)
{
for(j=0;j<i;j++)
{
F[j]-=A[j][i]*F[i];
}
X[i]=F[i];
}
}
void scala::obrtX(double **Q)
{
int i,j,jmax,k;
double max;
double **identity;
double **A;
identity = new double * [m+1];
for (i=0;i<m+1;i++)identity[i]= new double [m+1];
A = new double * [m+1];
for (i=0;i<m+1;i++) A[i]= new double [m+1];
for (i=0;i<m+1;i++)
for (j=0;j<m+1;j++)identity[i][j]=(i==j);
for(i=0;i<m+1;i++)
for(j=0;j<m+1;j++) A[i][j]=0;
for(i=0;i<m+1;i++)
for(j=0;j<m+1;j++)
{
for(max=0,k=0;k<n;k++) max+=Q[k][i]*Q[k][j];
A[i][j]=max;
}
for(i=0;i<m+1;i++)
{
for(jmax=i,max=fabs(A[i][i]),j=i+1;j<m+1;j++)
if(fabs(A[j][i])>max)
{
max=fabs(A[j][i]);
jmax=j;
}
if(jmax>i)
{
for(j=i;j<m+1;j++)
{
max=A[i][j];
A[i][j]=A[jmax][j];
A[jmax][j]=max;
}
for(j=0;j<m+1;j++)
{
max=identity[i][j];
identity[i][j]=identity[jmax][j];
identity[jmax][j]=max;
}
}
for(j=m;j>=0;j--) identity[i][j]/=A[i][i];
for(j=m;j>=i;j--) A[i][j]/=A[i][i];
for(j=i+1;j<m+1;j++)
{
for(int k=m;k>=0;k--) identity[j][k]-=identity[i][k]*A[j][i];
for(int k=m;k>=i;k--) A[j][k]-=A[i][k]*A[j][i];
}
}
for(i=m;i>=0;i--)
{
for(int k=0;k<m+1;k++)
for(j=0;j<i;j++)
identity[j][k]-=A[j][i]*identity[i][k];
}
diR= new double [m+1];
for(i=0;i<m+1;i++) diR[i]=identity[i][i];
for(i=0;i<m+1;i++) delete [] identity[i];
delete [] identity;
for(i=0;i<m+1;i++) delete [] A[i];
delete [] A;
}
void scala::preobrazovanie()
{
int i;
double normY=Norm(y);
tetaY= new double [m+1];
for(i=0;i<m+1;i++) tetaY[i]=teta[i]*normY/sqrt(tmpnorm[i]);
}
int scala::solve()
{
if(!init()) return 0;
printf("\n\t Исходный вектор отклика(Y)и матрица(X) :\n\n");
print(x,y,n,m+1);
if(!scaling()) return 0;
printf("\n\n\t Шкалированный вектор отклика(Z)и матрица(W) :\n\n");
print(W,Z,n,m+1);
solve_r();
teta= new double [m+1];
gauss(R,teta,r);
printf("\n\n\t Оценки параметров(teta) для шкалированных данных :\n\n");
for(int i=0;i<m+1;i++) printf("\t %lf\n",teta[i]);
preobrazovanie();
printf("\n\n\t Оценки параметров(tetaY) для исходных данных :\n\n");
for(int i=0;i<m+1;i++) printf("\t %lf\n",tetaY[i]);
obrtX(x);
proverka_gipotez();
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
class scala as;
as.solve();
return 0;
}
4. Тестирование
· Исходные данные и модели
Исходными данными являются данные о уровне относительной опасности выбросов загрязняющих веществ в городах России и набор данных, характеризующий данные города с точки зрения промышленного производства. В результате исследования можно выявить какие из отраслей промышленности наиболее сильно влияют на окружающую среду и прогнозировать насколько изменится загрязнение при изменении промышленного производства в городе.
Исходные данные:
Y-Опасность зазрязнения;
X1 - металлургическая промышленность;
Х2 – хим/нефтехимическая промышленность;
Х3 – машиностроение и металлообработка;
Х4 - легкая и целлюлозно-бумажная промышленность;
Х5 – топливная промышленность.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.