Проверить, является ли данный вектор собственным для данной матрицы - Lisp
Формулировка задачи:
Помогите как реализовать эту задачу?
Заданы матрица и вектор в виде двумерного числового массива и одномерного числового массива соответственно. Проверить, является ли данный вектор собственным для данной матрицы.
Заранее благодарен.
Решение задачи: «Проверить, является ли данный вектор собственным для данной матрицы»
textual
Листинг программы
;; Умножение матрицы на вектор (defun mul-matr-vect (matr vect) (mapcar (lambda (row) (apply '+ (mapcar '* row vect))) matr)) ==> MUL-MATR-VECT (mul-matr-vect '((1 2) (3 4)) '(0 1)) ==> (2 4) ;; Квадрат нормы вектора (defun norm (vect) (apply '+ (mapcar (lambda (x) (* x x)) vect))) ==> NORM (norm '(1 2 3)) ==> 14 ;; Является ли vect собственным вектором matr (defun is-eigen (matr vect) (let* ((test (mul-matr-vect matr vect)) (norm-v (norm vect)) (norm-t (norm test))) (equal (mapcar (lambda (x) (/ x norm-v)) vect) (mapcar (lambda (x) (/ x norm-t)) test)))) ==> IS-EIGEN (is-eigen '((0 1) (1 0)) '(2 2)) ;; Собственный вектор (1 1) при собств. значении = 1 ==> T (is-eigen '((0 1) (1 0)) '(2 1)) ;; а этот - нет ==> NIL
Объяснение кода листинга программы
В данном коде:
mul-matr-vect
- функция, которая умножает матрицу на вектор.norm
- функция, которая вычисляет квадрат длины вектора.is-eigen
- функция, которая проверяет, является ли вектор собственным для матрицы. Код проверяет, является ли вектор'(2 1)
собственным для матрицы((0 1) (1 0))
. В этом случае, вектор является собственным, так как он удовлетворяет условиюis-eigen
. Код также проверяет, является ли вектор'(2 2)
собственным для матрицы((0 1) (1 0))
. В этом случае, вектор не является собственным, так как он не удовлетворяет условиюis-eigen
.