Проверить, является ли данный вектор собственным для данной матрицы - 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

Объяснение кода листинга программы

В данном коде:

  1. mul-matr-vect - функция, которая умножает матрицу на вектор.
  2. norm - функция, которая вычисляет квадрат длины вектора.
  3. is-eigen - функция, которая проверяет, является ли вектор собственным для матрицы. Код проверяет, является ли вектор '(2 1) собственным для матрицы ((0 1) (1 0)). В этом случае, вектор является собственным, так как он удовлетворяет условию is-eigen. Код также проверяет, является ли вектор '(2 2) собственным для матрицы ((0 1) (1 0)). В этом случае, вектор не является собственным, так как он не удовлетворяет условию is-eigen.

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы