Способ решения системы линейных уравнений на ЭВМ методом Гаусса
Содержание
Введение
. Решение СЛАУ методом Гаусса
Вывод
Список использованной литературы
Введение
На практике часто возникает необходимость решить систему линейных уравнений. Если система имеет высокий порядок или просто их много, то приходится прибегать к помощи компьютерной техники. Существуют несколько способов решения систему линейных уравнений на ЭВМ. В этой работе мы рассмотрим метод Гаусса.
гаусс линейный уравнение программа компьютерный
1. Решение СЛАУ методом Гаусса
Прямой ход состоит из n ( 1 шагов исключения.
-й шаг. Целью этого шага является исключение неизвестного x1 из уравнений
с номерами i = 2, 3, …, n. Предположим, что коэффициент a11 ( 0. Будем называть его главным элементом 1-го шага.
Найдем величины
= ai1/a11 (i = 2, 3, …, n),
называемые множителями 1-го шага. Вычтем последовательно из второго, третьего, …, n-го уравнений системы первое уравнение, умноженное соответственно на q21, q31, …, qn1. Это позволит обратить в нуль коэффициенты при x1 во всех уравнениях, кроме первого. В результате получим эквивалентную систему
x1 + a12x2 + a13x3 + … + a1nxn = b1,
a22(1)x2 + a23(1)x3 + … + a2n(1)xn = b2(1),(1)x2 + a33(1)x3 + … + a3n(1)xn = b3(1),
an2(1)x2 + an3(1)x3 + … + ann(1)xn = bn(1).
в которой aij(1) и bij(1) вычисляются по формулам
aij(1) = aij - qi1a1j, bi(1) = bi - qi1b1.
2-й шаг. Целью этого шага является ислючение неизвестного x2 из уравнений с номерами i = 3, 4, …, n. Пусть a22(1) ? 0, где a22(1) - коэффициент, называемый главным (или ведущим) элементом 2-го шага. Вычислим множители 2-го шага
qi2 = ai2(1) / a22(1) (i = 3, 4, …, n)
и вычтем последовательно из третьего, четвертого, …, n-го уравнения системы второе уравнение, умноженное соответственно на q32, q42, …, qm2. В результате получим систему
a11x1 + a12x2 + a13x3 + … + a1nxn = b1,(1)x2 + a23(1)x3 + … + a2n(1) = b2(1),(2)x3 + … + a3n(2)xn = b3(2),
an3(2)x3 + … + ann(2)xn = bn(2).
Аналогично проводятся остальные шаги. Опишем очередной k-й шаг.й шаг. В предположении, что главный (ведущий) элемент k-го шага(k-1) отличен от нуля, вычислим множители k-го шага
qik = aik(k-1) / akk(k-1) (i = k + 1, …, n)
и вычтем последовательно из (k + 1)-го, …, n-го уравнений полученной на предыдущем шаге системы k-e уравнение, умноженное соответственно на qk+1,k, qk+2,k, …, qnk. После (n - 1)-го шага исключения получим систему уравнений матрица A(n-1) которой является верхней треугольной. На этом вычисления прямого хода заканчиваются.
a11x1 + a12x2 + a13x3 + … + a1nxn = b1,(1)x2 + a23(1)x3 + … + a2n(1)xn = b2(1),(2)x3 + … + a3n(2)xn = b3(2),
ann(n-1)xn = bn(n-1).
Обратный ход. Из последнего уравнения системы находим xn. Подставляя найденное значение xn в предпоследнее уравнение, получим xn-1. Осуществляя обратную подстановку, далее последовательно находим xn-1, xn-2, …, x1. Вычисления неизвестных здесь проводятся по формулам
= bn(n-1) / ann(n-1),= (bn(k-1) - ak,k+1(k-1)xk+1 - … - akn(k-1)xn) / akk(k-1), (k = n -
, …, 1).
Необходимость выбора главных элементов. Заметим, что вычисление множителей, а также обратная подстановка требуют деления на главные элементы akk(k-1). Поэтому если один из главных элементов оказывается равным нулю, то схема единственного деления не может быть реализована.
Здравый смысл подсказывает, что и в ситуации, когда все главные элементы отличны от нуля, но среди них есть близкие к нулю, возможен неконтролируемый рост погрешности.
Рис. 1 - Алгоритм метода Гаусса
Создание приложения
Запускаем Delphi, выполняем команду File/New/Form
Рис. 2 - Создание нового окна
На появившемся окне помещаем:
Image1 - изображение - заставка
Timer1 - таймер
Рис. 3 - Стартовое окно программы
Далее добавляем еще одну форму (form3) и прописываем в таймере формы 2 время, по истечении которого будет показываться основное окно программы.
Рис. 4. Основное окно программы
На появившейся форме помещаем:
Button1 - решение системы
Button2 - графическое решение системы при N=2
Edit1 - размерность системы
Image1 - вывод результата
Label1, Label2 - подписи
MainMenu1 - создание меню
SavePictureDialog1 - диалог для сохранения изображения в файл
StringGrid1, StringGrid2 - ввод исходных данных
Двойным щелчком по форме открываем редактор кода и пишем исходный код программы.
Код unit3Unit3;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, Grids, StdCtrls, Menus, ExtCtrls, unit1, ExtDlgs, unit4, unit5;MaxDimension = 10;= array[1..MaxDimension] of Double;= array[1..MaxDimension] of Vector;= class(TForm): TLabel;: TEdit;: TStringGrid;: TStringGrid;
Button1: TButton;: TLabel;: TLabel;: TMainMenu;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TMenuItem;: TImage;: TSavePictureDialog;: TMenuItem;: TButton;Edit1Change(Sender: TObject);Button1Click(Sender: TObject);FormCreate(Sender: TObject);N6Click(Sender: TObject);N4Click(Sender: TObject);N3Click(Sender: TObject);N2Click(Sender: TObject);Button2Click(Sender: TObject);
{ Private declarations }
{ Public declarations };: TForm3;
{$R *.dfm}TForm3.Button1Click(Sender: TObject);a: Matrix;,x: Vector;: Double;,j,k,n:integer;
//Ввод данных
//Размерность системы:= StrToIntDef(Text, StringGrid1.ColCount);
//Коэффициентыi:=0 to 249 do beginj:=0 to 161 do begin.Canvas.Pixels [i,j]:=image1.Canvas.Pixels[1,1];;j:= 0 to n - 1 doi:= 0 to n - 1 do[i + 1, j + 1]:= StrToFloatDef(StringGrid1.Cells[j, i], 0);
//Правая часть уравнения
for I:= 0 to n - 1 do b[i + 1]:= StrToFloatDef(StringGrid2.Cells[0, i], 0);
//Прямой ход - исключение переменных
for i:=1 to n-1 do
for j:=i+1 to n do
begin
a[j,i]:=-a[j,i]/a[i,i];
b[j]:=b[j]+a[j,i]*b[i]
end;
x[n]:=b[n]/a[n,n];
//Обратный ход - нахождение корней
for i:=n-1 downto 1 do
begin
h:=b[i];
for j:=i+1 to n do h:=h-x[j]*a[i,j];
x[i]:=h/a[i,i]
end;
//Вывод результатаi:=1 to n do image1.Canvas.TextOut(1, 1+15*i, ('x'+ floattostr (i)+'= '+floattostr(x[i])));i:=0 to 249 do begin
for j:=0 to 161 do begin
if image1.Canvas.Pixels [i,j]<>clblack then image1.Canvas.Pixels [i,j]:=image1.Canvas.Pixels[1,1];;TForm3.Edit1Change(Sender: TObject);
with StringGrid1, Edit1 do
begin
ColCount:= StrToIntDef(Text, 3);
RowCount:= StrToIntDef(Text, 3);
end;
with StringGrid2, Edit1 do
RowCount:= StrToIntDef(Text, 3);edit1.Text='2' then button2.Enabled:=true else button2.Enabled:=false;; //Button2 работает только при N=2
procedure TForm3.FormCreate(Sender: TObject);
var i, j: integer;
//Заполнить коэф уравнения
Randomize;
for I:= 0 to StrToIntDef(Text, StringGrid1.ColCount) - 1 do
for J:= 0 to StrToIntDef(Text, StringGrid1.RowCount) - 1 do
StringGrid1.Cells[I, J]:= IntToStr(Random(100));
for I:= 0 to StrToIntDef(Text, StringGrid2.RowCount) - 1 do
StringGrid2.Cells[0, I]:= IntToStr(Random(100))TForm3.N6Click(Sender: TObject);.Visible:=true;;TForm3.N4Click(Sender: TObject);;;TForm3.N3Click(Sender: TObject);: string;savepicturedialog1.Execute then
begin
FileName:= savepicturedialog1.FileName;
image1.Picture.SaveToFile(filename);// сохранение Image1 в файл;TForm3.N2Click(Sender: TObject);.Visible:=true;;TForm3.Button2Click(Sender: TObject);,j: integer;.Image1.Canvas.Rectangle(0,0,400,400);i:=1 to 398 do beginj:=1 to 398 do begin.Image1.Canvas.Pixels[i,j]:=form3.Image1.Canvas.Pixels[1,1];;
end; //рисуем рамку и красим ее в цвет окна
form5.Visible:=true;.Image1.Canvas.pen.Color:=clred;.Image1.Canvas.MoveTo(0,200-50*round((strtofloat(stringGrid2.Cells[0,0])+4*strtofloat(stringGrid1.Cells[0,0]))/strtofloat(stringGrid1.Cells[1,0])));.Image1.Canvas.LineTo(400,200-50*round((strtofloat(stringGrid2.Cells[0,0])-4*strtofloat(stringGrid1.Cells[0,0]))/strtofloat(stringGrid1.Cells[1,0])));.Image1.Canvas.Pen.Color:=clblue;.Image1.Canvas.MoveTo(0,200-50*round((strtofloat(stringGrid2.Cells[0,1])+4*strtofloat(stringGrid1.Cells[0,1]))/strtofloat(stringGrid1.Cells[1,1])));.Image1.Canvas.LineTo(400,200-50*round((strtofloat(stringGrid2.Cells[0,1])-4*strtofloat(stringGrid1.Cells[0,1]))/strtofloat(stringGrid1.Cells[1,1])));.Image1.Canvas.Pen.Color:=clblack;:=0;.Image1.Canvas.MoveTo(200,0);.Image1.Canvas.LineTo(200,400);.Image1.Canvas.MoveTo(0,200);.Image1.Canvas.LineTo(400,200);:=i+50;.Image1.Canvas.MoveTo(i,195);.Image1.Canvas.LineTo(i,205);.Image1.Canvas.MoveTo(195,i);.Image1.Canvas.LineTo(205,i); i>300;
form5.Image1.Canvas.TextOut(185,145,'1');// процедура, описывающая построение графика;
unit Unit4;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls;
TForm4 = class(TForm)
Image1: TImage;
{ Private declarations }
public
{ Public declarations }
end;
Form4: TForm4;
{$R *.dfm}
end.
На этой форме разместим Image1, на которой и будем реализовать график. Его алгоритм прописан в Unit3
Код unit5Unit5;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
TForm5 = class(TForm)
Image1: TImage;
private
{ Private declarations }
public
{ Public declarations }
end;
Form5: TForm5;
{$R *.dfm}.
Код unit1
Unit1;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
TForm1 = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
end;
Form1: TForm1;
{$R *.dfm}TForm1.FormCreate(Sender: TObject);
begin.Caption:='Данная программа реализует решение'+#10#13+'систем линейных алгебраических уравнений'+#10#13+ 'методом Гаусса';;
Вывод
Метод Гаусса относится к прямым методам нахождения решений для систем СЛАУ. Метод Гаусса удобно применять для систем маленькой и средней размерности. Для больших же размерностей или разреженных матриц более эффективными представляются итерационные методы. Метод Гаусса с выбором главного элемента по столбцу более устойчивый к ошибкам и при этом не требующий больших дополнительных затрат ресурсов ЭВМ.
Список использованной литературы
1. http:/www.wikipedia.org/wiki/Метод Гаусса
. Карчевская М.П., Рамбургер О.Л., Тархов С.В., Хамзина Е.А. "Разработка приложений в среде Borland Delphi", УГАТУ-2005
. Мастер - Самоучитель по Delphi 7 AlexSoft 1997-2001 г.