Актуальность работы
Решение системы линейных алгебраических уравнений (СЛАУ) имеет большое значение, поскольку к нему сводится решение широкого круга сложных практических задач. Особая необходимость в решении СЛАУ возникает при использовании широкого класса моделей и подходов, применяемых при автоматизированном проектировании аппаратуры с учетом электромагнитной совместимости. Так как решение СЛАУ «вручную» представляет собой трудоёмкую задачу, а использование средств математического моделирования (MathCAD, MathLab) требует наличие у пользователя некоторых специальных знаний, представляется актуальной задача создания алгоритма решения СЛАУ и программы, построенной на данном алгоритме.
Теоретическая часть
Под СЛАУ подразумевают систему, содержащую m уравнений и n неизвестных (x1,x2,…,xn).
Параметры aij называют коэффициентами, а bi– свободными членами СЛАУ. Иногда, чтобы подчеркнуть количество уравнений и неизвестных, говорят так «m×n система линейных уравнений», – тем самым указывая, что СЛАУ содержит m уравнений и n неизвестных.
Если все свободные члены равны 0, то СЛАУ называют однородной. Если среди свободных членов есть хотя бы один, отличный от нуля, СЛАУ называют неоднородной.
Решением СЛАУ называют всякую упорядоченную совокупность чисел (α1,α2,…,αn), если элементы этой совокупности, подставленные в заданном порядке вместо неизвестных x1,x2,…,xn, обращают каждое уравнение СЛАУ в тождество.
Если СЛАУ имеет хотя бы одно решение, ее называют совместной, если же решений нет – несовместной. Если совместная СЛАУ имеет ровно одно решение, её именуют определённой, если бесконечное множество решений – неопределённой.
В данной работе, была создана программа на языке C# для решения СЛАУ методом Гаусса.
Практическая часть
Словесно, алгоритм работы программы можно представить в следующем виде:
Формируем массив, в который записывается расширенная матрица из коэффициентов и свободных членов;
Делим каждый элемент первой строки на коэффициент в первом столбце;
Вычитаем из всех строк, начиная со второй, первую строку, умноженную на коэффициент в первом столбце;
Переходим к следующей строке и выполняем пункты 2 и 3, увеличивая номер столбца, из которого мы берем первый элемент;
Выполняем пункт 4 до тех пор, пока не кончатся строки;
Последний столбец получившейся матрицы представляет собой столбец корней СЛАУ, притом номер корня равен номеру строки, в котором он находится в преобразованной матрице.
Программный код на языке C#, реализующая решение указанный алгоритм:
using System;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
TextBox[,] t;
Label[,] l;
int n;
int m;
int shag;
private void button1_Click(object sender, EventArgs e)
{
if (comboBox1.SelectedItem == null || comboBox2.SelectedItem == null)
{
MessageBox.Show("Ошибка!nЗадайте значение входных параметров");
return;
}
n = Convert.ToInt32(comboBox1.SelectedItem.ToString());
m = Convert.ToInt32(comboBox2.SelectedItem.ToString());
m += 1;
int i, j, c, d;
int x = 18, y = 25;
if (t != null)
{
tabPage2.Controls.Clear();
tabPage2.Controls.Add(button2);
}
t = new TextBox[n, m];
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
t[i, j] = new TextBox();
tabPage2.Controls.Add(t[i, j]);
t[i, j].Location = new Point(x += 50, y);
t[i, j].Size = new Size(25, 20);
t[i, j].TabStop = false;
}
y += 40;
x = 18;
}
y = 28;
x = 45;
l = new Label[n, m];
for (c = 0; c < n; c++)
{
for (d = 0; d < m - 1; d++)
{
l[c, d] = new Label();
tabPage2.Controls.Add(l[c, d]);
l[c, d].Location = new Point(x += 50, y);
l[c, d].Size = new Size(40, 40);
int z = d + 1;
if (d == m - 2)
l[c, d].Text = "x" + z + " =";
else
l[c, d].Text = "x" + z + " +";
l[c, d].TabStop = false;
}
y += 41;
x = 45;
}
tabControl1.SelectedTab = tabPage2;
}
public string Gauss(int Rows, int Column, double[,] matr)
{
int i, k, q;
double v;
string answer = "";
for (q = 0; q < Rows; q++)
{
//делаем главную диагональ единицами
v = matr[q, q];
richTextBox1.AppendText("nШаг" + (shag++) + ". Разделим строку " + (q + 1) + " на элемент[" + (q + 1) + "," + (q + 1) + "]= " + matr[q, q] + "nn");
for (k = 0; k < Column; k++)
matr[q, k] /= v;
for(int z=0;z 0)
s += v[i, j] + " * x" + z + " + ";
}
}
richTextBox1.AppendText(s + "n");
}
richTextBox1.AppendText("Шаг 1:nСформируем расширенную матрицу :nr");
for (i = 0; i < n; i++)
{
string s = "";
for (j = 0; j < m; j++)
{
if (j == m - 1)
s += " " + (v[i, j]).PadRight(2);
else
s += (v[i, j].PadRight(3)) + " ";
}
richTextBox1.AppendText(s + "n");
}
richTextBox1.AppendText("Применяя к расширенной матрице последовательность элементарных операций, стремимся, чтобы каждая строка, кроме, быть может, первой, начиналась с нулей, и число нулей до первого ненулевого элемента в каждой следующей строке было больше, чем в предыдущей.n");
richTextBox1.AppendText(Gauss(n, m, v1));
tabControl1.SelectedTab = tabPage4;
}
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if ((n == 0) || (m == 0))
{
e.Cancel = true;
MessageBox.Show("Вы не сформировали СЛАУ");
}
}
}