Программа для решения линейных уравнений
Понятия систем линейных уравнений и матриц. Решение общей системы линейных уравнений по методу Гаусса. Системные требования, методы установки, удаления и работы с программой. Методы защиты от неверного ввода данных. Тестирование и опытная эксплуатация.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 25.02.2011 |
Размер файла | 751,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
void __fastcall TForm1::btnSolveClick(TObject *Sender)
Эта функция используется при нажатии на кнопку «Решить систему»,
в которой используются переменные M и S.
переменная M - она представляет собой квадратную матрицу, размером (N на N+1).
где N на N - это количество неизвестных и количество строк.
..+1 - это столбик значений системы линейного уравнения, который называется B.
переменная S - она необходима, для того чтобы менять строчки местами, для временного хранения.
После чего создается квадратная матрица (N на N+1).
- ещё используются переменные i,j,k.
где i,j,k - изначально равны нулю.
i,j - используются в циклах, в качестве счётчиков.
После чего считываются значения из таблицы, которые переписываться в матрицу, потом происходит прямой проход (сверху вниз), следовательно, вычитаем одну строчку из другой, для того чтобы получить треугольную матрицу. Если этого не получается достичь, то программа создает сообщение об ошибки «Вырожденная система с рангом.», если получается, то программа вычитает строчки друг из друга при необходимости меняет строчки местами.
В последовательности всех этих процессов получается верхняя треугольная матрица, после чего происходит обратный проход (снизу вверх), для получения диагональной матрицы, при необходимости программа начинает вычитать строчки друг из друга.
Завершающий этап процедуры цикла предназначен для вывода в таблицу, значения решений системы линейного уравнения.
После чего идет обработчик ошибок catch(Exception &e) - этот обработчик сообщает, если у нас в ячейке таблицы заполнения вместо целого числа ставиться другой неверный символ, при этом программа выдает сообщение с ошибкой «Ошибка при вводе элемента.». При этом пишет номер элемента, где поставлен неверный символ и предлагает пользователю нажать на кнопку «ОК». При нажатии на кнопку «ОК» программа устанавливает курсор в ту ячейку, где была обнаружена ошибка ввода неверного символа в ячейку.
Также этот обработчик выдает сообщение при ошибке в решении системы линейного уравнения. После чего происходит удаление самого массива.
void __fastcall TForm1::btnFillClick(TObject *Sender)
Эта функция относиться к кнопке «RANDOM».
- эта функция заполняет таблицу случайными целыми значениями (от -50 до 50).
void __fastcall TForm1::Button1Click(TObject *Sender)
Эта функция относиться к кнопке «Выход».
- эта функция закрывает форму программы.
void __fastcall TForm1::Button2Click(TObject *Sender)
Эта функция относиться к кнопке «Разработки».
- эта функция вызывает информационное окно, где расположена дополнительная информация по разработчику программы.
4.4 Защита от неверного ввода данных
Каждое поле Edit имеет защиту на случай ввода неверных символов, таких, как буквы, символы, знаки пунктуации (кроме запятой).
4.5 Пример расчета. Тестирование и опытная эксплуатация
Исходные данные:
Решить систему уравнений методом Гаусса. Дана система уравнений.
x1 - 2x2 + x3 + x4 = -1;
3x1 + 2x2 - 3x3 - 4x4 = 2;
2x1 - x2 + 2x3 - 3x4 = 9;
x1 + 3x2 - 3x3 - x4 = -1.
Последовательность расчёта.
1. Первоначально вводим значения матрицы размером (m*n) в ячейки заполнения системы. После чего программа составляет матрицу В и преобразовывает ее. Для удобства вычислений отделим вертикальной чертой столбец, состоящий из свободных членов:
1 -2 1 1 -1
B = 3 2 -3 -4 2
2 -1 2 -3 9
1 3 -3 -1 -1
2. Программа объявляет переменные и создаёт двумерный массив. После чего программа делает прямой проход (сверху вниз) матрицы В. Программа производит поиск, строки с ненулевым первым элементом в матрице В.
т.к. видно что в матрице В нет нулевых первых элементов. Но если в матрице В все элементы столбца нулевые, то программа выдаёт окно с сообщением, что “Эта вырожденная система с рангом №”.
1 -2 1 1 -1
B = 3 2 -3 -4 2
2 -1 2 -3 9
1 3 -3 -1 -1
3. Меняем строки в матрице В (Если диагональный элемент равен нулю).
4. Вычитание строки. Для каждой строки расположенной ниже текущей строки вычисляется число r, равное элементу строки, делённому на элемент текущей строки, эти элементы расположены в текущем столбце. Затем вычисляется строка r*t+s
где t - текущая строка матрицы В;
s - стока расположенная ниже текущей.
Вычисленная строка записывается вместо строки s. Для этого примера получим r равное (-3,-2 и -1). После преобразований получим:
1 -2 1 1 -1
0 8 -6 -7 5.
0 3 0 -5 11
0 5 -4 -2 0
5. Повторяется пункты 3 и 4, пока не дойдём до последней строки матрицы. После этого получим матрицу вида:
1 -2 1 1 -1
0 -1 -6 8 -28 .
0 0 -1 0 -3
0 0 0 19 -19
6. Обратный проход (полученной в пункте 5). Начиная с последней строки, выполняются пункты 7 и 8.
7. Текущая строка делиться на диагональный элемент. Получаем матрицу вида:
1 -2 1 1 -1
0 -1 -6 8 -28
0 0 -1 0 -3
0 0 0 1 -1
8. Вычисляется число r равное элементу строки, делённому на элемент текущей строки, эти элементы расположены в текущем столбце. Затем вычисляется строка r*t+s
где t - текущая строка матрицы В
s - стока расположенная ниже текущей.
Вычисленная строка записывается вместо строки s. Для этого примера получим r равное (0,-8 и -1). После преобразований получим:
1 -2 1 0 0
0 -1 -6 0 -36.
0 -1 0 -3
0 0 0 1 -1
9.После выполнения пунктов 6-8 получим матрицу вида:
1 0 0 0 1
0 1 0 0 2.
0 0 1 0 3
0 0 0 1 -1
Из 9 пункта видно что x4 = -1, х3 = 3, x2 = 2 и x1 = 1.
10. Последний столбец матрицы из пункта 9 является решением системы и выводится программой на экран. После чего происходит освобождение памяти (удаление матрицы В).
ЗАКЛЮЧЕНИЕ
При выполнении курсовой работы студент самостоятельно выполнил все этапы создания программного продукта, от постановки задачи до практической реализации, сопровождающейся документацией и инструкциями по его использованию. Студент научился самостоятельно пользоваться специальной литературой, каталогами, справочниками.
В ходе курсовой работы была создана программа по решению линейных уравнений по методу Гаусса. Данная работа выполнена на языке высокого уровня С++ в среде программирования Borland C++ Builder 6.0 для ОС семейства Windows 9x и выше.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Шилд Г. Программирование на Borland C++ для профессионалов/ перев. с англ. А.И. Панасюка, А.Н. Филимонова. - Мн.: ООО «Попурри», 1998. - 800 с.: ил.
2. Чарльз Калверт. Программирование в Windows: Освой самостоятельно на 21 день. - Пер. с англ. - М.: БИНОМ, 1995. - 496 с.: ил.
3. Подбельский В.В. Язык Си++: Учеб. пособие. - 2-е изд., перераб. и доп. - М.: Финансы и статистика, 1996. - 560 с.
4. Скляров В.А. Язык С++ и объектно-ориентированное программирование. - Мн.: Выш. шк., 1997. - 478 с.
5. Аляев Ю.А., Козлов О.А. Алгоритмизация и языки программирования Pascal, C++, Visual Basic: Учебно-справочное пособие. - М.: Финансы и статистика, 2002. - 320 с.
6. Бронштейн И.Н., Семендяев К.А. Справочник по математике для инженеров и учащихся втузов. - М.: Наука, 1981. - 708 с.
7. ГОСТ 19.105-78. ЕСПД. Общие требования к программным документам.
8. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.
ПРИЛОЖЕНИЕ А
БЛОК-СХЕМЫ ПРОГРАММЫ
Основная блок-схема программы
Блок-схема создания матрицы
Блок-схема вывода таблицы на экран, с соответствующим оформлением
Блок-схема кнопки «Применить»
Блок-схема кнопки «Random»
Блок-схема кнопки «Выход»
Блок-схема программы
ПРИЛОЖЕНИЕ Б
ЛИСТИНГИ ИСХОДНЫХ ТЕКСТОВ
Файл Gauss.cpp
#include <vcl.h>
#pragma hdrstop
USEFORM("uMain.cpp", Form1);
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
Файл uMain.cpp
#include <vcl.h>
#pragma hdrstop
#include "uMain.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
N=5;
DrawXY();
}
void TForm1::DrawXY()
{
for(int i=0;i<N;i++){
TableGauss->Cells[0][i+1]="№ "+IntToStr(i+1);
TableGauss->Cells[i+1][0]="X"+IntToStr(i+1);
TableGauss->Cells[i+1][N+1]="";
for(int j=0;j<N;j++){
TableGauss->Cells[i+1][j+1]="0";
}
TableGauss->Cells[N+1][i+1]="0";
}
TableGauss->Cells[0][0]="Гаусс";
TableGauss->Cells[N+1][N+1]="";
TableGauss->Cells[N+1][0]="=b";
TableGauss->Cells[0][N+1]="Решение";
}
void __fastcall TForm1::btnNClick(TObject *Sender)
{
try{
N=StrToInt(edN->Text);
if( N<1 || N>30){
throw Exception("Неправильный размер системы.");
}
TableGauss->ColCount=N+2;
TableGauss->RowCount=N+2;
DrawXY();
}
catch(Exception &e){
MessageBox(Handle,("Ошибка при вводе размера. "+(e.Message)).c_str(),
"Гаусс",MB_OK | MB_ICONERROR);
}
}
void __fastcall TForm1::btnSolveClick(TObject *Sender)
{
float** m=new float*[N];
float* s;
for(int i=0;i<N;i++){
m[i]=new float[N+1];
}
int i=0,j=0,k=0;
try{
for(i=0;i<N;i++){
for(j=0;j<N+1;j++){
m[i][j]=StrToFloat(TableGauss->Cells[j+1][i+1]);
}
}
k=1;
//Прямой проход (сверху вниз)
for(i=0;i<N-1;i++){
//Поиск строки с ненулевым первым элементом
for(j=i;j<N;j++){
if(m[j][i]!=0){
break;
}
}
if(j==N){
throw Exception("Вырожденная система с рангом "+IntToStr(i));
}
if(j!=i){
//Меняем строки
s=m[i];
m[i]=m[j];
m[j]=s;
}
//Вычитание строк
for(j=i+1;j<N;j++){
if (m[j][i]==0){
//Уже нулевой элемент
continue;
}
float r=-m[j][i]/m[i][i];
//Обнуляем начало строки
for(int k=0;k<i+1;k++){
m[j][k]=0;
}
//вычитаем окончание строки
for(int k=i+1;k<N+1;k++){
m[j][k]+=m[i][k]*r;
}
}
}
//Обратный проход(снизу вверх)
for(i=N-1;i>=0;i--)
{
//Диагональный элемент делаем 1.
m[i][N]=m[i][N]/m[i][i];
m[i][i]=1;
for(j=0;j<i;j++){
float r=-m[j][i]/1;
//Вычитание строк
m[j][i]=0;
m[j][N]+=m[i][N]*r;
}
for(i=0;i<N;i++){
TableGauss->Cells[i+1][N+1]=FloatToStrF(m[i][N],ffGeneral,7,4);
}
}
catch(Exception &e)
{
if(k==0)
{
MessageBox(Handle,("Ошибка при вводе элемента["+
IntToStr(i+1)+"]["+IntToStr(j+1)+"]."+(e.Message)).c_str(),
"Гаусс",MB_OK | MB_ICONERROR);
TableGauss->Col=j+1;
TableGauss->Row=i+1;
}
else
{
MessageBox(Handle,("Ошибка при решении системы."+(e.Message)).c_str(),
"Гаусс",MB_OK | MB_ICONERROR);
}
}
for(int i=0;i<N;i++){
delete[] m[i];
}
delete[] m;
}
void __fastcall TForm1::btnFillClick(TObject *Sender)
{
for(int i=0;i<N;i++){
for(int j=0;j<N+1;j++){
TableGauss->Cells[j+1][i+1]=FloatToStrF(random(100)-50,ffGeneral,4,4);
}
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Close();
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
MessageBox(Handle," Васильев Алексей 06-ВМ-01 ©",
" Разработчик программы ",MB_OK | MB_ICONINFORMATION);
}
#ifndef uMainH
#define uMainH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Grids.hpp>
class TForm1 : public TForm
{
__published: // IDE-managed Components
TStringGrid *TableGauss;
TPanel *Panel1;
TEdit *edN;
TButton *btnN;
TLabel *Label1;
TLabel *Label3;
TButton *btnSolve;
TButton *btnFill;
TButton *Button1;
TButton *Button2;
TLabel *Label2;
TLabel *Label4;
TLabel *Label5;
void __fastcall FormCreate(TObject *Sender);
void __fastcall btnNClick(TObject *Sender);
void __fastcall btnSolveClick(TObject *Sender);
void __fastcall btnFillClick(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
int N;
void DrawXY();
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
extern PACKAGE TForm1 *Form1;
#endif
Размещено на Allbest.ru
Подобные документы
Системы линейных алгебраических уравнений. Код программы для решения систем линейных алгебраических уравнений. Математические и алгоритмические основы решения задачи методом Гаусса. Программная реализация решения. Алгоритмы запоминания коэффициентов.
лабораторная работа [23,5 K], добавлен 23.09.2014Решение систем линейных алгебраических уравнений по методу Гаусса. Разработка прикладной программы формирования видеотеки с использованием технологии разработки программ "сверху-вниз". Алгоритм добавления, удаления и корректировки элемента видеотеки.
курсовая работа [305,0 K], добавлен 18.06.2012Алгоритм решения систем линейных уравнений методом Гаусса, его этапы. Система уравнений для определения коэффициентов сплайна, представляющая собой частный случай систем линейных алгебраических уравнений. Программная реализация, тестовый пример.
курсовая работа [431,8 K], добавлен 15.06.2013Системы линейных алгебраических уравнений. Решение систем уравнений графическим способом. Разработка программного кода модуля, реализующего приближенное решение систем линейных уравнений графическим способом. Отладка программного модуля "Метод Гаусса".
курсовая работа [858,5 K], добавлен 01.12.2013Матричная форма записи системы линейных уравнений, последовательность ее решения методом исключений Гаусса. Алгоритмы прямого хода и запоминания коэффициентов. Решение задачи о сглаживании экспериментальных данных с помощью метода наименьших квадратов.
курсовая работа [610,7 K], добавлен 25.06.2012Объектно-ориентированное программирование: основная идея, сопровождение, модификация, термины и положения. Понятие объекта как логической единицы, правила (методы) обработки данных. Метод Гаусса для решения систем линейных алгебраических уравнений.
курсовая работа [125,1 K], добавлен 22.04.2009Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Разработка программного продукта на языке Delphi 7.0. Матричный метод решения однородных и неоднородных систем линейных уравнений. Разработка интерфейса. Тестирование и описание объектов программы. Описание процесса вычисления определителей матриц.
курсовая работа [366,1 K], добавлен 04.02.2015Сущность метода Гаусса при решении систем линейных уравнений. Элементарные преобразования этого метода. Краткое описание среды визуальной разработки Delphi. Описание основных применяемых процедур и алгоритм роботы программы по решению уравнений.
курсовая работа [1,1 M], добавлен 29.08.2010Метод Гаусса как прямой метод нахождения решений для систем системы линейных уравнений маленькой и средней размерности с помощью компьютерной техники. Редактор кода и исходный код основной программы в Delphi, блок-схема и графическое решение задачи.
контрольная работа [460,8 K], добавлен 15.06.2015