Разработка программы- "Решение СЛАУ методом Гаусса"
Содержание
1. АНАЛИЗ И ПОСТАНОВКА ЗАДАЧИ
1.1 Постановка задачи
Разработать
программу для решения системы
линейных уравнений порядка N методом
Гаусса с выбором главного элемента по
столбцу и по строке. Исходные данные:
порядок системы линейных уравнений N,
матрица коэффициентов, вектор правых
частей. Разработать тестовый пример для
N=10 и определить погрешность расчета.
1.2 Анализ задания
Запишем систему, в развернутом виде
(1)
Метод Гаусса состоит в последовательном исключении неизвестных из этой системы. Сначала мы выбираем главный элемент i-того столбца, это будет элемент с наибольшим коэффициентом. Предположим, это ai1. Переставляем i-тое уравнение на первое место. Последовательно умножаем все уравнения на множитель t1 = и складываем с первым уравнение. Таким образом мы исключаем одну переменную из всех уравнений кроме первого. Получим систему
(2)
где
Аналогичным образом, исключая все неизвестные, получим систему треугольного вида
(3)
Описанная процедура называется прямым ходом метода Гаусса. Заметим, что ее выполнение было возможно при условии, что все , не равны нулю.
Выполняя последовательные подстановки в последней системе, (начиная с последнего уравнения) можно получить все значения неизвестных.
. (4)
Эта процедура получила название обратный ход метода Гаусса.
1.3. Техническое задание
1.3.1. Спецификация данных
Входные данные:
Порядок системы линейных уравнений;
Матрица коэффициентов;
Вектор правых частей.
Промежуточные данные:
Главный элемент столбца;
Матрица коэффициентов полученная в результате исключения переменной;
Выходные данные:
Значения всех переменных;
1.3.2. Функциональные спецификации
Мне требуется создать программу, выполняющую следующие функции:
Ввод размерности системы;
Ввод коэффициентов уравнения;
Выбор главного элемента столбца;
Последовательное умножение всех уравнений на множитель t1;
Последовательное сложение всех уравнений с первым;
Ввод в память полученной матрицы коэффициентов и вектора правых частей в память;
Повторение пунктов 4 – 6 до тех пор пока не будет получена матрица треугольного вида (3);
Выполнение последовательных подстановок в полученной системе по формуле (4) (начиная с последнего уравнения);
Получение всех значений неизвестных;
Вывод результатов пользователю.
1.3.3. Спецификация оборудования
Программные требования: обязательным является наличие операционной системы Microsoft Windows XP
Аппаратные требования:
- Рекомендуется
компьютер оснащенный
- Рекомендуется 256 Мб ОЗУ или более. Минимально допустимый объем 64 Мб;
- Монитор и видеоадаптер VGA;
- Клавиатура
и мышь или совместимое
2. ПРОЕКТИРОВАНИЕ
2.1. Модель использования
Для построения концептуальной модели проектируемой мною программы, я выбрал объектно-ориентированное проектирование. Это следует из того, что разрабатываемая мною программа будет написана на объектно-ориентированном языке программирования C++.
Любая
система взаимодействует с внешними
сущностями – актерами. Диаграмма прецедентов
как раз отображает эту связь (рис. 1).
Рисунок 1- Диаграмма прецедентов
Основной поток событий для прецедента «Ввод размерности и коэффициентов уравнения системы»:
| Действия актера | Отклик системы |
| 1. Прецедент начинается с того, что пользователь на кнопку «Открыть». | 2. Система открывает диалоговое окно. |
| 3. Пользователь выбирает нужный ему файл. | 4. Система считывает исходные данные из выбранного файла. |
| 5. Прецедент окончен. |
Альтернативный поток событий
Пользователь может в любой момент времени изменить исходные данные.
Основной поток событий для прецедента «Решить СЛАУ методом Гаусса»:
| Действия актера | Отклик системы |
| 1. Прецедент начинается, когда пользователь нажимает на кнопку «Решить» | 2. include (Происходит прямой ход метода Гаусса). |
| 4. include (Происходит обратный ход метода Гаусса) | |
| 5. Прецедент окончен. |
Альтернативный поток событий
Пользователь может в любой момент покинуть программу.
Основной поток событий для прецедента «Выход»:
| Действия актера | Отклик системы |
| 1. Прецедент начинается, когда пользователь нажимает на кнопку «Выход» | |
| 2. Система завершает работу | |
| 3. Прецедент окончен. |
Альтернативный поток событий
Пользователь
может отменить выход из системы.
2.2. Структурная модель
Программа состоит из нескольких классов: CAboutDlg, CfilereadApp, CfilereadDlg. Рассмотрим методы, используемые в данных классах:
Методы класса CfilereadDlg:
Метод ReadFile() – сохраняет путь к файлу с исходной матрицей. Метод для прецедента “ Ввод размерности и коэффициентов уравнения системы”.
Метод OnBnClickedOk() - обрабатывает нажатие кнопки «Открыть». Метод для прецедента “ Ввод размерности и коэффициентов уравнения системы”.
Метод OnBnClickedButton1() – открывает диалоговое окно со справкой о программе.
Метод OnBnClickedButton2() – считывает данные из файла, производит необходимые вычисления и выводит результат решения.
Метод OnExit() – закрывает приложение. Метод для прецедента “Выход”.
На рисунке 2 изображена диаграмма классов, которая помогает понять взаимосвязи между классами программы. В изображенных классах указываются их методы и аргументы.
Рисунок
2 – Диаграмма классов программы " Решение
СЛАУ методом Гаусса".
2.3. Алгоритмы программы
Рассмотрим алгоритмы методов классов и представим их в двух формах: описании на псевдокоде и в виде блок-схем.
Метод
OnBnClickedButton2() – считывает данные из файла,
производит необходимые вычисления и
выводит результат решения. Описание на
псевдокоде метода OnBnClickedButton2() выглядит
следующим образом:
Начало
Открыть выбранный файл
row = количество строк в файле
Выделение памяти под массивы x и farray
Занести значения коэффициентов в массив farray
Закрыть файл
k=0
m_nRows=row
m_nCols=m_nRows+1
Цикл-Пока k<row-1
colPos=k
rowPos=k
max=farray[k][k]
i=k
Цикл-Пока i<m_nRows
j=k+1
Цикл-Пока j<m_nCols-1
Если модуль(farray[i][j])>max
То
max=
rowPos
colPos
Все-Если
j++
Все-Пока
i++
Все-Пока
i=0
Цикл-Пока i<m_nRows
temp=farray[i][k]
farray[i][k]=farray[i][
farray[i][colPos]=temp
i++
Все-Пока
j=0
Цикл-Пока j<m_nCols
temp=farray[k][j]
farray[k][j]=farray[rowPos][j]
farray[rowPos][j]=temp
j++
Все-Пока
j=m_nCols-1
Цикл-Пока j>=0
farray[k][j]/=farray[k][k]
j--
Все-Пока
i=k+1
Цикл-Пока i<m_nRows
j=m_nCols-1
Цикл-Пока j>=0
farray[i][j]-=farray[k][j]*
j--
Все-Пока
i++
Все-Пока
Вывести преобразованный массив farray
k++
Все-Пока
s=0
x[m_nRows-1]=farray[m_nRows-1]
i=m_nRows-2
Цикл-Пока i>=0
s=0
k=i+1
Цикл-Пока k<m_nRows
s+=farray[i][k]*x[
x[i]=farray[i][m_nCols-1]-s
k++
Все-Пока
i--
Все-Пока
Вывести массив x
Конец
Рисунок
4 – Блок-схема метода OnBnClickedButton2
3. РАБОЧИЙ ПРОЕКТ.
3.1. Описание исходного кода программы.
Исходный код программы представляет собой совокупность всех структур данных и классов. Рассмотрим каждый класс подробнее. Вся бизнес логика заключается в файле filereadDlg.cpp.
Методы класса CfilereadDlgDlg:
- ReadFile() – не возвращает значений, сохраняет путь к файлу с исходной матрицей.
- OnBnClickedOk() - не возвращает значений, обрабатывает нажатие кнопки «Открыть».
- OnBnClickedButton1() – не возвращает значений, открывает диалоговое окно со справкой о программе.
- OnBnClickedButton2() – не возвращает значений, считывает данные из файла, производит необходимые вычисления и выводит результат решения.
- OnExit() – не возвращает значений, закрывает приложение.
3.2. Описание интерфейса программы
Абстрактный диалог.
Интерфейс программы представлен диалоговым окном, с расположенными на нем элементами управления. Диалог начинается когда пользователь нажимает кнопку “Открыть”. В ответ на это программа открывает диалоговое окно, в котором можно указать путь к файлу с исходными данными. После выбора файла и нажатия кнопки “Открыть”, диалоговое окно для выбора файла закрывается. Далее для выполнения решения СЛАУ методом Гауса необходимо нажать кнопку “Решить”. После нажатия данной кнопки выводится последовательность преобразований матрицы, необходимая для нахождения решения и решение системы. При нажатии на кнопку “О программе” открывается диалоговое окно с информацией о программе и ее разработчике.
Так же пользователь может закрыть приложение, нажав кнопку выход “Выход”.
1) Ввод размерности и коэффициентов уравнения системы
Рисунок 5 - Диаграмма состояния “Ввод размерности и коэффициентов уравнения системы ”
- Выход
Рисунок
6 – Диаграмма состояния “ Выход”
3) Решить СЛАУ методом Гаусса
Рисунок 7 – Диаграмма состояния “Решить СЛАУ методом Гаусса”
Окно программы показано на рисунке 8.
Рисунок 8 - Диалоговое окно программы "Решение СЛАУ методом Гаусса"
4. ТЕСТИРОВАНИЕ
Проведем тестирование программы на выявление возможных ошибок в результате работы и различных действий пользователя.
При первом запуске программы создается окно программы, показанное на рисунке 9.
Рисунок 9 - Окно программы " Решение СЛАУ методом Гаусса " при первом запуске
После нажатия кнопки “Открыть” откроется диалоговое окно, изображенное на рисунке 10.
Рисунок 10 – Диалоговое окно для выбора пути к файлу.
После
выбора пути к файлу диалоговое окно
программы будет выглядеть
Рисунок
11 – Окно программы "Решение СЛАУ методом
Гаусса".
Произведем тестирование нашей программы для следующих данных.
Для этого выберем путь к файлу со следующим содержимым:
Рисунок 12 – Тестовый пример для программы
Выбрав путь к указанному файлу, нажмем кнопку решить.
Рисунок 13 – Окно программы "Решение СЛАУ методом Гаусса" с тестовым примером.
Рисунок 14 – Решение СЛАУ для тестового примера.
Данное решение верно.
Про нажатии кнопки “О программе” открывается диалоговое окно, изображенное на рисунке 15.
Рисунок 15 – Диалоговое окно “О программе”.
В ходе
тестирования никаких ошибок программы
обнаружено не было, а следовательно
программа в отладке не нуждается.
ЗАКЛЮЧЕНИЕ
В результате выполнения курсового проекта была разработана программа «Решение СЛАУ методом Гаусса». Программа написана на языке Visual C++. При реализации интерфейса была использована стандартная библиотека MFC среды программирования Microsoft Visual Studio 6.
В
пояснительной записке
БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- Семенихин, И.Н. Технология программирования: учебно-методическое пособие / И.Н.Семенихин. – Шахты: Изд-во ЮРГУЭС, 2007. – 55с.: ил.
- Иванова, Г.С. Технология программирования: учебник для вузов / Г.С. Иванова. – М.: Изд-во МГТУ им Н.Э.Баумана, 2002. – 320с.
- СТП 01-01 Стандарт предприятия: Курсовые и дипломные проекты (работы). Основные требования к объему и оформлению. – Взамен СТП 01-97. – Дата введ. 2001. – 01. – 07. – Шахты: ЮРГУЭС, 2001. – 35 с.
- Олафсен, Ю., Скрайбнер, К., Уайт, К.Д. Visual C++ и MFC. Энциклопедия пользователя.
- Черносвитов, А. Visual C++ 7: учебный курс. – СПб.: Питер, 2001. – 528 с.: ил.
ПРИЛОЖЕНИЕ А
Исходный код программы на языке Visual C++:
Файл filereadDlg.cpp
// filereadDlg.cpp : implementation file
//
#include "stdafx.h"
#include "fileread.h"
#include "math.h"
#include "filereadDlg.h"
#include
".\filereaddlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//
CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange*
pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void
CAboutDlg::DoDataExchange(
{
CDialog::
}
BEGIN_MESSAGE_MAP(
END_MESSAGE_MAP()
//
CfilereadDlg dialog
CfilereadDlg::
: CDialog(CfilereadDlg::IDD, pParent)
, m_FileTitle(_T(""))
, m_FilePath(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_
}
void
CfilereadDlg::DoDataExchange(
{
CDialog::
DDX_Control(pDX, IDC_LIST1, listbox);
}
BEGIN_MESSAGE_MAP(
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_
//}}AFX_MSG_MAP
ON_BN_CLICKED(
ON_BN_CLICKED(IDC_
ON_BN_CLICKED(IDC_
END_MESSAGE_MAP()
//
CfilereadDlg message handlers
BOOL CfilereadDlg::OnInitDialog()
{
CDialog::
// Add "About..." menu item
to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_
ASSERT(IDM_
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu
if (!strAboutMenu.IsEmpty())
{
pSysMe
pSysMe
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small
icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void
CfilereadDlg::OnSysCommand(
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.
}
else
{
CDialog::