Вы находитесь на странице: 1из 3

//Jacobbi method

#include <stdio.h>
#include <math.h>

int main(void)
{
int n = 4;
double e = pow(10.0,-8.0);
double S[5][5],ST[5][5],C[5][5],Cs[5][5];
double M[5][5] = { {0,0, 0, 0, 0},
{0,5, 1, 5, 3},
{0,1, 10,4, 1},
{0, 5, 4, 4, 1},
{0, 3, 1, 1, 1} };
double max;
int k ;
int l ;
double tow, t, c, s;

while (1)
{
//finding max(Mij)
max = M[1][2] * M[1][2];
k = 1;
l = 2;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
if (i != j)
{
if (max <= M[i][j]*M[i][j])
{
max = M[i][j] * M[i][j];
if (i >= j)
{
k = j;
l = i;
}
else
{
k = i;
l = j;
}
}
}
}
//finding S component(S is diagonalization matrix)
tow = (-M[l][l] + M[k][k]) / (2 * M[k][l]);
if (abs(-tow + sqrt(1 + pow(tow, 2))) <=
abs(-tow - sqrt(1 + pow(tow, 2))))
{
t = -tow + sqrt(1 + pow(tow, 2));
c = 1 / (sqrt(1 + pow(t, 2)));
s = t*c;
}
else{
t = -tow - sqrt(1 + pow(tow, 2));
c = 1 / (sqrt(1 + pow(t, 2)));
s = t*c;

}
//determine S
for (int i=1;i<=n;i++)
for (int j = 1; j <= n; j++)
{
if (i == j)
S[i][j] = 1;
else
S[i][j] = 0;
}
S[l][l]=c;
S[k][k] = c;
S[k][l] = s;
S[l][k] = -s;

//Transpose S
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
ST[j][i] = S[i][j];
}

}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
C[i][j] = 0;
Cs[i][j] = 0;
}
}

//M'=ST*M*S
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
for (int w = 1; w <= n; w++)
C[i][j] = C[i][j] + ST[i][w] * M[w][j];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
for (int w = 1; w <= n; w++)
Cs[i][j] = Cs[i][j] + C[i][w] * S[w][j];
}

for (int i=1;i<=n;i++)


for (int j = 1; j <= n; j++)
{
M[i][j] = Cs[i][j];
}

if (max <= e)
break;
}
//print M
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
printf("%f ", M[i][j]);
}
printf("\n");
}

return 0;
}

Вам также может понравиться