Eig
Tính giá trị riêng và vector riêng bên phải của một ma trận vuông.
cpp
bool matrix::Eig(
matrix& eigen_vectors, // ma trận của các vector riêng
vector& eigen_values // vector của các giá trị riêng
);
1
2
3
4
2
3
4
Nghiệm phức của giá trị riêng và vector riêng
cpp
bool matrix::Eig(
matrix<complex>& eigen_vectors, // ma trận của các vector riêng
vector<complex>& eigen_values // vector của các giá trị riêng
);
1
2
3
4
2
3
4
Tham số
eigen_vectors
[out] Ma trận của các vector riêng thẳng đứng.
eigen_values
[out] Vector của các giá trị riêng.
Giá trị trả về
Trả về true nếu thành công, false nếu không.
Ghi chú
Nếu gặp phải nghiệm phức khi tính giá trị riêng, quá trình tính toán sẽ dừng lại và mã lỗi được đặt thành 4019 (ERR_MATH_OVERFLOW). Sử dụng phiên bản phức của phương thức Eig để có được nghiệm đầy đủ trong không gian phức.
Nếu một giá trị riêng phức có phần ảo bằng 0, thì đó là một giá trị riêng thực. Điều này có thể thấy trong ví dụ dưới đây.
Ví dụ
cpp
void OnStart()
{
matrix matrix_a =
{
{-3.474589, 1.106384, -9.091977, -3.925227 },
{-5.522139, 2.366887, -15.162351, -6.357512 },
{ 8.394926, -2.960067, 22.292115, 9.524129 },
{ 7.803242, -2.080287, 19.217706, 8.186645 }
};
matrix eigen_vectors;
vector eigen_values;
bool res = matrix_a.Eig(eigen_vectors, eigen_values);
Print("res=", res, " error=", GetLastError());
Print("Eigen vectors:\n", eigen_vectors, "\nEigen Values:\n", eigen_values);
//--- kiểm tra tính đúng đắn A * v = lambda * v
int vectors = 0;
for(ulong n = 0; n < eigen_values.Size(); n++)
{
vector eigen_vector = eigen_vectors.Col(n);
vector vector_d1 = eigen_vector * eigen_values[n];
vector vector_d2 = matrix_a.MatMul(eigen_vector);
ulong errors = vector_d1.Compare(vector_d2, 1e-13);
if(errors == 0)
vectors++;
}
Print("vectors=", vectors);
//--- nghiệm phức
matrix<complex> eigen_vectors_c;
vector<complex> eigen_values_c;
ResetLastError();
res = matrix_a.Eig(eigen_vectors_c, eigen_values_c);
Print("res=", res, " error=", GetLastError());
Print("Eigen vectors:\n", eigen_vectors_c, "\nEigen Values:\n", eigen_values_c);
//--- kiểm tra tính đúng đắn A * v = lambda * v
matrixc matrix_c;
matrix_c.Assign(matrix_a);
vectors = 0;
for(ulong n = 0; n < eigen_values_c.Size(); n++)
{
vectorc eigen_vector_c = eigen_vectors_c.Col(n);
vectorc vector_c1 = eigen_vector_c * eigen_values_c[n];
vectorc vector_c2 = matrix_c.MatMul(eigen_vector_c);
ulong errors = vector_c1.Compare(vector_c2, 1e-13);
if(errors == 0)
vectors++;
}
Print("vectors=", vectors);
}
/* Kết quả
res=true error=4019
Eigen vectors:
[[0.2649667608713664]
[0.4488818803991876]
[-0.6527335897527492]
[-0.5497604331807768]]
Eigen Values:
[28.94158645962942]
vectors=1
res=true error=0
Eigen vectors:
[[(0.2649667608713664,0),(0.2227392219204762,0.3745470492013296),(0.403285439089771,-0.1345146135716524),(-0.2050778513598178,0)]
[(0.4488818803991876,0),(-0.2613452530342438,-0.3685707727819327),(-0.3968506126372395,0.5257002255533059),(0.8014703373356256,0)]
[(-0.6527335897527492,0),(-0.3418479634708521,-0.3299830378162041),(-0.3553021031180292,-0.03685418759727989),(-0.05618703726964112,0)]
[(-0.5497604331807768,0),(0.523227993452828,0.3262508584080381),(0.3512835596143666,0.3666300350184092),(0.558955624442244,0)]]
Eigen Values:
[(28.94158645962942,0),(0.01022501104810897,0.02954980822331488),(0.01022501104810897,-0.02954980822331488),(0.4090215182743634,0)]
vectors=3
*/
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75