Поиск решений системы линейных уравнений методом Гаусса

ФЕДЕРАЛЬНОЕ АГЕНСТВО ПО ОБРАЗОВАНИЮ
Государственное образовательное учреждение
Высшего профессионального образования
«Нижегородский государственный университет им. Н.И.Лобачевского»
(ННГУ)
ЭКОНОМИЧЕСКИЙ ФАКУЛЬТЕТ
Кафедра «Экономическая информатика»
КУРСОВАЯ РАБОТА
по дисциплине: “Информатика и
программирование”
на тему:
Поискрешений системы линейных уравнений методом Гаусса
(Программистскими математическим вариантом)
 
Выполнил(ла)студент(ка)II курса
725-2 группы,очного отделения
 
(ф.и.о.)
__________
подпись
Научныйруководитель:
 
(ф.и.о.)
____________
подпись
Н.Новгород2008

СОДЕРЖАНИЕ
1.   Введение
2.   Постановка задачи
3.   Алгоритм решения.
4.   Исходный текст программы на С++.
5.   Тестирование программы
Вывод
Список литературы.

1.Ведение
Введение вобъектно-ориентированное программирование.
Объектно-ориентированноепрограммирование представляет собой чуть более автоматизированный способ программирования.Объектно-ориентированные программы – это не просто процедурные программы,переведенные на новый синтаксис. Они должны строится на новой философииразработки. Для них требуется новая стратегия программирования, которую частобывает трудно освоить .
Основная идея ООП:программа состоит из группы объектов, часто связанных между собой. В С++объекты описываются при помощи нового типа данных class. Класс включает в себянабор переменных (данных) и операций (методов или функций-членов), которыедействуют на эти переменные. Полученными объектами можно управлять при помощи сообщений.В ООП объекты включают в себя не только данные (данные-члены), но и методы(функции-члены) воздействия на эти данные. Эти две части в сочетании образуютфункциональную единицу программы. Другими словами, объекты содержат данные иметоды работы с этими данными. Ниже приведены три основных преимуществаобъектно-ориентированных программ по сравнению с эквивалентными программами,разработанными сверху вниз.
Сопровождение программы.Программы проще читать и понимать, ООП позволяет управлять сложностьюпрограммы, оставляя видимыми программисту только существенные детали.
Модификация программы(добавление или исключение возможностей). Вы можете часто делать дополнения илиисключения в программе, например при работе с базой данных, просто добавляя иисключая объекты. Новые объекты могут наследовать все свойства базовыхобъектов, необходимо только добавить или убрать отличающиеся свойства. Повторноеиспользование. Можно сохранить грамотно разработанный объект в наборе полезныхпрограмм и затем вставить его в новую программу с небольшими изменениями илибез изменений.
ООП полностью принадлежитк миру С++, поскольку в С нет основного ядра – абстрактного типа данных classПоэтому переписать процедурно-ориентированную программу какобъектно-ориентированную гораздо сложнее, чем просто подставить вместо одногоключевого слова другое.
ООП представляет собойтехнику программирования, которая позволяет рассматривать основные идеи какмножество объектов. Используя объекты, можно представить задачи, которыенеобходимо выполнить, их взаимодействие и любые заданные условия, которыедолжны быть соблюдены. Структура данных часто образует основы объектов; таким образомв С или С++ тип struct может образовывать элементарный объект. Связь с объектомможно организовать при помощи сообщений. Использование сообщений похоже навызов функций в процедурно-ориентированной программе. Когда объект получаетсообщение, вступают в действие методы, содержащиеся в объекте. Методы (их иногданазывают фунциями-членами) аналогичны функциям процедурно-ориентированногопрограммирования. Тем не менее метод является частью объекта, а не чем-тоотдельным, как было бы в процедурном аналоге.
Основные термины иположения ООП.
Инкапсуляция данных.
Этот термин включает всебя логическое связывание данных с конкретной операцией. Она так же означает,что они являются не -глобальными доступными всей программе, а локальными – доступнымитолько малой ее части. Инкапсуляция также автоматически подразумевает защитуданных. Именно для этого предназначена структура class в С++. В классеуправление функциональными деталями объекта осуществляется при помощиспецификаторов private, public, protected.
Иерархия классов.
В общем случае можнопредставить себе иерархию классов как родословную в генеалогическом древе, гдекласс С++ представляет собой шаблон для создания классов-потомков. Объекты,полученные из описания класса, называют экземплярами этого класса. Можно создатьиерархию классов с классом-родителем и несколькими классами-потомками. Основойдля этого являются производные классы.
Наследование.
Наследование в ООПпозволяет классу получать свойства другого класса объектов. Родительский классслужит шаблоном для производного класса; этот шаблон можно менять различнымиспособами. Наследование является важным положением, поскольку оно позволяет повторноиспользовать определение класса без значительных изменений в коде.
Полиморфизм.
Строится на описаннойвыше концепции наследования. Программа посылает одно и тоже сообщение какобъекту родительского класса, так и всем объектам производных классов. Иродительский класс, и классы-потомки ответят на сообщение соответствующимобразом. Полиморфизм дает возможность дополнять уже существующие частипрограммы.
Виртуальные функции.
Виртуальные функцииопределяются в родительском классе, а в производных классах происходит доопределениеэтих функций и для них создаются новые реализации. При работе с виртуальнымифункциями сообщения передаются как указатели, которые указывают на объектвместо прямой передачи объекту. Виртуальные функции используют таблицу дляадресной информации. Эта таблица инициализируется во время выполнения припомощи конструктора. Конструктор вызывается каждый раз, когда создается объектего класса. Задача конструктора в данном случае состоит в связываниивиртуальной функции с таблицей адресной информации. Во время компиляции адрес виртуальнойфункции неизвестен; вместо этого ей отводится позиция в таблице адресов.

2.Постановка задачи
С++ -языкпредметно-ориентированного программирования. Язык С++ поддерживает процедурнуюи объектно-ориентированную парадигмы программирования.
Объектно-ориентированноепрограммирование – это новый способ подхода к программированию. Такоепрограммирование, взяв лучшие черты структурного программирования, дополняетего новыми идеями, которые переводят в новое качество подход к созданиюпрограмм.
Наиболее важное понятиеязыков объектно-ориентированного программирования – это понятие объекта(object). Объект – это логическая единица, которая содержит данные и правила(методы) обработки этих данных. В языке С++ в качестве таких правил обработкивыступают функции, т. е. объект в Borland C++ объединяет в себе данные ифункции, обрабатывающие эти данные. Одним из самых главных понятий языка С++является понятие класса. В языке С++ для того, чтобы определить объект, надосначала определить его форму с помощью ключевого слова Ближайшей аналогиейкласса является структура. Память выделяется объекту только тогда, когда классиспользуется для его создания. Любой объект языка С++ имеет одинаковые атрибутыи функциональность с другими объектами того же класса. За создание своихклассов и поведение объектов этих классов полную ответственность несет сампрограммист. Работая в некоторой среде, программист получает доступ к обширнымбиблиотекам стандартных классов. Обычно, объект находится в некоторомуникальном состоянии, определяемом текущими значениями его атрибутов.Функциональность объектного класса определяется возможными операциями надэкземпляром этого класса.
Метод Гаусса для решенияСЛАУ.
МетодГаусса. (Карл Фридрих Гаусс (1777-1855) немецкий математик) В отличие отматричного метода и метода Крамера, метод Гаусса может быть применен к системамлинейных уравнений с произвольным числом уравнений и неизвестных. Метод Гаусса — один из основныхрезультатов линейной алгебры и аналитической геометрии, к нему сводятсямножество других теорем и методов линейной алгебры (теория и вычисление определителей,решение систем линейных уравнений, вычисление ранга матрицы и обратной матрицы,теория базисов конечномерных векторных пространств и т.д.).
Задача поискарешений системы линейных уравнений имеет не только самостоятельное значение, ночасто является составной частью алгоритма решения многих нелинейных задач.Основные методы решения СЛУ:
— методГаусса;
— методобращения матрицы;
— итерационные методы.
МатрицаA с элементами aij называетсяступенчатой, если она обладает следующими двумя свойствами:
1.        еслив матрице есть нулевая строка, то все строки ниже нее также нулевые;
2.        пустьaij не равное 0– первый ненулевой элемент в строке с индексом i,т.е. элементы ail = 0 при l i и l =
Ступенчатаяматрица выглядит так:
/>
Здесьтёмными квадратиками отмечены первые ненулевые элементы строк матрицы. Белымцветом изображаются нулевые элементы, серым цветом — произвольные элементы.
АлгоритмГаусса использует элементарные преобразования матрицы двух типов.
·          Преобразованиепервого рода: две строки матрицы меняются местами, и при этом знаки всехэлементов одной из строк изменяются на противоположные.
·          Преобразованиевторого рода: к одной строке матрицы прибавляется другая строка, умноженная напроизвольное число.
Элементарныепреобразования сохраняют определитель и ранг матрицы, а также множество решенийлинейной системы. Алгоритм Гаусса приводит произвольную матрицу элементарнымипреобразованиями к ступенчатому виду. Для ступенчатой квадратной матрицыопределитель равен произведению диагональных элементов, а ранг — числу ненулевыхстрок (рангом по определению называется размерность линейной оболочки строкматрицы).
МетодГаусса в математическом варианте состоит в следующем:
1.        ищемсначала ненулевой элемент в первом столбце. Если все элементы первогостолбца нулевые, то переходим ко второму столбцу, и так далее. Если нашлиненулевой элемент в k-й строке, то при помощиэлементарного преобразования первого рода меняем местами первую и k-ю строки, добиваясь того, чтобы первый элемент первойстроки был отличен от нуля;
2.        используяэлементарные преобразования второго рода, обнуляем все элементы первогостолбца, начиная со второго элемента. Для этого от строки с номером k вычитаем первую строку, умноженную на коэффициент ak1/a11 .
3.        переходимко второму столбцу (или j-му, если все элементыпервого столбца были нулевыми), и в дальнейшем рассматриваем только частьматрицы, начиная со второй строки и ниже. Снова повторяем пункты 1) и 2) до техпор, пока не приведем матрицу к ступенчатому виду.
Программистскийвариант метода Гаусса имеет три отличия от математического:
1.        индексыстрок и столбцов матрицы начинаются с нуля, а не с единицы;
2.        недостаточнонайти просто ненулевой элемент в столбце. В программировании вседействия с вещественными числами производятся приближенно, поэтому можносчитать, что точного равенства вещественных чисел вообще не бывает. Некоторыекомпиляторы даже выдают предупреждения на каждую операцию проверки равенствавещественных чисел. Поэтому вместо проверки на равенство нулю числа aij следует сравнивать его абсолютную величинуij‌ с очень маленьким числом ε (например, ε =0.00000001). Если ij‌=
3.        приобнулении элементов j-го столбца, начиная со строкиi + 1, мы к k-й строке,где k > i, прибавляем i-юстроку, умноженную на коэффициент r = -akj/aij:
Такая схемаработает нормально только тогда, когда коэффициент r по абсолютной величине не превосходитединицы. В противном случае, ошибки округления умножаются на большойкоэффициент и, таким образом, экспоненциально растут. Математики называют этоявление неустойчивостью вычислительной схемы. Если вычислительная схеманеустойчива, то полученные с ее помощью результаты не имеют никакого отношенияк исходной задаче. В нашем случае схема устойчива, когда коэффициент r = -akj/aij непревосходит по модулю единицы. Для этого должно выполняться неравенство Отсюдаследует, что при поиске разрешающего элемента в j-мстолбце необходимо найти не первый попавшийся ненулевой элемент, а максимальныйпо абсолютной величине. Если он по модулю не превосходит ε, тосчитаем, что все элементы столбца нулевые; иначе меняем местами строки, ставяего на вершину столбца, и затем обнуляем столбец элементарными преобразованиямивторого рода.
Основная идеяметода Гаусса- привести матрицу систему к диагональному виду, то есть всеэлементы главной диагонали –нули. Для приведения матрицы к такому виду, мывыбираем самую верхнюю строку матрицы, и вычитаем её из всех остальных строк,умножив её для каждой строки на некий коэффициент, так, что самый левый столбецниже главной диагонали заполнен нулями. Вычитаемая с коэффициентом строканазывается текущей строкой. Выбирая текущую строку вначале верхнюю, а потом всёниже и ниже, мы добьёмся, что все элементы ниже главной диагонали будет равнынулю. Эту часть метода- обработка строк по текущей строке и предстоитраспараллеливать.
Суть методазаключается в последовательном исключении неизвестных. Рассмотрим системулинейных уравнений:
/>
Разделим обечасти 1–го уравнения на a11  0, затем: 1) умножим на а21 и вычтемиз второго уравнения 2) умножим на а31 и вычтем из третьегоуравнения и т.д. Получим:, где d1j= a1j/a11, j= 2, 3, …, n+1. dij= aij– ai1d1ji= 2, 3, …, n; j= 2, 3, …, n+1. Далее повторяем эти жедействия для второго уравнения системы, потом – для третьего и т.д.
/>

Пример. Решить систему линейныхуравнений методом Гаусса.
/>
 
Составимрасширенную матрицу системы.
А* =
/>
 
Такимобразом, исходная система может быть представлена в виде:
/>,
откудаполучаем:x3 = 2;x2 = 5;x1= 1.
Пример. Решить систему методомГаусса.
/>
 
Составимрасширенную матрицу системы.
/>

Такимобразом, исходная система может быть представлена в виде:
/>,
откудаполучаем: z = 3; y = 2;x =1.Работа сфайлами.
Стандартнаябиблиотека С++ содержит набор функций для работы с файлами. Эти функции описаныв стандарте ANSI. Отметим, что файловый ввод-вывод не является частью языка С+,и ANSI-функции — не единственное средство ввода-вывода. Так, в операционнойсистеме Unix более популярен другой набор функций ввода-вывода, который можноиспользовать не только для работы с файлами, но и для обмена по сети. В C++часто используются библиотеки классов для ввода-вывода. Тем не менее, функцииANSI-библиотеки поддерживаются всеми С++-компиляторами, и потому программы,применяющие их, легко переносятся с одной платформы на другую. Прототипыфункций ввода-вывода и используемые для этого типы данных описаны в стандартномзаголовочном файле «stdio.h.Открытие файла: функция fopen.
Длядоступа к файлу применяется тип данных FILE. Этоструктурный тип, имя которого задано с помощью оператора typedefв стандартном заголовочном файле „stdio.h“. Программисту не нужнознать, как устроена структура типа файл: ее устройство может быть системнозависимым, поэтому в целях переносимости программ обращаться явно к полямструктуры FILE запрещено. Тип данных»указатель на структуру FILE используется впрограммах как черный ящик: функция открытия файла возвращает этот указатель вслучае успеха, и в дальнейшем все файловые функции применяют его для доступа кфайлу.
Здесьpath — путь к файлу (например, имя файла илиабсолютный путь к файлу), mode — режим открытияфайла. Строка mode может содержать несколько букв.Буква «r» (от слова read) означает, чтофайл открывается для чтения (файл должен существовать). Буква «w» (от слова write) означает запись в файл, при этомстарое содержимое файла теряется, а в случае отсутствия файла он создается.Буква «a» (от слова append) означаетзапись в конец существующего файла или создание нового файла, если файл несуществует.
Внекоторых операционных системах имеются различия в работе с текстовыми ибинарными файлами (к таким системам относятся MS DOS и MS Windows; в системеUnix различий между текстовыми и бинарными файлами нет). В таких системах приоткрытии бинарного файла к строке mode следуетдобавлять букву «b» (от слова binary), апри открытии текстового файла — букву «t»(от слова text). Кроме того, при открытии можно разрешить выполнять какоперации чтения, так и записи; для этого используется символ + (плюс). Порядок букв в строке mode следующий: сначалаидет одна из букв «r», «w», «a», затемв произвольном порядке могут идти символы «b»,«t», “+”.Буквы «b» и «t»можно использовать, даже если в операционной системе нет различий междубинарными и текстовыми файлами, в этом случае они просто игнорируются.
3.Описание алгоритмарешения СЛАУ методом Гаусса
Составить программурешения систем линейных алгебраических уравнений с матрицей порядка n методом Гаусса с использованиемязыка С++ .
Алгоритм решения системылинейных уравнений с помощью метода Гаусса. Алгоритм реализован на языке С++.
Пустьу нас есть система N линейных уравнений
a11x1 + a12x2 + a13x3+… a1NxN = b1
a21x1 + a22x2 + a23x3+… a2NxN = b2
a31x1 + a32x2 + a33x3+… a3NxN = b3

aN1x1+ aN2x2 + aN3x3 +… aNNxN= bN
гдеxi — неизвестные, aij — коэффициенты при неизвестных, bi — свободные члены в уравнениях, i,j пробегают значения от 1 до N.
Цельзадачи — зная aij и bi найти xi.
Сутьметода Гаусса состоит в том, что с помощью некоторых операций исходную системууравнений можно свести к более простой системе. Эта простая система имееттреугольный вид:
a11x1 +
a12x2 +
a13x3 + …
a1NxN = b1
a22x2 +
a23x3 + …
a2NxN = b2
a33x3 + …
a3NxN = b3 … …
aNNxN = bN
Особенностьэтой системы — в строках с номером i все коэффициенты aij при j
Еслимы смогли привести нашу систему уравнений к такому треугольному виду, то решитьуравнения уже просто. Из последнего уравнения находим xN= bN/ aNN. Дальше подставляем его в предпоследнее уравнение и находим изнего xN-1. Подставляем оба найденных решения в следующее с концауравнение и находим xN-2. И так далее, пока не найдем x1,на чем решение заканчивается. Такая процедура называется обратной прогонкой.
Теперьперейдем к вопросу как же добиться того, чтобы система стала треугольной.
Излинейной алгебры известно что если к некоторой строке системы уравненийприбавить любую линейную комбинацию любых других строк этой системы, то решениесистемы не изменится. Под линейной комбинацией строк понимается сумма строк,каждая из которых умножается на некоторое число (в принципе, любое).
Нужно,чтобы во второй строке получилось уравнение, в которой отсутствует член при x1.Прибавим к этой строке первую строку, умноженную на некоторое число M.
(a11x1 + a12x2 + a13x3+… a1NxN = b1)*M +
a21x1 + a22x2 + a23x3+… a2NxN = b2
Получим
(a11*М + a21) x1 +… = b1*M + b2
Длятого, чтобы член при x1 равнялся нулю, нужно, чтобы M = — a21/ a11. Проделав эту операцию, получившееся уравнение запишем вместовторого и приступим к третьему уравнению. К нему мы прибавим первое уравнение,умноженное на M = — a31 / a11 и тоже получим ноль вместочлена при x1. Такую операцию нужно проделать над всеми остальнымиуравнениями. В результате получим систему такого вида:
a11x1 +
a12x2 +
a13x3 + …
a1NxN = b1
a22x2 +
a23x3 + …
a2NxN = b2
a32x2 +
a33x3 + …
a3NxN = b3 …
aN2x2 +
aN3x3 + …
aNNxN = bN
Послеэтого будем избавляться от членов при x2 в третьем, четвертом, N-омуравнении. Для этого нужно к уравнению с j-м номером прибавить 2-ое уравнение,умноженное на M = — aj2 / a22. Проделав эту операцию надвсеми остальными уравнениями, получим систему где нет членов с x2 вуравнениях с номером больше 2.
Итак далее… Проделав это для третьего члена, четвертого… до тех пор, пока некончатся уравнения, получим в итоге систему треугольного вида.
Алгоритм описан впсевдокоде (команды в виде текста на русском языке).
ПРОЦЕСС0: (главный процесс)
1.Разослатьвсем процессам количество текущих строк.
(Илине всем процессам, если процессов больше чем строк).
2.ЦИКЛПО СТРОКАМ (выбор текущей строки)
1.Разослатьвсем процессам текущую строку.
(Есличисло процессов больше чем осталось строк для обработки (строк ниже текущейстроки), то разослать текущую строку не всем процессам, а только тем, которыебудут задействованы в обработке строк.)
2.Разослатьвсем процессам строки для обработки (посылаем строку, затем строки в матрице).Разделить между процессами строки ниже текущей. Разделяем так в цикле построкам раздаём по одной каждому процессу, пока не кончатся строки, попроцессам 1..N идём циклически.
3.Разослатьвсем процессам количества строк, посланных им для обработки.
4.Принятьот процессов 1..N обработанные строки, занести их в матрицу. (Принимаем строкуи номер строки в матрице)
5.Выбратьследующую текущую строку — новый шаг цикла.
КОНЕЦЦИКЛА
3.Вычислитьрешение системы по диагональной матрице.
4.Выдатьрезультат работы.
5.Завершитьработу.

ПРОЦЕСС1..N:
1.Принимаемколичество текущих строк.
2.ЦИКЛОБРАБОТКИ ПОЛУЧЕННЫХ СТРОК
1.Принимаемсообщение о количестве строк для обработки
2.Есличисло строк для обработки >0 то:
{
1.Принимаемсообщение с текущей строкой
2.ЦИКЛобработки строк
1.Принимаемсообщение со строкой для обработки .
(получаемещё номер строки в матрице).
2.Обрабатываемполученную строку
3.Посылаемглавному процессу результаты работы. Для каждой строки посылаем строку и номерстроки.
4.Идёмна новый шаг цикла обработки строк.
3.Синхронизируемся.
}
3.Завершитьпроцесс.
4.Исходный текстпрограммы
Составить программу решениясистем линейных алгебраических уравнений с квадратной невырожденной матрицейпорядка n методом Гаусса с использованиемязыка С++ .
// Решение системы линейных уравнений методом Гаусса.
#include
#include «stdio.h»
#include «conio.h»
#include
#include
#include
#include
#include
#include
#include «stdafx.h»
using namespace std;
#include // Описания функций ввода-вывода
#include // Описания математических функций
#include // Описания функций malloc и free
const int n=3;
void ReadData()
{
int n;
double A[n][n];
FILE*f=fopen(«l1.txt»,«rt»);
if (f!=0)
printf(«CAN’T OPEN FILE\nPlease, f**k off!»);
{
fscanf(f,”%d”,&n);
printf(«Sborka matritsi m- na n-:\n»);
for (int i=0;i
{
for(int j=0;j
{
fscanf(f,”%d”,&A[i][j]);
printf(“%d”,A[i][j]);
}
printf(“\n”);
}
printf(“\n\n”);
fclose(f);
}
}
void Gauss
( double X[n], const double Z[n][n], const double Y[n])
{
ReadData();
double A[n][n]; // матрица коэффицентов Гаусса
double B[n]; // рабочий массив свободных членов
int i,
int j,
int k; // рабочие переменные
for( i = 0; i
{
for( j = 0; j
A[i][j] = Z[i][j];
B[i] = Y[i]; // копирование свободных членов
X[i] = 0;
}
for( k = 0; k
for( i = k+1; i
{
double r = A[i][k] / A[k][k];
for( j = k; j
A[i][j] -= A[k][j] * r;
B[i] -= B[k] * r;
}
X[n-1] = B[n-1] / A[n-1][n-1];
for( i = n-2; i >= 0; i– )
{
double s = 0;
for( j = i+1; j
s += A[i][j] * X[j];
X[i] = ( B[i] — s ) / A[i][i];
}
printf( “\n” );
for( i = 0; i
{ printf( “\n” );
for( j = 0; j
printf( “%8.2lf”, A[i][j] );
printf( ” %8.2lf”, B[i] );
}
}
/* — */
void main( void )
{
ReadData();
double X[n];// корни системы линейных уравнений
short i, j; // рабочие переменные
printf( ” matritsa A* matritsa B\n” );
for( i = 0; i
{
printf( “\n” ); // новая строка на мониторе
for( j = 0; j
printf( “%8.2lf”, A[i][j] );
printf( ” %8.2lf”, B[i] );
}
printf( “\n” );
printf( «stypen4atii vid matritsi \n» );
Gauss( X, A, B ); // решение методом Гаусса
printf( “\n” );
printf( “\n” );
printf( ” zna4enia peremennih x1,x1,x3\n” );
printf( “\n X = ” );
for( i = 0; i
printf( “%8.2lf”, X[i] );
printf( “\n” );
printf( “\n” );
printf( «rang=\n» );
getch();
}

5.Тестированиепрограммы
Результаты решениясистемы с тремя неизвестными:
/>
Результаты решениясистемы с четырьмя неизвестными:
/>
Данные вфайле:
Имя файла l1
4
2       1       4       1
3       1       3       2
2       4       5       1
5       2       2       2
Размерностиматриц=4
Матрица А
2       1       4
3       1       3
2       4       5
5       2       2
Матрица В
1
2
1
2

Вывод
В результатевыполнения курсового проекта были разработаны два класса функций для решенияпростейших задач линейной алгебры. Число этих функций сравнительно невелико,однако можно легко добавить в эти классы более сложные функции, построенные набазе уже имеющихся. Классы позволяют работать с матрицами и векторами, элементыкоторых могут быть любого типа, однако на практике чаще всего используетсяцелый тип и тип чисел с плавающей запятой. Классы написаны на языке С++, однакомогут быть легко переписаны на любом из современных языков программирования,так как приведены довольно простые алгоритмы всех компонентных функций. Былимаксимально предусмотрены всевозможные ошибки, которые могут возникнуть прииспользовании функций данных классов. Особое внимание уделялось разумномувыделению памяти подобъекты во время выполнения программы, поэтому все функциибыли тщательно отлажены.Классы Matrix и Vector могут быть эффективно примененына практике в задачах, требующих операций с матрицами и векторами, а такжесвязанных с решением систем линейных алгебраических уравнений.

Список литературы
1. Начальный курс С и С++.: Учебник. /Б. И. Березин.Москва:«ДИАЛОГ-МИФИ»,1999г.
2. Язык программирования С++.: Учебник. /. Страуструп.Киев:«ДиаСофт», 1993 г.
3. Введение в язык С++: Учебник. /Бьярн Страустрап.
– СПб.: 1995.
4. Структуры и алгоритмы обработки данных: Учебник. / МатьяшВ.А., Путилов В.А., Фильчаков В.В., Щёкин С.В. — Апатиты, КФ ПетрГУ, 2000
5. С++ /Дэвис Стефан Р.,4-е издание: Пер. с англ.:- М.:Издательский дом «Вильямс»,2003
6. Основы программирования: Учеб. Для сред. проф. образования/И.Г.Семакин, А.П.Шестаков. – М., 2006.
7. С++ экспресс курс: Учебник. /Лаптев В.В. – СПб.: БХВ-Петербург 2004.
8. С++ учебный курс: Учебник. /Франка П. – СПб.: Питер 2005.
9.МОДЕЛИ ИCТРУКТУРЫ ДАННЫХ:/Учебное пособие/
Д.Далека, А.С. Деревянко, О.Г. Кравец, Л.Е. Тимановская -Харьков: ХГПУ,2000
10.Высшая математика для экономистов: учебник для студентоввузов/Н.Ш.Кремер,3-е издание.-М.: ЮНИТИ-ДАНА,2006