Решение задач линейной алгебры средствами Delphi: Метод Гаусса для решения систем линейных алгебраических уравнений
Захаров Д.С., ИСТ-21д
МИНОБРНАУКИ РОССИИ
Федеральное
государственное бюджетное
высшего профессионального образования
«Себряковский филиал Волгоградского
государственного архитектурно-строительного
университета»
(ФГБОУ ВПО «СФ ВолгГАСУ»)
Кафедра Математических и естественно-научных дисциплин
Решение задач линейной алгебры средствами Delphi: Метод Гаусса для решения систем линейных алгебраических уравнений
курсовая работа
по специальности 230400.62 «Информационные системы и технологии (бакалавр)»
Исполнитель: Захаров Дмитрий ИСТ-21д ___________________________ (подпись) | |
|
«Прошла защиту»
Оценка ________________________ |
Руководитель: Отрощенко Д.С., преподаватель
___________________________ (подпись) |
Михайловка
2012
Содержание
1. Введение 3
2. Содержательная часть 4
2.1. История 4
2.2. Описание метода 4
2.3. Условие совместности 5
3. Практическая часть. 6
3.1. Постановка задачи 6
3.2. Методы решения линейных уравнений 6
3.3. Руководство пользователя 7
3.4. Листинг 9
4. Заключение 17
5. Список литературы 18
Введение
Для разработки курсового проекта была предоставлена задача: написать программу которая выводила бы решение системы линейных уравнений с тремя переменными методом Гаусса.
Метод Гаусса — классический метод решения системы линейных алгебраических уравнений (СЛАУ). Это метод последовательного исключения переменных, когда с помощью элементарных преобразований система уравнений приводится к равносильной системе ступенчатого (или треугольного) вида, из которой последовательно, начиная с последних (по номеру) переменных, находятся все остальные переменные.
Данная программа писалась на языке Delphi в бесплатной среде Lazarus. Lazarus — свободная среда разработки программного обеспечения для компилятора Free Pascal (часто используется сокращение FPC— свободно распространяемый компилятор языка программирования Pascal) на языке Object Pascal. Интегрированная среда разработки предоставляет возможность кроссплатформенной разработки приложений в Delphi-подобном окружении. На данный момент является единственным инструментом быстрой разработки приложений (RAD), позволяющим Delphi-программистам создавать приложения с графическим интерфейсом для Linux (и других не-Windows) систем.
Позволяет достаточно несложно переносить Delphi-программы с графическим интерфейсом в различные операционные системы: Linux, FreeBSD, Mac OS X, Microsoft Windows, Android. Начиная с Delphi XE2 в самом Delphi имеется возможность компиляции программ для Mac OS X и iOS.
Содержательная часть
История
Хотя в настоящее время данный метод повсеместно называется методом Гаусса, он был известен и до К. Ф. Гаусса. Первое известное описание данного метода — в китайском трактате «Математика в девяти книгах», составленном между I в. до н.э. и II в. н. э.
Описание метода
Пусть исходная система выглядит следующим образом
Матрица называется основной матрицей системы, — столбцом свободных членов.
Тогда согласно свойству элементарных преобразований над строками основную матрицу этой системы можно привести к ступенчатому виду (эти же преобразования нужно применять к столбцу свободных членов):
При этом будем считать, что базисный минор (ненулевой минор максимального порядка) основной матрицы находится в верхнем левом углу, то есть в него входят только коэффициенты при переменных .
Тогда переменные называются главными переменными. Все остальные называются свободными.
Если хотя бы одно число , где , то рассматриваемая система несовместна, т.е. у неё нет ни одного решения.
Пусть для любых .
Перенесём свободные переменные за знаки равенств и поделим каждое из уравнений системы на свой коэффициент при самом левом ( , где — номер строки):
,
где
Если свободным переменным системы (2) придавать все возможные значения и решать новую систему относительно главных неизвестных снизу вверх (то есть от нижнего уравнения к верхнему), то мы получим все решения этой СЛАУ. Так как эта система получена путём элементарных преобразований над исходной системой (1), то по теореме об эквивалентности при элементарных преобразованиях системы (1) и (2) эквивалентны, то есть множества их решений совпадают.
Условие совместности
Упомянутое выше условие для всех может быть сформулировано в качестве необходимого и достаточного условия совместности:
Теорема Кронекера — Капелли.
Система совместна тогда и только тогда, когда ранг её основной матрицы равен рангу её расширенной матрицы.
Практическая часть.
Постановка задачи
Дана система из n линейных уравнений вида:
a11x1+a12x2+…+a1nxn=b1 (
a21x1+a22x2+…+a2nxn=b2
an1x1+an2x2+…+annxn=bn.
Требуется получить решение системы линейных
уравнения (3) при любых заданных коэффициентах
aij и bi.
3.2. Методы решения линейных уравнений
Системы линейных уравнений вида (3) решаются точными и итерационными методами. Точные методы дают точное решение за конечное число операций, если все они выполнялись без погрешности. Число операций итерационных методов зависит от заданной погрешности вычислений. Метод Гаусса является точным методом решения системы линейных уравнений.
Метод Гаусса или метод последовательного исключения неизвестных основан на приведении матрицы коэффициентов А=(aij) к треугольному виду. При этом алгоритм решения системы линейных уравнений следующий:
1. С помощью двух циклов с управляющими переменными i=1,2,..,n и j=1,2,…,n организуется ввод коэффициентов aij и bi образующих массивы A=(aij), B=(bi).
2.Делается прямой ход исключения переменных путем преобразования коэффициентов по формулам:
aij =-aij/aii; akj=akj+aijaik; bi=bi+aijbi
где i=1,2,…,n-1; j=i+1,i+2,…,n; k=i+1,i+2,…,n.
В конце этих преобразований получается xn=bn/ann.
3.Организуется обратный ход (последовательное нахождение xn-1, xn-2 , …, x2, x1), проводя вычисления по формулам:
h=bi, h=h-xiaij, xi=h/aii, где i=n-1, n-2,…, 2, 1; j=i+1, i+2,…,n;
В результате формируется массив X=(xi) неизвестных xn, xn-1,…, x2, x1.
Особенностью метода Гаусса является то, что при прямом ходе производится выбор элемента строки отличного от нуля, если элемент aii, стоящий на главной диагонали матрицы А, равен 0.
Этот выбор осуществляется путем перестановки соответствующих строк матрицы А. Это исключает деление на 0, если матрица A=(aij) содержит нулевые элементы на главной диагонали.
Руководство пользователя
Пользоваться данной программой довольно просто: начинать работу нужно с ввода коэффициентов при переменных x1,x2,x3 (для удобства в программе были изменены на переменные X, Y, Z).
После этого, следует обязательно нажать на кнопку «Вывести» для того чтобы программа вывела систему уравнений на экран для наглядности.
Однако, имеется ряд правил занесения коэффициентов в систему: в первое уравнение надлежит ставить уравнение, в котором есть первый коэффициент при Х. В обратном случае программа выдаст ошибку:
Затем при нажатии на кнопку «Ответ» программа выдаст результат:
В
программу также добавлена
Листинг
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label3: TLabel;
Label4: TLabel;
Label8: TLabel;
Label9: TLabel;
Scobka3: TLabel;
Scobka4: TLabel;
Scobka5: TLabel;
Uravnenie2: TLabel;
Label1: TLabel;
Label2: TLabel;
Uravnenie3: TLabel;
Uravnenie4: TLabel;
X1: TEdit;
X2: TEdit;
X3: TEdit;
O1: TEdit;
Y1: TEdit;
Y2: TEdit;
O2: TEdit;
Y3: TEdit;
Z1: TEdit;
Z2: TEdit;
Z3: TEdit;
O3: TEdit;
Uravnenie1: TLabel;
Reshenie: TLabel;
Main: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
LabelY: TLabel;
LabelX: TLabel;
LabelZ: TLabel;
Scobka1: TLabel;
OtvetX: TLabel;
OtvetY: TLabel;
OtvetZ: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
px1:integer; //Переменные вводимые в ячейки
px2:integer;
px3:integer;
py1:integer;
py2:integer;
py3:integer;
pz1:integer;
pz2:integer;
pz3:integer;
po1:integer;
po2:integer;
po3:integer;
ipx2:real; //Измененные переменные(1 шаг решения системы)
ipy2:real;
ipz2:real;
ipo2:real;
ipx3:real;
ipy3:real;
ipz3:real;
ipo3:real;
kipy3:real;//Конечно измененные переменные(2 шаг решения системы)
kipz3:real;
kipo3:real;
RX:real; //Окончательное решение системы
RY:real;
RZ:real;
VX1:string;//Переменные для "удобного" и наглядного вывода на экран
VY1:string;
VZ1:string;
VX2:string;
VY2:string;
VZ2:string;
VX3:string;
VY3:string;
VZ3:string;
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
px1:=StrtoInt(x1.text);
px2:=StrtoInt(x2.text);
px3:=StrtoInt(x3.text);
py1:=StrtoInt(y1.text);
py2:=StrtoInt(y2.text);
py3:=StrtoInt(y3.text);
pz1:=StrtoInt(z1.text);
pz2:=StrtoInt(z2.text);
pz3:=StrtoInt(z3.text);
po1:=StrtoInt(o1.text);
po2:=StrtoInt(o2.text);
po3:=StrtoInt(o3.text);
if px1=0 then showmessage ('Поставьте на первое место уравнение в котором есть коэффициент при X') else
begin
ipx2:=px1*(-px2/px1)+px2;
ipy2:=py1*(-px2/px1)+py2;
ipz2:=pz1*(-px2/px1)+pz2;
ipo2:=po1*(-px2/px1)+po2;
ipx3:=px1*(-px3/px1)+px3;
ipy3:=py1*(-px3/px1)+py3;
ipz3:=pz1*(-px3/px1)+pz3;
ipo3:=po1*(-px3/px1)+po3;
if ipy2=0 then showmessage ('Нет решений! Проверьте систему уравнений!') else
begin
kipy3:=ipy2*(-ipy3/ipy2)+ipy3;
kipz3:=ipz2*(-ipy3/ipy2)+ipz3;
kipo3:=ipo2*(-ipy3/ipy2)+ipo3;
end;
end;
if px1=0 then VX1:='' else // Вывод на экран уравнений
if px1=1 then VX1:=''+'X' else
if px1=-1 then VX1:=''+'-X' else
begin
if px1>0 then VX1:=''+IntToStr(px1)+'X' else VX1:=IntToStr(px1)+'X';
end;
if py1=0 then VY1:='' else
if py1=1 then if px1=0 then VY1:=''+'Y' else VY1:=''+'+Y' else
if py1=-1 then VY1:='-Y' else
begin
if py1>0 then
begin
if px1=0 then VY1:=''+IntToStr(py1)+'Y' else VY1:='+'+IntToStr(py1)+'Y';
end else VY1:=IntToStr(py1)+'Y';
end;
if pz1=0 then VZ1:='' else
begin
if pz1>0 then
if pz1=1 then if px1=0 then if py1=0 then VZ1:=''+'Z' else VZ1:=''+'+Z' else VZ1:=''+'+Z' else
if pz1=-1 then VZ1:='-Z' else
begin
if px1=0 then
if py1=0 then Vz1:=IntToStr(pz1)+'Z'
else Vz1:='+'+IntToStr(pz1)+'Z'
else Vz1:='+'+IntToStr(pz1)+'Z';
end else VZ1:=IntToStr(pz1)+'Z';
end;
if px2=0 then VX2:='' else
if px2=1 then VX2:=''+'X' else
if px2=-1 then VX2:='-X' else
begin
if px2>0 then VX2:=''+IntToStr(px2)+'X' else VX2:=IntToStr(px2)+'X';
end;
if py2=0 then VY2:='' else
if py2=1 then if px2=0 then VY2:=''+'Y' else VY2:=''+'+Y' else
if py2=-1 then VY2:='-Y' else
begin
if py2>0 then
begin
if px2=0 then VY2:=''+IntToStr(py2)+'Y' else VY2:='+'+IntToStr(py2)+'Y';
end else VY2:=IntToStr(py2)+'Y';
end;
if pz2=0 then VZ2:='' else
if pz2=1 then if px2=0 then if py2=0 then VZ2:=''+'Z' else VZ2:=''+'+Z' else VZ2:=''+'+Z' else
if pz2=-1 then VZ2:='-Z' else
begin
if pz2>0 then
begin
if px2=0 then
if py2=0 then Vz2:=IntToStr(pz2)+'Z'
else Vz2:='+'+IntToStr(pz2)+'Z'
else Vz2:='+'+IntToStr(pz2)+'Z';
end else VZ2:=IntToStr(pz2)+'Z';
end;
if px3=0 then VX3:='' else
if px3=1 then VX3:=''+'X' else
if px3=-1 then VX3:='-X' else
begin
if px3>1 then VX3:=''+IntToStr(px3)+'X' else VX3:=IntToStr(px3)+'X';
end;
if py3=0 then VY3:='' else
if py3=1 then if px3=0 then VY3:=''+'Y' else VY3:=''+'+Y' else
if py3=-1 then VY3:='-Y' else
begin
if py3>1 then
begin
if px3=0 then VY3:=''+IntToStr(py3)+'Y' else VY3:='+'+IntToStr(py3)+'Y';
end else VY3:=IntToStr(py3)+'Y';
end;
if pz3=0 then VZ3:='' else
if pz3=1 then if px3=0 then if py3=0 then VZ3:=''+'Z' else VZ3:=''+'+Z' else VZ3:=''+'+Z' else
if pz3=-1 then VZ3:='-Z' else
begin
if pz3>1 then
begin
if px3=0 then
if py3=0 then Vz3:=IntToStr(pz3)+'Z'
else Vz3:='+'+IntToStr(pz3)+'Z'
else Vz3:='+'+IntToStr(pz3)+'Z';
end else VZ3:=IntToStr(pz3)+'Z';
end;
Label1.caption:=VX1+VY1+VZ1+'=
Label2.caption:=VX2+VY2+VZ2+'=
Label3.caption:=VX3+VY3+VZ3+'=
Label4.caption:=FloatToStr(
Label8.caption:=FloatToStr(
Label9.caption:=FloatToStr(
Label16.caption:=FloatToStr(
Label17.caption:=FloatToStr(
Label18.caption:=FloatToStr(
end; // дополнительные функции показа «спуска»
procedure TForm1.Button1Click(Sender: TObject);
begin
RZ:=kipo3/kipz3; //вывод ответов
RY:=(ipo2-ipz2*RZ)/ipy2;
RX:=(po1-py1*RY-pz1*RZ)/px1;
OtvetX.caption:=FloatToStr(RX)
OtvetY.caption:=FloatToStr(RY)
OtvetZ.caption:=FloatToStr(RZ)
end;
end.
Заключение
В ходе выполнения данного курсового проекта была составлена программа для решения систем линейных уравнений методом Гаусса. Программу можно модернизировать, введя такую инновацию, как отображение «спуска» и «подъема» системы уравнений. Также возможно оптимизировать «ловушки» ошибок и исключений. В некоторых случаях рациональное введение - замена структуры if…else на switch…case, что соответствовало бы требованиям структурного программирования.
Список литературы
- Дадаян А. «Алгебра и геометрия»
- Гантмахер Ф.Р. Теория матриц (издание третье).
- Математический энциклопедический словарь.
- Андреева Л. Реферат по математике «Системы уравнений».
- Фадеев Д.К. «Сборник задач по высшей алгебре».
- Ильин В.А., Поздняк Э.Г.; Линейная Алгебра; 4 изд., 2002г.
- http://ru.wikipedia.org/wiki/М
етод_Гаусса