Реализация иерархии классов для решения системы линейных алгебраических уравнений
Решение системы линейных алгебраических уравнений методом Гаусса с выборкой ведущего элемента. Изучение особенности программной реализации алгоритма, составленной средствами разработки Microsoft Visual Studio. Проведение сложения и умножения двух матриц.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 22.03.2015 |
Размер файла | 702,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине «Программирование для ЭВМ»
Реализация иерархии классов для решения системы линейных алгебраических уравнений
Оглавление
Введение
1. Теоретические основы
1.1 Определения, обозначения
1.2 Метод Гаусса решения СЛУ
2. Особенности программной реализации
2.1 Иерархия классов
2.2 Блок-схема алгоритма программы
3.1 Основные классы
3.2 Вспомогательные функции
Заключение
Список литературы
Введение
Курсовая работа состоит из трех разделов.
Ш В первом разделе содержатся теоретические сведения о методах решения систем линейных уравнений.
Ш Второй раздел содержит программную реализацию используемых методов - листинг программы, написанной на языке C++, с подробными комментариями.
Ш Третий раздел включает особенности программной реализации алгоритма, составленной средствами разработки Microsoft Visual Studio.NET.
В данной программе реализован метод решения системы линейных алгебраических уравнений методом Гаусса с выборкой ведущего элемента. Помимо решения СЛАУ в программе можно подсчитать, определитель матрицы и провести сложение и умножение двух матриц.
Пользователю предоставляется выбор размерности искомых матриц и вариант вывода результата, в файл или на экран. Матрицы для всех вычислений генерируются случайным образом с помощью соответствующих функций. Программа реализована в виде удобного меню. Данные вводимые пользователем проверяются на корректность специальными функциями. Исходный код прилагается.
алгоритм уравнение программный матрица
1. Теоретические основы
1.1 Определения, обозначения
Определение 1. Системой линейных уравнений с неизвестными с действительными коэффициентами называется система выражений вида
(1)
где R. Элементы называются коэффициентами системы (1), - ее свободные члены. Если все , то система (1) называется однородной, иначе - неоднородной.
Определение 2. Совокупность вещественных чисел называется решением (1), если после подстановки их вместо соответственно во все уравнения (1) получаются тождества.
Определение 3. Если система (1) имеет хотя бы одно решение, то она называется совместной, если решений нет - несовместной.
Определение 4. Два решения и являются различными, если нарушается одно из равенств , …, .
Определение 5. Если система (1) имеет единственное решение, то она называется определенной, если у системы существует по крайней мере два различных решения, то система называется неопределенной.
Решить систему линейных уравнений - это значит выяснить, совместна она или нет, и в случае совместности найти все ее решения.
Условие совместности СЛУ.
Теорема 2. (теорема Кронекерра-Капелли). Для того, чтобы система (1) была совместной, необходимо и достаточно, чтобы ранг ее расширенной матрицы был равен рангу основной матрицы, т.е. .
Доказательство. Очевидно, что .
Для доказательства перепишем систему (1) в виде:
(4)
где выделены столбцы матрицы , являющиеся элементами R.
Необходимость. Если существует решение , то запись (4) означает, что столбец свободных членов есть линейная комбинация столбцов матрицы . Значит, добавление этого столбца не изменяет числа линейно независимых столбцов .
Достаточность. Пусть . В этом случае базисный минор матрицы является базисным и для . Это и означает, что столбец свободных членов есть линейная комбинация тех столбцов матрицы , в которых расположен базисный минор, а значит, и всех столбцов матрицы (остальные можно взять с коэффициентом 0). Очевидно, что коэффициенты этой линейной комбинации и являются решениями системы (1), т.е. есть хотя бы одно решение.
1.2 Метод Гаусса решения СЛУ
На практике чаще всего используют метод Гаусса построения решений СЛУ. При этом при исследовании и решении СЛУ производятся элементарные преобразования строк расширенной матрицы : перестановка строк (это соответствует перестановке уравнений системы), сложение строк (это соответствует сложению уравнений системы), умножение строк на отличное от нуля число (это соответствует умножению уравнения системы на отличное от нуля число). Очевидно, что при указанных преобразованиях получается система, эквивалентная данной. Следовательно, после элементарных преобразований строк расширенной матрицы получается расширенная матрица некоторой новой системы, эквивалентной данной системе.
Замечание. Перестановка в основной матрице двух столбцов соответствует в системе перестановке неизвестных вместе со своими координатами. Умножение столбца на число и сложение столбцов приводит к изменению коэффициентов только при одном неизвестном и значит к системе, не эквивалентной рассматриваемой.
Рассмотрим матрицу . Элементарными преобразованиями строк ее можно привести к ступенчатой матрице : :
( - некоторые вещественные числа). .
Выберем в матрице ненулевой минор порядка , т.е. базисный минор. Как и в теореме 5, §6 (о ступенчатой матрице), его можно выбрать на пересечении первых строк и столбцов, с которых начинаются ненулевые элементы строк. Этот минор верхнетреугольный и равен произведению . Будем считать, что этот минор расположен в левом верхнем углу матрицы (перестановкой столбцов матрицы и перенумерацией переменных этого всегда можно добиться). Нулевые строки матрицы отбросим (этому соответствуют уравнения с любым решением).
.
Далее все элементы базисного минора выше главной диагонали можно сделать равными нулю (как в теореме 5, §6), а элементы главной диагонали - равными 1 (умножением строки на ):
Т.о., исходная система (1) приведена к эквивалентной системе
Отсюда видно, что если , то система имеет единственное решение
, …, .
Если , то переменные - базисные, - свободные и придавая им произвольные значения , …, , получим решение:
2. Особенности программной реализации
2.1 Иерархия классов
Рисунок 2.1
2.2 Блок-схема алгоритма программы
Пример работы программы
При запуске программы выходит следующее меню.
1. Помощь (что же делает эта программа)
2. Начало работы
3. Выход
После выбора пункта 1 появиться следующая справка.
Если был выбран 2 пункта появиться еще одно меню, со следующим списком доступных команд.
1. Решение СЛАУ.
2. Нахождение определителя матрицы.
3. Поэлементное сложение двух матриц.
4. Поэлементное вычитание одной матрицы из другой.
5. Умножение матриц.
6. Возврат к предыдущему меню.
2.3 СЛАУ
Выбираем 1 пункт-решение СЛАУ. Сразу же необходимо ввести размер квадратной матрицы, элементами которой являются коэффициенты при X.
После ввода размерности будущей матрицы появиться список.
1. Печать СЛАУ и решения на экран.
2. Печать СЛАУ и решения в файл.
3. Вернуться назад.
Печать СЛАУ на экран
При выводе решения на экран или в файл можно выбрать как напечатать ответ и невязку.
1. В линию(как вектор строку)
2. В столбец(как вектор столбец)
Печать СЛАУ в файл
После выбора пункта печать в файл. Вводятся имя файла для вывода СЛАУ, решения и невязки. Потом, традиционно выбирается тип вывода решения и невязки(строка или столбец).
Пример вывода в файл строку и в столбец.
Для корректного отображения данных в блокноте следует проделать следующие действия.
Ввод размера матрицы
Выбор печати.
1. Вывод матрицы и определителя на экран.
2. В файл.
На экран и в файл
При выводе в файл на экран экран выводятся «done step1» и «done step2» что является своеобразным индикатором успешного печати.
Алгебраические операции «+», «-» и «*»
Для сложения и вычитания процедуры ввода \ вывода идентичны и различаются лишь результатом операции, поэтому рассмотрим лишь сложение и умножение матриц.
Стандартный выбор:
1. Вывод на экран.
2. Печать в файл.
Ввод имени фала вывода.
Пример вывода на экран и в файл.
Так как можно перемножать только сопряженные матрицы, т.е. то помимо стандартной посимвольной проверки вводимых данных осуществляется проверка сопряженности перемножаемых матриц.
Ввод размерностей 1ой и 2ой матрицы.
Если все введено верно то выбор - печать на экран или в файл.
В файл.
Вывод на экран и в файл.
3. Особенности программной реализации алгоритма
3.1 Основные классы
class my_matrix//базовый класс матрица произвольного размера
{
public:
double **a;//ячейки...массив
int i,//число строк
j;//число столбцов
my_matrix(){}//конструктор
~my_matrix(){}//деструктор
void my_matrix_set(int ii,int jj){} //установка размеров матрицы i на j
double get_(int i5,int j5) {} //возращает значение a[i5][j5] ячейки
void matrix_random(double aa=1.,double bb=5.){}//рандом
void swap_line(int k1,int k2) {}//меняет строки k1 и k2 искомой матрицы
//сложение строк. строка i умноженная на k прибавляется к строке i2
void line_sum_i_to_i2(int i_,int i2,double k){}
//умножение строки a[pos][] на число
void line_to_num(int pos,double k){}
public:
friend my_matrix* operator + (my_matrix aa,my_matrix bb);
friend my_matrix* operator -(my_matrix aa,my_matrix bb);
friend my_matrix* operator *(my_matrix aa,my_matrix bb);
friend my_matrix* operator *(my_matrix aa,my_matrix *bb);
};
class print//базовый класс печати
{
public:
void see_mat_console(my_matrix *b)//вывод матрицы на консоль
void see_mat_console(double **a,int nn) //вывод матрицы на консоль
////вывод СЛАУ(A|f) на консоль
//вывод корней(X) на консоль
//вывод в зависимости от параметра fl.
fl==1 то вывод СЛАУ
fl==2 печать ответов на экран в строку
fl==3 печать ответов на экран в столбец
void look_all_(double **a,my_matrix *x,my_matrix *b,int fl)
//вывод матрицы на консоль
kof==1 красивый вывод с a[][]
Kof==2 вывод без a[][]
void look_all_(my_matrix *m,int kof=1/*1 печать с a[][],2 без */)
void look_all_(double **a,int n2)
//вывод квадратной матрицы a[n2][n2] просмотр с a[][]
void look_all_(double **a1,int i_n2,int j_n3)
//вывод матрицы a[i_n2][j_n3] просмотр с a[][]
void look_all_file(char*fname,double **a,int n2,char*mode_/*app или out */)
//печать квадратной матрицы в файл с именем fname. определена дозапись или перезапись в зависимости от параметра mode_
void look_all_file(char*fname,double **a,int i_n2,int j_n3,char*mode_/*app или out */,int kof=1/*1 печать с a[][] 2печать только значений */)
//печать матрицы в файл с именем fname. определена дозапись или перезапись в зависимости от параметра mode_
void look_pogr(double **a,int n3,char* mark/**/)
//печать матрицы «вектора» в зависимости от mark
mark==lin печать в линию
mark==ver печать в столбец
void look_pogr_file(char*fname,double **a,int n3,char* mark,char* type_record/*app out*/)//печать погрешности в файл
};
class square_matrix:public my_matrix,print//класс наследник
{
public:int size; //размерность матрицы
public:square_matrix():my_matrix(){};//конструктор
void my_matrix_set(int y)
//сведение матрицы к треугольному виду методом Гаусса с выборкой ведущего элемента
//и подсчёт det
long double gauss_2()
//рассчет корней СЛАУ
//обратный проход gauss_(matrix*f)
void result_(my_matrix *b,my_matrix *x)
//обратный проход. Записывает ответы в матрицу Х...
bool good(my_matrix *b)
/*т.к. если система не была совместной то после прохода
методом гаусса получим a[n][n]==0 в то время как b[n] элемент в столбце свободных членов равен ненулю,
т.е. a[n][n]*X==b[n] <=> 0*X=какоето число.
т.е. для совмемстности системы достаточно проверит не
является ли нулём a[n][n] при b[n] не равнным нулю*/
void put_mat_file(my_matrix *b,char* fname,char *mode_,char*text/*,char*met*/)
void put_mat_ans_file(my_matrix *b,char* fname,char *mode_,char*text,char*met)
};
3.2 Вспомогательные функции
int chek_cin_int()//посимвольная проверка ввода
Выводит на экран сообщение с просьбой ввода размерности СЛАУ пока не будет введено целое число. Осуществляет посимвольную проверку вводимых данных. Возвращает введенное число.
int chek_cin_int(char *text)
//посимвольная проверка с выводом на экран содержимого массива *text
int chek_cin_int(char **text,int n)
//посимвольная проверка с выводом на экран содержимого массива **text
//где n число строк массива **text
void m1()// FAQ/Help о том что можно в этой программе
char* m2()/*enter output file name */
Выводит на экран сообщение с просьбой о вводе имени файла вывода. Возвращает имя файла.
int m3()//Ввод размерности СЛАУ
void m4(char *fname/*имя файла*/,char*tip/*печать ответов ver или lin*/,int n/*размер системы*/,int my_mode/*1 если печать в файл,-1 на экран*/)//меню СЛАУ
Генерирует СЛАУ. Решает её и в зависимости от параметров выводит на экран или в файл. В зависимости от параметра tip ответы и погрешность печатаются вертикально или горизонтально.
int m5()//подменю СЛАУ
Выводится меню из 3 пунктов: печать СЛАУ с погрешностью вычислений в файл, печать СЛАУ с погрешностью вычислений на экран и вернуться назад к предыдущему меню.
char* m6()//Выводиться меню из 2ух пунктов: печать результатов вертикально или горизонтально.
void slau_m()//Основное меню работы со СЛАУ.
В нем используются следующие функции m2() m3() m4() m5() m6().
int m8()//меню для m7
//меню для подсчёта определителя матрицы с выбором: печать на экран или в файл.
void m7()//Генерируется матрица и находится её определитель.
void A_plus_B()//Меню сложение 2ух матриц.
Функции считывания размерности и имени файла вывода встроены.
Выводит матрицы A B C, где матрица С рез-тат операции A+B.
void A_minus_B()//Меню вычитания 2ух матриц.
Функции считывания размерности и имени файла вывода встроены.
Выводит матрицы A B C, где матрица С рез-тат операции A-B.
void A_on_B()//Меню умножения 2ух матриц.
Содержит функции считывания размерности каждой матрицы, имени файла вывода.
Выводит матрицы A[n/k] B[k/m] C[n/m], где матрица С рез-тат операции A*B. Содержит функцию проверки корректности вводимых размерностей матриц т.е. для правильного ввода матрицы A и B должны быть сопряженными.
int menu_2()//меню содержащее подпункты, при выборе которых срабатывают следующие функции
1) SLAU // slau_m()
2) Det of matrix // m7()
3) A+B=?// A_plus_B()
4) A-B=?// A_minus_B()
5) A*B=?// A_on_B()
6) back//вернуться на уровень вверх ()
void menu()//подпункты, при выборе которых срабатывают следующие функции
1) help(FAQ)// m1();
2) start program// menu_2();
3) exit// exit(0); завершение работы программы
Главная функция main()
void main()
{
srand(time(NULL));
menu();
}
Заключение
В ходе работы были освоены основы объектно-ориентированного программирования, методы программирования с использованием структур и классов. Была написана программа на языке С++ среде разработки Microsoft Visual Studio.NET, в которой реализована иерархия классов и перегрузка функций, работа с динамической памятью.
Был освоен и реализован метод Гаусса решения системы линейных алгебраических уравнений с выборкой ведущего элемента. С помощью указанного метода численно рассчитывался определитель случайно сгенерированной матрицы. Также были реализованы основные операции над матрицами: сложение, умножение, вычитание.
По итогам работы была оформлена пояснительная записка в текстовом редакторе MS Word согласно установленным требованиям к оформлению результатов курсовой работы.
Список литературы
1. Голицына О.Л. Языки программирования: учеб. пособие. Издательство: «ИНФРА-М, Форум», 2010.
2. Программирование и алгоритмизация В.П. Аверкин, А.И. Бобровский, В.В. Веснич и др.; Под ред. А.Д. Хомоненко. - СПб.: Корона принт, 2009. - 252 с.
3. Архангельский А.Я. Программирование / А.Я. Архангельский. - М.: Бином, 2012. - 1151 с.
4. Павловская Т.А. Программирование на языке высокого уровня: Учебник для вузов, Питер, 2012.
Размещено на Allbest.ru
Подобные документы
Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Системы линейных алгебраических уравнений. Решение систем уравнений графическим способом. Разработка программного кода модуля, реализующего приближенное решение систем линейных уравнений графическим способом. Отладка программного модуля "Метод Гаусса".
курсовая работа [858,5 K], добавлен 01.12.2013Применение итерационных методов численного решения системы линейных алгебраических уравнений при вычислении на ЭВМ. Математические и алгоритмические основы решения задачи, метод Гаусса. Функциональные модели и блок-схемы, программная реализация решения.
курсовая работа [527,5 K], добавлен 25.01.2010Алгоритм решения систем линейных уравнений методом Гаусса, его этапы. Система уравнений для определения коэффициентов сплайна, представляющая собой частный случай систем линейных алгебраических уравнений. Программная реализация, тестовый пример.
курсовая работа [431,8 K], добавлен 15.06.2013Сущность и особенности языка программирования Си. Основные этапы алгоритма решения системы линейных алгебраических уравнений методом Гаусса, реализация программы для их расчета. Инструкции пользователя и программиста. Тестирование функции решения.
курсовая работа [153,9 K], добавлен 18.02.2013Проектирование приложения, позволяющего находить решение системы алгебраических линейных уравнений матричным методом. Выбор количества уравнений, заполнение значений коэффициентов системы уравнений и свободных членов, алгоритм решения линейных уравнений.
курсовая работа [939,4 K], добавлен 16.01.2014Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Постановка задачи, математические и алгоритмические основы решения системы линейных алгебраических уравнений. Решение системы данных уравнений методом Гаусса с выбором главного элемента по столбцу. Функциональные модели и блок-схемы решения задачи.
курсовая работа [428,9 K], добавлен 25.01.2010Преобразование матрицы системы линейных алгебраических уравнений (СЛАУ) с помощью алгоритма Гаусса. Решение задачи методом простой итерации. Создание блок-схемы и текста программы для решения СЛАУ, реализованной на языке программирования Turbo Pascal.
курсовая работа [1,2 M], добавлен 15.06.2013Приведение системы линейных алгебраических уравнений к треугольному виду прямым ходом метода Гаусса. Применение обратного хода метода вращений. Создание алгоритма, блок-схемы и кода программы. Тестовый пример решения уравнения и его проверка в MathCad.
лабораторная работа [164,3 K], добавлен 02.10.2013