Как решить систему уравнений в c

от admin

C++. C++ Builder. Разработка приложения решения системы линейных алгебраических уравнений методом Гаусса

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

Условие задачи

Задана система линейных алгебраических уравнений:

Разработать приложение, которое осуществляет решение системы линейных алгебраических уравнений с помощью метода Гаусса. Работа приложения должна быть реализована в виде мастера, в котором информация для каждого следующего шага определяется из информации на предшествующем шаге.

Выполнение

При сохранении проекта имя модуля главной формы приложения оставляем по умолчанию « Unit1.cpp «.

05_01_00_011_01_

Рис. 1. Форма приложения с созданными файлами

2. Разработка главной формы приложения

2.1. Название приложения

Задать название приложения. Для этого свойство Caption главной формы устанавливаем в значение «Метод Гаусса».

2.2. Установка свойств формы

Выделить форму. В Object Inspector установить значение следующих свойств:
– свойство Border Style = bsDialog ;
– свойство Position = poScreenCenter ;
– в свойстве Font выбрать параметры шрифта: шрифт Tahoma , размер шрифта 12 (рис. 2).

05_01_00_011_02_

Рис. 2. Установка параметров шрифта главной формы приложения

В результате, форма приложения примет вид как показано на рисунке 3.

05_01_00_011_03r

Рис. 3. Главная форма приложения

2.3. Компонент типа TGroupBox

Размещаем на форме компонент (элемент управления) типа TGroupBox из палитры компонент « Tool Palette «.

05_01_00_011_04r

Рис. 4. Компонент типа TGroupBox

В результате, система создаст объект-переменную с именем GroupBox1 .

Изменяем размеры компонента GroupBox1 на всю ширину окна главной формы.

Свойство Caption компонента GroupBox1 устанавливаем в значение « Условие задачи «. Форма приложения будет иметь вид, как показано на рисунке 5.

05_01_00_011_05r

Рис. 5. Форма приложения после размещения компонента TGroupBox

2.4. Компонент типа TLabel .

Размещаем компонент типа TLabel в области компонента TGroupBox . Автоматически создается объект-переменная с именем Label1 (рис. 6).

Устанавливаем свойство WordWrap компонента Label1 в значение « true » (рис. 6).

С помощью мышки изменяем ширину вывода текста компонента Label1 (рис. 6).

05_01_00_011_06r

Рис. 6. Компонент Label1 , свойство WordWrap

Свойство Caption компонента Label1 устанавливаем в значение:

Решить систему линейных алгебраических уравнений методом Гаусса

В результате, форма приложения примет вид, как показано на рисунке 7.

05_01_00_011_07r

Рис. 7. Форма приложения после размещения компонента Label1

2.5. Компоненты типа TButton .

Размещаем на форме компоненты типа TButton . В результате образуются два объекта-переменные с именами Button1 и Button2 .

Для лучшей наглядности изменяем размеры компонент так как показано на рисунке 8.

05_01_00_011_08r

Рис. 8. Форма приложения с размещенными компонентами Button1 и Button2

Устанавливаем такие свойства компонент Button1 и Button2:
– в компоненте Button1 свойство Caption = «Выход» ;
– в компоненте Button2 свойство Caption = «Расчет >>» .

В результате форма приложения примет вид, как показано на рисунке 9.

05_01_00_011_09r

Рис. 9. Главная форма приложения после размещения всех компонент

3. Программирование события клика на кнопке «Выход».

Вызовем событие OnClick компонента Button1 (кнопка « Выход «) (рис. 10). Событие размещается на вкладыше Events в Object Inspector .

Процесс программирования события OnClick подробно описан здесь.

05_01_00_011_10r

Рис. 10. Вызов события OnClick компонента Button1

В результате, откроется окно с программным кодом метода обработки события. Между скобками < >вводим вызов метода Close() .

Метод Close() закрывает окно главной формы приложения и осуществляет все необходимые операции по освобождению памяти, ресурсов и т.д.

Листинг метода обработки события следующий:

4. Разработка формы ввода числа уравнений n.

4.1. Размещение компонент на форме и их настройка.

Процесс создания новой формы подробно описан здесь.

Для создания новой формы вызовем команду

В результате, будет создана новая форма, как показано на рисунке 11. Сохраняем форму под именем « Unit2.cpp «.

Создаются файлы, которые соответствуют форме:
– файл « Unit2.h «, содержащий описания глобальных переменных и подключения других модулей;
– файл « Unit2.cpp «, содержащий реализацию методов формы;
– файл « Unit2.dfm «, содержащий описание изображения формы на экране (размеры окна, координаты формы относительно окна экрана, значение цветов и прочее).

Новосозданной форме отвечает объект с именем Form2 . С помощью этого имени можно приступаться к свойствам и методам формы Form2 .

05_01_00_011_11_

Рис. 11. Новосозданная форма Form2

Осуществим настройку формы Form2 .

Сначала настроим свойства формы:
– свойство Caption = «Задайте число уравнений» ;
– свойство BorderStyle = bsDialog ;
– свойство Position = poScreenCenter ;
– в свойстве Font нужно выбрать следдующие параметры шрифта: шрифт Tahoma, размер шрифта 12.

Размещаем на форме такие компоненты:
– компонент типа TGroupBox которому будет отвечать объект GroupBox1;
– компонент типа TLabel, размещается внутри области компонента GroupBox1 . Компоненту типа TLabel отвечает объект-переменная Label1 ;
– компонент типа TEdit , размещается внутри области компонента GroupBox1 . Этому компоненту отвечает объект (переменная) Edit1 ;
– два компонента типа TButton , которым отвечают объекты с именами Button1 и Button2 .

Осуществим настройку свойств компонент:
– в компоненте GroupBox1 значение свойства Caption = «» (пустая строка);
– в компоненте Label1 значение свойства Caption = «n = « ;
– в компоненте Edit1 значение свойства Text = «» ;
– в компоненте Button1 значение свойства Caption = «<< Назад» ;
– в компоненте Button2 значение свойства Caption = «Далее >>» .

После размещения компонент и корректирования размеров формы, форма Form2 имеет вид как показано на рисунке 12.

05_01_00_011_12r

Рис. 12. Форма Form2 после размещения и настройки всех компонент

4.2. Программирование обработчиков событий формы Form2 .

В форме Form2 программируем два обработчика событий:
– обработчик события OnClick клика на кнопке « << Назад «;
– обработчик события OnClick клика на кнопке « Далее >> «.

Листинг обработчика события клика на кнопке Button1 (« << Назад «):

Листинг обработчика события клика на кнопке Button2 (« Продолжить >> «):

Глобальная переменная ModalResult отвечает за состояние формы. Если глобальная переменная ModalResult=0 , то это означает что форма открытая как модальное окно. Как только значение ModalResult станет ненулевым, то форма Form2 закроется с кодом возврата, помещенным в ModalResult .

Таким образом, если пользователь сделает клик на кнопке Button1 , то форма Form2 закроется с кодом возврата mrNo. Если пользователь сделает клик на кнопке Button2, то форма Form2 закроется с кодом возврата mrOk .

5. Построение формы ввода коэффициентов в уравнениях.

5.1. Размещение компонент на форме и их настройка.

Создание формы происходит стандартным путем и описано в п. 4.

Сохраняем форму под именем предлагаемым по умолчанию « Unit3.cpp «.

После создания формы получим объект с именем Form3 . С помощью этого объекта можно будет использовать методы и свойства формы Form3 .

Данной форме отвечают файлы с именами « Unit3.h «, « Unit3.cpp » и « Unit3.dfm «.

Сначала осуществим настройку свойств формы Form3 так, как описано в п. 4:
– свойство Caption = «Ввод коэффициентов уравнений «;
– свойство BorderStyle = bsDialog ;
– свойство Position = poScreenCenter ;
– в свойстве Font нужно выбрать параметры шрифта: шрифт Tahoma , размер шрифта 12 .

Для построения формы ввода коэффициентов уравнений используем такие компоненты:
– два компонента типа TLabel . Автоматически будут созданы объекты с такими именами: label1 и label2 ;
– компонент типа TStringGrid (рис. 13) для ввода коэффициентов, которые размещаются в левой части системы уравнений.

Компонент TStringGrid размещается во вкладке Additional панели инструментов « Tool Palette «. Создается объект с именем StringGrid1 ;
– компонент типа TStringGrid (рис. 13) для введения коэффициентов, которые размещаются в правой части системы уравнений. Создается объект с именем StringGrid2 ;
– два компонента типа TButton (кнопки « << Назад » и « Продолжить >> «). Создаются два объекта с именами Button1 и Button2 .

05_01_00_011_13r

Рис. 13. Компонент TStringGrid на палитре компонент

После размещения компонент и корректировки их размеров, форма Form3 будет иметь приблизительно следующий вид (рис. 14).

05_01_00_011_14r

Рис. 14. Форма Form3

Формируем свойства компонент формы Form3:
– в компоненте Label1 свойство Caption = « Коэффициенты в левой части уравнения «;
– в компоненте Label2 свойство Caption = «Правая часть» ;
– в компоненте Button1 свойство Caption = «<< Назад» ;
– в компоненте Button2 свойство Caption = «Далее >>» .

Формируем свойства компонентов типа TStringGrid :
– в компоненте StringGrid1 свойство FixedCols = 0 (число фиксированных колонок);
– в компоненте StringGrid1 свойство FixedRows = 0 (число фиксированных строк);
– в компоненте StringGrid2 свойство FixedCols = 0 ;
– в компоненте StringGrid2 свойство FixedRows = 0 ;
– в компоненте StringGrid1 выбираем вкладку Options и устанавливаем опцию goEditing в значение « true «;
– в компоненте StringGrid2 во вкладке Options опция goEditing = « true «.

05_01_00_011_15r

Рис. 15. Установление опции goEditing во вкладке Options компонента StringGrid1

После выполненных действий, форма Form3 будет иметь вид как показано на рисунке 16.

05_01_00_011_16r

Рис. 16. Форма Form3 после окончательного формирования

5.2. Программирование обработчиков событий формы Form3 .

Программируем обработчики событий OnClick клика на кнопках Button1 и Button2 формы Form3 .

Листинг обработчиков событий приведен ниже.

6. Создание формы вывода результата.

Последней в приложении создается форма, которая будет выводить результат вычислений. Процесс создания и сохранения формы подробно описан здесь. При сохранении формы оставляем имя по умолчанию « Unit4.cpp «.

Читать:
Как обновить яндекс карты на андроид

В результате получаем объект с именем Form4 .

Новосозданная форма Form4 описывается в файле « Unit4.dfm «. Также форме отвечают файлы « Unit4.h » и « Unit4.cpp «.

6.1. Построение формы Form4 .

Сначала настраиваем свойства формы Form4 :
– свойство Caption = «Результат» ;
– свойство BorderStyle = bsDialog ;
– свойство Position = poScreenCenter ;
– в свойстве Font нужно выбрать следующие параметры шрифта: шрифт Tahoma , размер шрифта 12 .

Также корректируем размеры формы.

Следующим шагом идет размещение на форме компонент.

Размещаем на форме следующие компоненты (рис. 17):
– один компонент типа TLabel ;
– два компонента типа TStringGrid ;
– один компонент типа TButton .

Корректируем размеры и позиции компонент для удобного отображения.

После размещения компонент будут созданы объекты с такими именами: Label1 , StringGrid1 , StringGrid2 , Button1 . В компоненте StringGrid1 выводятся номера переменных величин x в уравнении. В компоненте StringGrid2 выводятся значения решения системы уравнений.

Настраиваем компоненты формы следующим образом:
– в компоненте Label1 свойство Caption = «Решение системы» ;
– в компоненте Button1 свойство Caption = «OK» ;
– в компоненте StringGrid1 свойства FixedCols = 0 и FixedRows = 0 ;
– в компоненте StringGrid2 свойства FixedCols = 0 и FixedRows = 0 .

После размещения и настройки компонент, форма Form4 будет иметь вид, как показано на рисунке 17.

05_01_00_011_17r

Рис. 17. Форма Form4 после окончательного формирования

6.2. Программирование события клика на кнопке « ОК » формы Form4 .

Листинг обработчика события клика на кнопке « ОК » следующий:

7. Написание программного кода расчета.

7.1. Подключение модулей «Unit2.h», «Unit3.h», «Unit4.h» к модулю «Unit1.h».

Для того, чтобы из главной формы приложения Form1 вызвать второстепенные формы, нужно осуществить их подключения в модуле « Unit1.h «.

Подключение модулей форм Form2 , Form3 , Form4 к форме Form1 осуществляется стандартным для языка C/C++ способом.

Сначала нужно перейти в модуль « Unit1.h «.

Затем после строк

нужно ввести такой текст:

7.2. Ввод переменных и констант в модуль «Unit1.h»

С помощью Project Manager переходим в модуль « Unit.h «.

Сначала вводим константу Max , которая обозначает максимально допустимое количество уравнений. Для этого, после строк

В раздел private класса TForm1 формы вводим внутренние переменные:
n – количество уравнений;
A – двумерный массив размером n*(n+1) коэффициентов при переменных в уравнениях;
X – одномерный массив решений уравнений;
– переменная целого типа f_not , которая обозначает наличие или отсутствие решения в системе уравнений.

Также в раздел public вводим функцию Calc() , которая непосредственно будет осуществлять расчет по методу Гаусса.

В общем, описание класса в модуле Unit1.h выглядит следующим образом:

7.3. Написание функции Calc() решения системы уравнений по методу Гаусса.

С помощью Project Manager переходим в файл « Unit1.cpp «.

В файле « Unit1.cpp » вводим текст реализации функции Calc() , объявленной в модуле « Unit1.h «.

Функция Calc() возвращает 0, если система уравнений не определена. В другом случае возвращается значение 1.

Листинг метода Calc() без объяснений подробностей алгоритма следующий:

7.4. Программирование события клика на кнопке «Расчет».

Листинг обработчика события клика на кнопке «Расчет» (Button2) следующий:

Объясним некоторые фрагменты кода. Вывод формы происходит с помощью функции ShowModal() . Преобразование целого типа в строку реализуется функцией IntToStr() .

Преобразование из строки в соответствующий действительный тип реализован функцией StrToFloat() .

Преобразование из соответствующего действительного типа в строку происходит с помощью функции FloatToStr() .

Для вывода сообщения о неопределенности системы уравнений используется функция MessageDlg() .

VIII Международная студенческая научная конференция Студенческий научный форум — 2016

Решение системы линейных алгебраических уравнений (СЛАУ) имеет большое значение, поскольку к нему сводится решение широкого круга сложных практических задач. Особая необходимость в решении СЛАУ возникает при использовании широкого класса моделей и подходов, применяемых при автоматизированном проектировании аппаратуры с учетом электромагнитной совместимости. Так как решение СЛАУ «вручную» представляет собой трудоёмкую задачу, а использование средств математического моделирования (MathCAD, MathLab) требует наличие у пользователя некоторых специальных знаний, представляется актуальной задача создания алгоритма решения СЛАУ и программы, построенной на данном алгоритме.

Под СЛАУ подразумевают систему, содержащую m уравнений и n неизвестных (x1,x2,…,xn).

Параметры aij называют коэффициентами, а bi– свободными членами СЛАУ. Иногда, чтобы подчеркнуть количество уравнений и неизвестных, говорят так «m×n система линейных уравнений», – тем самым указывая, что СЛАУ содержит m уравнений и n неизвестных.

Если все свободные члены равны 0, то СЛАУ называют однородной. Если среди свободных членов есть хотя бы один, отличный от нуля, СЛАУ называют неоднородной.

Решением СЛАУ называют всякую упорядоченную совокупность чисел (α1,α2,…,αn), если элементы этой совокупности, подставленные в заданном порядке вместо неизвестных x1,x2,…,xn, обращают каждое уравнение СЛАУ в тождество.

Если СЛАУ имеет хотя бы одно решение, ее называют совместной, если же решений нет – несовместной. Если совместная СЛАУ имеет ровно одно решение, её именуют определённой, если бесконечное множество решений – неопределённой.

В данной работе, была создана программа на языке C# для решения СЛАУ методом Гаусса.

Словесно, алгоритм работы программы можно представить в следующем виде:

Формируем массив, в который записывается расширенная матрица из коэффициентов и свободных членов;

Делим каждый элемент первой строки на коэффициент в первом столбце;

Вычитаем из всех строк, начиная со второй, первую строку, умноженную на коэффициент в первом столбце;

Переходим к следующей строке и выполняем пункты 2 и 3, увеличивая номер столбца, из которого мы берем первый элемент;

Выполняем пункт 4 до тех пор, пока не кончатся строки;

Последний столбец получившейся матрицы представляет собой столбец корней СЛАУ, притом номер корня равен номеру строки, в котором он находится в преобразованной матрице.

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

Метод Гаусса — классический метод решения системы линейных алгебраических уравнений (СЛАУ). Рассмотрим систему линейных уравнений с действительными постоянными коэффициентами:
Система линейных алгебраических уравнений
или в матричной форме
Система линейных алгебраических уравнений в матричной форме
Метод Гаусса решения системы линейных уравнений включает в себя 2 стадии:

  • последовательное (прямое) исключение;
  • обратная подстановка.

Последовательное исключение

Исключения Гаусса основаны на идее последовательного исключения переменных по одной до тех пор, пока не останется только одно уравнение с одной переменной в левой части. Затем это уравнение решается относительно единственной переменной. Таким образом, систему уравнений приводят к треугольной (ступенчатой) форме. Для этого среди элементов первого столбца матрицы выбирают ненулевой (а чаще максимальный) элемент и перемещают его на крайнее верхнее положение перестановкой строк. Затем нормируют все уравнения, разделив его на коэффициент ai1 , где i – номер столбца.
Нормирование линейной системы уравнений
Затем вычитают получившуюся после перестановки первую строку из остальных строк:
Нормирование линейной системы уравнений
Получают новую систему уравнений, в которой заменены соответствующие коэффициенты.
Нормирование линейной системы уравнений
После того, как указанные преобразования были совершены, первую строку и первый столбец мысленно вычёркивают и продолжают указанный процесс для всех последующих уравнений пока не останется уравнение с одной неизвестной:
Ступенчатая форма системы линейных уравнений

Обратная подстановка

Обратная подстановка предполагает подстановку полученного на предыдущем шаге значения переменной xn в предыдущие уравнения:
Обратная подстановка
Эта процедура повторяется для всех оставшихся решений:
Обратная подстановка

Иллюстрирующий пример

Пусть дана система уравнений
Система линейных уравнений (пример)
или в матричной форме
Система линейных уравнений в матричной форме (пример)
Выбираем строку с максимальным коэффициентом ai1 и меняем ее с первой.
Перемещение строк в матрице коэффициентов
Нормируем уравнения относительно коэффициента при x1:
Нормирование коэффициентов (пример)
Нормирование уравнений
Вычитаем 1 уравнение из 2 и 3:
Вычитание уравнений
Выбираем строку с наибольшим коэффициентом при ai2 (уравнение 1 не рассматривается) и перемещаем ее на место 2.
Перемещение строк коэффициентов (пример)
Нормируем 2 и 3 уравнения относительно коэффициента при x2


Вычитаем уравнение 2 из 3

Нормируем уравнение 3 относительно коэффициента при x3

Откуда получаем x3=2 . Подставляем полученное значение в уравнения 2 и 1 получаем

Подставляя полученное значение x2=5 в уравнение 1, найдем

Таким образом, решением системы уравнений будет вектор
Вектор решения системы линейных уравнений
Реализация на C++

Результат выполнения
Пример

Как решить систему уравнений в c

Решение систем линейных алгебраических уравнений – одна из основных задач вычислительной линейной алгебры. Хотя задача решения системы линейных уравнений сравнительно редко представляет самостоятельный интерес для приложений, но от умения эффективно решать такие системы часто зависит сама возможность математического моделирования самых разнообразных процессов с применением ЭВМ.

В нашей работе был рассмотрен процесс решения системы линейных уравнений (СЛУ) методом Гаусса. Метод Гаусса – метод последовательного исключения переменных – заключается в том, что с помощью элементарных преобразований система уравнений приводится к равносильной системе треугольного вида (прямой ход метода Гаусса), из которой из последовательно, начиная с последних, находятся все переменные (обратный ход метода Гаусса).

Нашей целью была автоматизация процесса решения СЛУ. Для этого мы использовали язык программирования С++. Была написана программа нахождения решения СЛУ с n неизвестными и n уравнений методом Гаусса в данной среде программирования.

Рассмотрим её работу на примере решения системы с 4 уравнениями и 4 неизвестными:

Eqn310.wmf

Вначале вводим коэффициенты уравнений системы. Далее на экран выводим исходную матрицу и преобразованную матрицу, которую привели с помощью элементарных преобразований к треугольному виду. Затем, начиная с последней переменной, находим решения системы: x1, x2, x3, x4.

pic_80.tif

pic_81.tif

Значительная часть численных методов решения различных (в особенности – нелинейных) задач включает в себя решение систем линейных уравнений как элементарный шаг соответствующего алгоритма.

Похожие статьи