Смекни!
smekni.com

ЛИСП-реализация операций над матрицами (стр. 2 из 2)

RES_MATRIX – результирующая матрица;

OUTPUT_STREAM – выходной поток;

I, J P – рабочие переменные.

Рисунок 1 – Функциональная модель решения задачи для функции MODUL1

Рисунок 2 – Функциональная модель решения задачи для функции MODUL2


Рисунок 3 – Блок-схема решения задачи для функции SUM_MATRIX

Рисунок 4 – Блок-схема решения задачи для функции SUBTR_MATRIX

Рисунок 5 – Блок-схема решения задачи для функции MULT_NUMBER

Рисунок 6 – Блок-схема решения задачи для функции MULT_MATRIX

Рисунок 7 – Блок-схема решения задачи для функции FLIP


4 Программная реализация решения задачи

;СЧИТЫВАЕМ МАТРИЦУ

(SETF ROW_COL 0)

(SETQ INPUT_STREAM (OPEN " D:\MATRIX.TXT" :DIRECTION :INPUT))

;ПОЛУЧАЕМ РАЗМЕРНОСТЬ ПЕРВОЙ МАТРИЦЫ

(SETQ ROW_COL1 (READ INPUT_STREAM))

;ПОЛУЧАЕМ МАТРИЦУ

(SETF MATRIX1 (READ INPUT_STREAM))

;ПОЛУЧАЕМ СПИСОК ЧИСЕЛ, НА КОТОРЫЕ БУДЕМ УМНОЖАТЬ МАТРИЦУ

(SETQ LIST_NUM1 (READ INPUT_STREAM))

;ПОЛУЧАЕМ РАЗМЕРНОСТЬ ВТОРОЙ МАТРИЦЫ

(SETQ ROW_COL2 (READ INPUT_STREAM))

;ПОЛУЧАЕМ МАТРИЦУ

(SETF MATRIX2 (READ INPUT_STREAM))

;ПОЛУЧАЕМ СПИСОК ЧИСЕЛ, НА КОТОРЫЕ БУДЕМ УМНОЖАТЬ МАТРИЦУ

(SETQ LIST_NUM2 (READ INPUT_STREAM))

(CLOSE INPUT_STREAM)

;ЗАПИСЫВАЕМ ЧИСЛО СТРОК И СТОЛБЦОВ МАТРИЦЫ 1

(SETQ ROW1 (CAR ROW_COL1))

(SETQ COL1 (CADR ROW_COL1))

;ЗАПИСЫВАЕМ ЧИСЛО СТРОК И СТОЛБЦОВ МАТРИЦЫ 2

(SETQ ROW2 (CAR ROW_COL2))

(SETQ COL2 (CADR ROW_COL2))

;СЛОЖЕНИЕ МАТРИЦ

(DEFUN SUM_MATRIX (MATR1 MATR2 R1 R2 C1 C2)

;МАССИВ СУММЫ ДВУХ МАТРИЦ

(DECLARE (SPECIAL RES_MATRIX))

;ЕСЛИ ЧИСЛО СТРОК МАТРИЦЫ 1 НЕ РАВНО ЧИСЛУ СТРОК И СТОЛБЦОВ МАТРИЦЕ 2, ТО СЛОЖЕНИЕ МАТРИЦ НЕВОЗМОЖНО

(IF (OR (/= R1 R2) (/= C1 C2)) '"It is not possible to calculate the sum of matrices"

(PROGN

(SETQ RES_MATRIX (MAKE-ARRAY (LIST R1 C1) :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT 0))

(DO

((I 0))

((>= I R1))

(DO

((J 0))

((>= J C1))

(SETF (AREF RES_MATRIX I J) (+ (AREF MATR1 I J) (AREF MATR2 I J)))

(SETQ J (+ J 1))

)

(SETQ I (+ I 1))

)

RES_MATRIX

)

)

)

;ВЫЧИТАНИЕ МАТРИЦ

(DEFUN SUBTR_MATRIX (MATR1 MATR2 R1 R2 C1 C2)

;МАССИВ РАЗНОСТИ ДВУХ МАТРИЦ

(DECLARE (SPECIAL RES_MATRIX))

;ЕСЛИ ЧИСЛО СТРОК МАТРИЦЫ 1 НЕ РАВНО ЧИСЛУ СТРОК И СТОЛБЦОВ МАТРИЦЕ 2, ТО ВЫЧИТАНИЕ МАТРИЦ НЕВОЗМОЖНО

(IF (OR (/= R1 R2) (/= C1 C2)) '"It is not possible to calculate the difference matrix"

(PROGN

(SETQ RES_MATRIX (MAKE-ARRAY (LIST R1 C1) :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT 0))

(DO

((I 0))

((>= I R1))

(DO

((J 0))

((>= J C1))

(SETF (AREF RES_MATRIX I J) (- (AREF MATR1 I J) (AREF MATR2 I J)))

(SETQ J (+ J 1))

)

(SETQ I (+ I 1))

)

RES_MATRIX

)

)

)

;ПРОИЗВЕДЕНИЕ МАТРИЦЫ НА ЧИСЛО L

(DEFUN MULT_NUMBER (MATR ROW COL L)

(DECLARE (SPECIAL RES_MATRIX))

;ОБНУЛЯЕМ МАТРИЦУ РЕЗУЛЬТАТ

(SETQ RES_MATRIX (MAKE-ARRAY (LIST ROW COL) :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT 0))

(DO

((I 0))

((>= I ROW))

(DO

((J 0))

((>= J COL))

(SETF (AREF RES_MATRIX I J) (* L (AREF MATR I J)))

(SETQ J (+ J 1))

)

(SETQ I (+ I 1))

)

RES_MATRIX

)

;ПРОИЗВЕДЕНИЕ МАТРИЦ

(DEFUN MULT_MATRIX (MATR1 MATR2 R1 R2 C1 C2)

(DECLARE (SPECIAL TEMP))

(DECLARE (SPECIAL RES_MATRIX))

(SETQ TEMP 0)

(IF (/= C1 R2) '"It is not possible to calculate products of matrices"

(PROGN

;ОБНУЛЯЕМ МАТРИЦУ РЕЗУЛЬТАТ

(SETQ RES_MATRIX (MAKE-ARRAY (LIST R1 C2) :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT 0))

(DO

((I 0))

((>= I R1))

(DO

((J 0))

((>= J C2))

(SETQ TEMP 0)

(DO

((P 0))

((>= P C1))

(SETQ TEMP (+ TEMP (* (AREF MATR1 I P) (AREF MATR2 P J))))

(SETQ P (+ P 1))

)

(SETF (AREF RES_MATRIX I J) TEMP)

(SETQ J (+ J 1))

)

(SETQ I (+ I 1))

)

RES_MATRIX

)

)

)

;ТРАНСПОНИРОВАНИЕ МАТРИЦЫ

(DEFUN FLIP (MATR ROW COL)

(DECLARE (SPECIAL RES_MATRIX))

;ЕСЛИ КОЛИЧЕСТВО СТРОК И СТОЛБЦОВ НЕ РАВНО МАТРИЦУ НЕЛЬЗЯ ТРАНСПОНИРОВАТЬ

(IF (/= ROW COL) '"It is not possible to flip matrice"

(PROGN

;ОБНУЛЯЕМ МАТРИЦУ РЕЗУЛЬТАТ

(SETQ RES_MATRIX (MAKE-ARRAY (LIST COL ROW) :ELEMENT-TYPE 'INTEGER :INITIAL-ELEMENT 0))

(DO

((I 0))

((>= I ROW))

(DO

((J 0))

((>= J COL))

(SETF (AREF RES_MATRIX I J) (AREF MATR J I))

(SETQ J (+ J 1))

)

(SETQ I (+ I 1))

)

RES_MATRIX

)

)

)

;ПРИМЕНЕНИЕ "УМНОЖЕНИЯ МАТРИЦЫ НА ЧИСЛО" ДЛЯ СПИСКА

(DEFUN MULT1 (NUM)

(PRINT (MULT_NUMBER MATRIX1 ROW1 COL1 NUM) OUTPUT_STREAM)

)

;ПРИМЕНЕНИЕ "УМНОЖЕНИЯ МАТРИЦЫ НА ЧИСЛО" ДЛЯ СПИСКА

(DEFUN MULT2 (NUM)

(PRINT (MULT_NUMBER MATRIX2 ROW2 COL2 NUM) OUTPUT_STREAM)

)

;ЗАПИСЫВАЕМ РЕЗУЛЬТАТ

(SETQ OUTPUT_STREAM (OPEN " D:\RESULT.TXT" :DIRECTION :OUTPUT))

;МАТРИЦА 1

(PRINT (LIST 'MATRIX_1 MATRIX1) OUTPUT_STREAM)

;МАТРИЦА 2

(PRINT (LIST 'MATRIX_2 MATRIX2) OUTPUT_STREAM)

(PRINT '---------------------------- OUTPUT_STREAM)

;СЛОЖЕНИЕ МАТРИЦ

(PRINT (LIST 'SUM_MATRIX (SUM_MATRIX MATRIX1 MATRIX2 ROW1 ROW2 COL1 COL2)) OUTPUT_STREAM)

;РАЗНОСТЬ МАТРИЦ

(PRINT (LIST 'DIFFERENCE_MATRIX (SUBTR_MATRIX MATRIX1 MATRIX2 ROW1 ROW2 COL1 COL2)) OUTPUT_STREAM)

;УМНОЖЕНИЕ МАТРИЦ

(PRINT (LIST 'MULTIPLICATION_MATRIX (MULT_MATRIX MATRIX1 MATRIX2 ROW1 ROW2 COL1 COL2)) OUTPUT_STREAM)

(PRINT '---------------------------- OUTPUT_STREAM)

;ТРАНСПОНИРОВАНИЕ МАТРИЦЫ1

(PRINT (LIST 'FLIP_MATRIX1 (FLIP MATRIX1 ROW1 COL1)) OUTPUT_STREAM)

;ТРАНСПОНИРОВАНИЕ МАТРИЦЫ2

(PRINT (LIST 'FLIP_MATRIX2 (FLIP MATRIX2 ROW2 COL2)) OUTPUT_STREAM)

(PRINT '---------------------------- OUTPUT_STREAM)

;УМНОЖЕНИЕ МАТРИЦЫ1 НА ЧИСЛО

(PRINT 'MULTIPLICATION_MATRIX_ON_NUMBER OUTPUT_STREAM)

(PRINT (LIST 'NUMBERS LIST_NUM1) OUTPUT_STREAM)

(PRINT 'MATRIX1 OUTPUT_STREAM)

(MAPCAR 'MULT1 LIST_NUM1)

(PRINT '---------------------------- OUTPUT_STREAM)

;УМНОЖЕНИЕ МАТРИЦЫ2 НА ЧИСЛО

(PRINT (LIST 'NUMBERS LIST_NUM2) OUTPUT_STREAM)

(PRINT 'MATRIX2 OUTPUT_STREAM)

(MAPCAR 'MULT2 LIST_NUM2)

(TERPRI OUTPUT_STREAM)

(CLOSE OUTPUT_STREAM)


5 Пример выполнения программы

Пример 1.

Рисунок 8 – Входные данные

Рисунок 9 – Выходные данные

Пример 2.

Рисунок 10 – Входные данные


Рисунок 11 – Выходные данные


Заключение

Понятие матрицы возникло в связи с исследованием систем линейных уравнений. Однако в последующем это понятие оказалось настолько плодотворным, что стало основой нового раздела математики – матричной алгебры. Матричная алгебра получила широкое распространение при исследовании многих процессов, в том числе и экономических. Основные операции, которые производятся над матрицами: сложение, вычитание, умножение, транспонирование, а также умножение матрицы на число – являются основными операциями алгебры матриц – теории, играющей весьма важную роль в различных разделах математики и естествознания.

Итогом работы можно считать созданную функциональную модель для реализации операций над матрицами. Данная модель применима к матрицам любой размерности. Созданная функциональная модель и ее программная реализация могут служить органической частью решения более сложных задач.


Список использованных источников и литературы

1. Гантмахер, Ф.Р. Теория матриц (издание третье). [Электронный ресурс] / Ф.Р.Гантмахер. – М.: Наука, 2002, С. 218.

2. Дадаян, А.А. Алгебра и геометрия. [Текст] / А.А Дадаян, В.А.Дударенко. – М.: Минск, 1999. С. 342.

3. Калиткин, Н.Н. Численные методы. [Электронный ресурс] / Н.Н.Калиткин. – М.: Питер, 2001. С. 504.

4. Камалян, Р.З. Высшая математика. [Текст] / Р.З.Камалян. – М.: ИМСИТ, 2004. С.310.

5. Степанов, П.А. Функциональное программирование на языке Lisp. [Электронный ресурс] / П.А.Степанов, А.В.Бржезовский. – М.: ГУАП, 2003. С. 79.