Разработка программы- "Решение СЛАУ методом Гаусса"

Содержание 
 
 
 
 
 
 
 
 
 
 

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

Аппаратные  требования:

- Рекомендуется  компьютер оснащенный процессором  Intel Pentium/Celeron, AMD Athlon/Duron/Semprion или совместимый с частотой 1ГГц и более;

- Рекомендуется  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=farray[i][j]

                        rowPos=i

                        colPos=j

                  Все-Если

                  j++ 

            Все-Пока

            i++

      Все-Пока

      i=0

      Цикл-Пока i<m_nRows

      temp=farray[i][k]

      farray[i][k]=farray[i][colPos]

      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]*farray[i][k]

j--

Все-Пока

      i++

Все-Пока

Вывести преобразованный массив farray

      k++

Все-Пока

s=0

    x[m_nRows-1]=farray[m_nRows-1][m_nCols-1]/farray[m_nRows-1][m_nCols-2]

i=m_nRows-2

Цикл-Пока i>=0

      s=0

      k=i+1

      Цикл-Пока k<m_nRows

            s+=farray[i][k]*x[k]

            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 - Диаграмма состояния “Ввод размерности и коэффициентов уравнения системы ”

    1. Выход

    Рисунок 6 – Диаграмма состояния “ Выход” 

    3) Решить СЛАУ методом Гаусса

    Рисунок 7 – Диаграмма состояния “Решить СЛАУ методом Гаусса”

    Окно  программы показано на рисунке 8.

    

    Рисунок 8 - Диалоговое окно программы "Решение СЛАУ методом Гаусса"

      4. ТЕСТИРОВАНИЕ

        Проведем тестирование программы на выявление возможных ошибок в результате работы и различных действий пользователя.

      При первом запуске программы создается  окно программы, показанное на рисунке  9.

      

    Рисунок 9 - Окно программы " Решение СЛАУ методом Гаусса " при первом запуске

      После нажатия кнопки “Открыть” откроется диалоговое окно, изображенное на рисунке 10.

      

      Рисунок 10 – Диалоговое окно для выбора пути к файлу.

      После выбора пути к файлу диалоговое окно программы будет выглядеть следующим  образом:

      

      Рисунок 11 – Окно программы "Решение СЛАУ методом Гаусса". 

      Произведем  тестирование нашей программы для  следующих данных.

      

      Для этого выберем путь к файлу  со следующим содержимым:

      

      Рисунок 12 – Тестовый пример для программы

      Выбрав  путь к указанному файлу, нажмем кнопку решить.

      

 

      Рисунок 13 – Окно программы "Решение СЛАУ методом Гаусса" с тестовым примером.

      

      Рисунок 14 – Решение СЛАУ для тестового примера.

      Данное  решение верно.

      Про нажатии кнопки “О программе” открывается диалоговое окно, изображенное на рисунке 15.

      

      Рисунок 15 – Диалоговое окно “О программе”.

В ходе тестирования никаких ошибок программы  обнаружено не было, а следовательно программа в отладке не нуждается. 
 
 
 
 

      ЗАКЛЮЧЕНИЕ

     В результате выполнения курсового проекта была разработана программа «Решение СЛАУ методом Гаусса». Программа написана на языке Visual C++. При реализации интерфейса была использована стандартная библиотека  MFC среды программирования Microsoft Visual Studio 6.

     В пояснительной записке содержатся все этапы разработки проекта, схемы алгоритмов, интерфейс рабочего приложения, исходный код программы и ее тестирование. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

      БИБЛИОГРАФИЧЕСКИЙ СПИСОК

  1. Семенихин, И.Н. Технология программирования: учебно-методическое пособие / И.Н.Семенихин. – Шахты: Изд-во ЮРГУЭС, 2007. – 55с.: ил.
  2. Иванова, Г.С. Технология программирования: учебник для вузов / Г.С. Иванова. – М.: Изд-во МГТУ им Н.Э.Баумана, 2002. – 320с.
  3. СТП 01-01 Стандарт предприятия: Курсовые и дипломные проекты (работы). Основные требования к объему и оформлению. – Взамен СТП 01-97. – Дата введ. 2001. – 01. – 07. – Шахты: ЮРГУЭС, 2001. – 35 с.
  4. Олафсен, Ю., Скрайбнер, К., Уайт, К.Д. Visual C++ и MFC. Энциклопедия пользователя.
  5. Черносвитов, А. 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_MAP()

      }; 

      CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

      {

      } 

      void CAboutDlg::DoDataExchange(CDataExchange* pDX)

      {

            CDialog::DoDataExchange(pDX);

      } 

      BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

      END_MESSAGE_MAP() 
 

      // CfilereadDlg dialog 
 
 

      CfilereadDlg::CfilereadDlg(CWnd* pParent /*=NULL*/)

            : CDialog(CfilereadDlg::IDD, pParent)

            , m_FileTitle(_T(""))

            , m_FilePath(_T(""))

      {

            m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

      } 

      void CfilereadDlg::DoDataExchange(CDataExchange* pDX)

      {

            CDialog::DoDataExchange(pDX);

            DDX_Control(pDX, IDC_LIST1, listbox);

      } 

      BEGIN_MESSAGE_MAP(CfilereadDlg, CDialog)

            ON_WM_SYSCOMMAND()

            ON_WM_PAINT()

            ON_WM_QUERYDRAGICON()

            //}}AFX_MSG_MAP

            ON_BN_CLICKED(IDOK, OnBnClickedOk)

            ON_BN_CLICKED(IDC_BUTTON1, CfilereadDlg::OnBnClickedButton1)

            ON_BN_CLICKED(IDC_BUTTON2, CfilereadDlg::OnBnClickedButton2)

      END_MESSAGE_MAP() 
 

      // CfilereadDlg message handlers 

      BOOL CfilereadDlg::OnInitDialog()

      {

            CDialog::OnInitDialog(); 

            // Add "About..." menu item to system menu. 

            // IDM_ABOUTBOX must be in the system command range.

            ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

            ASSERT(IDM_ABOUTBOX < 0xF000); 

            CMenu* pSysMenu = GetSystemMenu(FALSE);

            if (pSysMenu != NULL)

            {

                  CString strAboutMenu;

                  strAboutMenu.LoadString(IDS_ABOUTBOX);

                  if (!strAboutMenu.IsEmpty())

                  {

                        pSysMenu->AppendMenu(MF_SEPARATOR);

                        pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

                  }

            } 

            // 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(UINT nID, LPARAM lParam)

      {

            if ((nID & 0xFFF0) == IDM_ABOUTBOX)

            {

                  CAboutDlg dlgAbout;

                  dlgAbout.DoModal();

            }

            else

            {

                  CDialog::OnSysCommand(nID, lParam);

Разработка программы- "Решение СЛАУ методом Гаусса"