int LU_fun_SLAY int cnt_str double mass double LU double int double su

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
int LU_fun_SLAY( int cnt_str, double **mass, double **&LU, double *&x ) {
int i, j, k;
double sum;
x = new double [ cnt_str ];
LU = new double *[ cnt_str ];//создаём массив под матрицу LU
for( i = 0; i < cnt_str; i++ )
LU[ i ] = new double [ cnt_str ];
for( i = 0; i < cnt_str; i++ ){
for( j = 0; j < cnt_str; j++ ) {
sum = 0;
if( i <= j ) {
for( k = 0; k < i ;k++ )
sum += LU[ i ][ k ] * LU[ k ][ j ];
LU[ i ][ j ] = mass[ i ][ j ] - sum; //вычисляем элементы верхней треугольной матрицы
} else {
for( k = 0; k < j; k++ )
sum += LU[ i ][ k ] * LU[ k ][ j ];
if( LU[ j ][ j ] == 0 )
return 0;
LU[ i ][ j ] = ( mass[ i ][ j ] - sum ) / LU[ j ][ j ]; //вычисляем элементы нижней треугольной матрицы
}
}
}
double *y = new double [ cnt_str ]; //временная переменная для хранения промежуточных значений
for( i = 0 ; i < cnt_str; i++ ) { //вычисление y
sum = 0;
for( j = 0; j < i; j++ )
sum += LU[ i ][ j ] * y[ j ];
y[ i ] = mass[ i ][ cnt_str ] - sum;
}
for( i = cnt_str - 1; i >= 0; i-- ) { //вычисление x
sum = 0;
for( j = i; j < cnt_str; j++ )
sum += LU[ i ][ j ] * x[ j ];
x[ i ] = ( y[ i ] - sum ) / LU[ i ][ i ];
}
delete []y;
return 1;
}