학교수업, CS/수치해석

고유치(파데브-레브리어의 알고리즘)

빨대도둑 2022. 11. 30. 13:14

고유치

고유치의 성질

  1. 0이 행렬 A의 고유치가 되기 위한 필요충분조건은 행렬 A가 singular인 것이다
  2. k가 임의의 실수이 ㄴ경우 행렬의 고유치는 원래의 행렬 A의 고유치의 k배에 해당하는 값이 된다
  3. 대각 행렬의 고유치는 그 대각 원소들이다
  4. 행렬 A의 고유치들의 합은 trace(A)가 된다
  5. 행렬 A의 고유치들의 곱은 행렬 A의 행렬식이 된다

 

고유백터의 성질

  1. 서로 다른 고유치에 해당하는 고유 벡터들은 서로 선형독립이다
  2. 실수들을 원소로 가지는 행렬 A의 고유 벡터들 중에 복소수가 있으면 그 들은 서로 켤레 복소수의 관계를 가지고 있다
  3. 임의의 실수 k에 대해서 행렬의 고유 벡터들은 행렬 A의 고유 벡터들과 같다

 

고유치들은 고유 벡터들을 어떻게 나열했는지에 따라 다른 위치에 나타나게 된다. 결국 같은 고유 벡터들을 사용하는 스펙트럼 행렬은 여러 종류가 나올 수 있다. 하지만 이들 스펙트럼 행렬들은 서로 밀접하게 연결되어 있고 동일하게 취급받는다. 

행렬 A의 특성 방정식이 중근을 가지는 경우에는 그 중근에 해당하는 고유 벡터들이 서로 독립적일 수도 있고 아닐 수도 있다. 서로 독립인 경우에는 모우드 행렬 P가 존재하고 서로 의존적인 경우에는 P가 존재하지 않는다. 왜냐하면 P는 정칙 행렬이어야 하기 때문이다.

 


파데브-레브리어의 알고리즘

<역행렬 구하는 수식>

#include <stdio.h>

void Faddeev_Leverrier(float original[20][20], float D_matrix[20][20][20], 
float AD_matrix[20][20], float coeff[21], int dim) {

	int row, column, i;
	int mul_index;

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++)

			AD_matrix[row][column] = 0;

	coeff[dim] = 1.0;

	for (i = 0; i < dim; i++) {

		for (row = 0; row < dim; row++)

			for (column = 0; column < dim; column++)

				D_matrix[i][row][column] = AD_matrix[row][column];

		for (row = 0; row < dim; row++)

			D_matrix[i][row][row] += coeff[dim - i];

		for (row = 0; row < dim; row++)

			for (column = 0; column < dim; column++) {

				AD_matrix[row][column] = 0;

				for (mul_index = 0; mul_index < dim; mul_index++)

					AD_matrix[row][column] += original[row][mul_index] * 
                    D_matrix[i][mul_index][column];

			}

		coeff[dim - i - 1] = 0.0;

		for (row = 0; row < dim; row++)

			coeff[dim - i - 1] -= AD_matrix[row][row];

		coeff[dim - i - 1] /= i + 1;

	}

}

void main() {

	int column, row, dim, mul_index;

	float original[20][20];
	float inverse[20][20], multiplied[20][20], coeff[21];
	float D_matrix[20][20][20], AD_matrix[20][20];

	printf("enter the dimension of matrix: ");

	scanf_s("%d", &dim);

	printf("enter the elements of matrix\n");

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++) {

			printf("A[%d,%d]=", row + 1, column + 1);

			scanf_s("%f", &original[row][column]);

		}

	printf("\n\n************************************\n");

	printf("entered matrxi A is :\n");

	for (row = 0; row < dim; row++) {

		for (column = 0; column < dim; column++) {

			printf("%10.3f", original[row][column]);

		}

		printf("\n");

	}

	Faddeev_Leverrier(original, D_matrix, AD_matrix, coeff, dim);

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++)

			inverse[row][column] = -1.0 * D_matrix[dim - 1][row][column] / coeff[0];

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++) {

			multiplied[row][column] = 0;

			for (mul_index = 0; mul_index < dim; mul_index++)

				multiplied[row][column] += original[row][mul_index] * 
                inverse[mul_index][column];
		}

	printf("\n\n************************************\n");

	printf("characteristic equation of matrix A is:\n");

	printf("\n 1 S**d", dim);

	for (row = dim - 1; row >= 0; row--)

		printf("\n %7.3f S**d", coeff[row], row);

	printf("\n\n*********************************\n");

	printf("inverse matrix of matrix A is: \n");

	for (row = 0; row < dim; row++) {

		for (column = 0; column < dim; column++)

			printf("%10.3f", inverse[row][column]);

		printf("\n");

	}

	printf("\n\n*********************************\n");

	printf("multiplied of matrix A and inverse matrix of A is: \n");

	for (row = 0; row < dim; row++) {

		for (column = 0; column < dim; column++)

			printf("%10.3f", multiplied[row][column]);

		printf("\n");

	}

}

 

<고유 벡터 계산 수식>

#include <stdio.h>

void Faddeev_Leverrier(float original[20][20], float D_matrix[20][20][20], 
float AD_matrix[20][20], float coeff[21], int dim) {

	int row, column, i;

	int mul_index;

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++)

			AD_matrix[row][column] = 0;

	coeff[dim] = 1.0;

	for (i = 0; i < dim; i++) {

		for (row = 0; row < dim; row++)

			for (column = 0; column < dim; column++)

				D_matrix[i][row][column] = AD_matrix[row][column];

		for (row = 0; row < dim; row++)

			D_matrix[i][row][row] += coeff[dim - i];

		for (row = 0; row < dim; row++)

			for (column = 0; column < dim; column++) {

				AD_matrix[row][column] = 0;

				for (mul_index = 0; mul_index < dim; mul_index++)

					AD_matrix[row][column] += original[row][mul_index] * 
                    D_matrix[i][mul_index][column];

			}
		coeff[dim - i - 1] = 0.0;

		for (row = 0; row < dim; row++)

			coeff[dim - i - 1] -= AD_matrix[row][row];

		coeff[dim - i - 1] /= i + 1;

	}

}

void main() {

	int column, row, dim, mul_index;

	int i, j;

	float original[20][20], coeff[21];

	float D_matrix[20][20][20], B_matrix[20][20];

	float eigen_value[20], eigen_vector[20][20][20];

	float AD_matrix[20][20], ftemp;

	printf("enter the dimension of matrix : ");

	scanf_s("%d", &dim);

	printf("enter the element of matrix\n");

	for (row = 0; row < dim; row++)

		for (column = 0; column < dim; column++) {

			printf("A[%d,%d]=", row + 1, column + 1);

			scanf_s("%f", &original[row][column]);

		}

	printf("\n\n****************************\n");

	printf("entered matrix A is : \n");

	for (row = 0; row < dim; row++) {

		for (column = 0; column < dim; column++) {

			printf("%10.3f", original[row][column]);

		}

		printf("\n");

	}

	Faddeev_Leverrier(original, D_matrix, AD_matrix, coeff, dim);

	printf("\n characteristic equations is \n");

	printf("  1   S***%d", dim);

	for (i = dim - 1; i >= 0; i--)

		printf("\n%7.3f  S**%d", coeff[i], i);

	printf("\n********************************\n");

	for (i = 0; i < dim; i++) {

		printf("please enter a eigen value of matrix : ");

		scanf_s("%f", &eigen_value[i]);

		for (row = 0; row < dim; row++)

			for (column = 0; column < dim; column++)

				eigen_vector[i][row][column] = D_matrix[dim - 1][row][column];

		ftemp = 1.0;

		for (j = 0; j < dim - 1; j++) {

			ftemp *= eigen_value[i];

			for (row = 0; row < dim; row++)

				for (column = 0; column < dim; column++)

					eigen_vector[i][row][column] += ftemp * 
                    D_matrix[dim - j - 2][row][column];

		}

	}

	printf("\n******************************\n");

	for (i = 0; i < dim; i++) {

		printf("for eigen value %7.3f eigen vector is \n", eigen_value[i]);

		for (row = 0; row < dim; row++) {

			for (column = 0; column < dim; column++)

				printf("%7.3f", eigen_vector[i][row][column]);

			printf("\n");

		}

	}

}