; ROW_COL - КОЛИЧЕСТВО СТРОК И СТОЛБЦОВ МАТРИЦЫ
( SETQ ROW_COL 0)
(SETQ INPUT (OPEN " D: \MATRIX. TXT": DIRECTION: INPUT))
(SETF ROW_COL (READ INPUT))
; MATRIX - МАТРИЦА ДЛЯ ВЫЧИСЛЕНИЯ
( SETQ MATRIX (MAKE-ARRAY (LIST ROW_COL ROW_COL): ELEMENT-TYPE 'INTEGER: INITIAL-ELEMENT 0))
(SETF MATRIX (READ INPUT))
; ПОЛУЧАЕМ СВОБОДНЫЕ ЧЛЕНЫ
( SETQ B (MAKE-ARRAY ROW_COL: ELEMENT-TYPE 'INTEGER: INITIAL-ELEMENT 0))
; ПОЛУЧАЕМ МАТРИЦУ
( SETQ B (READ INPUT))
(CLOSE INPUT)
(DEFUN METHOD_GAUS (MATRIX ARRAY_B R_C)
; ОБЪЯВЛЛЯЕМ ПЕРЕМЕННЫЕ
; ИТЕРАТОРЫ
( DECLARE (SPECIAL I))
(DECLARE (SPECIAL J))
(DECLARE (SPECIAL A))
(DECLARE (SPECIAL B))
(DECLARE (SPECIAL X))
; ВРЕМЕННАЯ ПЕРЕМЕННАЯ
( DECLARE (SPECIAL NUMB))
; A - ВРЕМЕННАЯ МАТРИЦА
( SETQ A (MAKE-ARRAY (LIST R_C R_C): ELEMENT-TYPE 'INTEGER: INITIAL-ELEMENT 0))
(SETF A MATRIX)
; В - МАТРИЦА СВОБОДНЫХ ЧЛЕНОВ
( SETQ B (MAKE-ARRAY R_C: ELEMENT-TYPE 'INTEGER: INITIAL-ELEMENT 0))
(SETF B ARRAY_B)
; X - МАССИВ РЕШЕНИЙ
( SETQ X (MAKE-ARRAY R_C: ELEMENT-TYPE 'INTEGER: INITIAL-ELEMENT 0))
; ВЫПОЛНЯЕМ ПРЕОБРАЗОВАНИЯ СТРОК
( DO
((P 0))
((>= P (- R_C 1)))
(DO
((I (+ P 1)))
((>= I R_C))
(SETQ NUMB (/ (AREF A I P) (AREF A P P)))
(DO
((J P))
((>= J R_C))
(SETF (AREF A I J) (- (AREF A I J) (* (AREF A P J) NUMB)))
(SETQ J (+ J 1))
)
(SETF (AREF B 0 I) (- (AREF B 0 I) (* (AREF B 0 P) NUMB)))
(SETQ I (+ I 1))
)
(SETQ P (+ P 1))
)
(SETF (AREF X (- R_C 1)) (FLOAT (/ (AREF B 0 (- R_C 1)) (AREF A (- R_C 1) (- R_C 1)))))
; ПОЛУЧИЛИ СТУПЕНЧАТУЮ МАТРИЦУ
; НАХОДИМ X
( DO
((I (- R_C 2)))
((< I 0))
(SETQ NUMB 0)
(DO
((J (+ I 1)))
((>= J R_C) X)
(SETQ NUMB (+ NUMB (* (AREF A I J) (AREF X J))))
(SETQ J (+ J 1))
)
(SETF (AREF X I) (FLOAT (/ (- (AREF B 0 I) NUMB) (AREF A I I))))
(SETQ I (- I 1))
)
X
)
; ПРИМЕНЯЕМ МЕТОД ГАУССА ДЛЯ ЗАДАННОЙ МАТРИЦЫ
( METHOD_GAUS MATRIX B ROW_COL)
; ФУНКЦИЯ ВЫВОД МАССИВА X
( DEFUN PRINT_RES (MATR_X LEN)
(DO
((I 0))
((>= I LEN))
(PRINT (LIST 'X I '= (AREF MATR_X I)) OUTPUT)
(SETQ I (+ I 1))
)
)
; ВЫВОД МАССИВА X В ФАЙЛ
( SETQ OUTPUT (OPEN " D: \RESULT. TXT": DIRECTION: OUTPUT))
(PRINT_RES X ROW_COL)
(TERPRI OUTPUT)
(CLOSE OUTPUT)
Пример выполнения программы
Пример 1.
Рисунок 3 - Входные данные
Рисунок 4 - Выходные данные
Пример 2.
Рисунок 5 - Входные данные
Рисунок 6 - Выходные данные
Пример 3.
Рисунок 7 - Входные данные
Рисунок 8 - Выходные данные
Заключение
Помимо аналитического решения СЛАУ, метод Гаусса также применяется для нахождения матрицы, обратной к данной, определения ранга матрицы, численного решения СЛАУ в вычислительной технике.
Итогом работы можно считать созданную функциональную модель решения системы линейных алгебраических уравнений методом Гаусса. Данная модель применима к невырожденным матрицам с одинаковым количеством строк и столбцов. Созданная функциональная модель и ее программная реализация могут служить органической частью решения более сложных задач.
Список использованных источников и литературы
1. Васильев Ф.П. Численные методы решения экстремальных задач. [Текст] / Ф.П. Васильев - М.: Наука, 2002. C.415.
2. Калиткин Н.Н. Численные методы. [Электронный ресурс] / Н.Н. Калиткин. - М.: Питер, 2001. С.504.
3. Кнут Д.Э. Искусство программирования. Основные алгоритмы [Текст] / Д.Э. Кнут. - М.: Вильямс, 2007. Т.1. - 712 с.
4. Метод Гаусса [Электронный ресурс] - Режим доступа: https://www.wikipedia.org/wiki/Метод_Гаусса.
5. Степанов П.А. Функциональное программирование на языке Lisp. [Электронный ресурс] / П.А. Степанов, А.В. Бржезовский. - М.: ГУАП, 2003. С.79.