Реферат: Решение системы линейных уравнений методом Гаусса и Жордана-Гаусса
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
СУМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Курсоваяработа
попрограммированию по теме:
«Решениесистемы линейных уравнений методом Гаусса и Жордана-Гаусса»
Сумы2005
ПЛАН
ПостановказадачиТеоретическаячастьМетоды решенияпримененные в программеМетод Гаусса.МетодЖордана-Гаусса.Краткое описаниесреды визуальной разработки DelphiТаблица основныхобозначений программы.Описание процедури алгоритм роботы программыТекст программы.Файл-модульunit1.pasФайл-модульunit2.pasФайл проекта — Project1.dpr:Результат работыпрограммы.Инструкция поработе с программойИспользованнаяЛитература
/>Постановказадачи
Составить программу для решения системлинейных уравнений размером n на n методом Гауса и Жордана-Гаусса.
/>ТеоретическаячастьМетодырешения примененные в программе МетодГаусса
Метод Гаусса решениясистем линейных уравнений состоит в последовательном исключении неизвестных иописывается следующей процедурой.
С помощью элементарныхпреобразований над строками и перестановкой столбцов расширенная матрица /> системы /> может бытьприведена к виду
/>
Эта матрица являетсярасширенной матрицей системы
/>
которая эквивалентнаисходной системе />
Заметим, чтоперестановка столбцов означает перенумерацию переменных. На практике обычноизбегают этой процедуры, приводя расширенную матрицу к ступенчатому виду путемэлементарных преобразований над строками.
Если хотя бы одно изчисел />отличноот нуля, то система /> несовместна. Если же />, то система /> совместна иможно получить явное выражение для /> базисных неизвестных />через /> свободныхнеизвестных />
Метод Жордана-Гаусса.Элементарныепреобразования этого метода аналогичны методу Гаусса, только матрица прииспользовании этого метода приводится к виду, тоесть столбец свободныхкоэффициентов превращается в столбец корней.
/>
Краткое описание среды визуальнойразработки DelphiСреда Delphi — это сложный механизм,обеспечивающий высокоэффективную работу программиста. Визуально она реализуетсянесколькими одновременно раскрытыми на экране окнами. Окна могут перемещатьсяпо экрану, частично или полностью перекрывая друг друга, что обычно вызывает упользователя, привыкшего к относительной “строгости” среды текстового процессораWord или табличного процессора Excel, ощущение некоторого дискомфорта. Послеприобретения опыта работы с Delphi это ощущение пройдет, и вы научитесь быстроотыскивать нужное окно, чтобы изменить те или иные функциональные свойствасоздаваемой вами программы, ибо каждое окно несет в себе некоторуюфункциональность, т. е. предназначено для решения определенных задач.
Запустите Delphi — и вы увидите нечто,похожее на
/>
На рисунке изображены шесть наиболееважных окон Delphi: главное окно, окно Дерева объектов (Object Tree View), окноИнспектора объектов, окно браузера, окно формы и окно кода программы.
Чтобы упорядочить окна так, как онипоказаны на рисунке, вам придется вручную изменять их положение и размеры, т.к. обычно окно кода программы почти полностью перекрыто окном формы. Впрочем,добиваться максимального сходства того, что вы видите на экране вашего ПК, сизображением, показанным на рисунке, вовсе не обязательно: расположение и размерыокон никак не влияют на их функциональностью.
Замечу, что при первом запуске Delphiповерх всех окон появится окно
/>
С помощью этого окна вы сможете получитьдоступ к Web-страницам корпорации Inprise для просмотра самой свежей информациио корпорации и ее программных продуктах, копирования дополни тельных файлов,чтения ответов на наиболее часто задаваемые вопросы и т. д. При повторных запускахDelphi это окно появляется автоматически с некоторой периодичностью,определяемой настройками на странице окна Tolls | Environment Options, связаннойс закладкой Delphi Direct. Вы также сможете его вызвать в любой момент с помощьюопции Help | Delphi Direct главного меню.
/>Таблица основныхобозначений программы.
Обозначение
Описание Модуль maxr Константа для ограничения максимального размера системы Unit2 arys, ary2s Типы данных для переменных, в которых хранятся значения коэффициентов системы Unit2 Gauss1 Процедура для решения системы линейных уравнений методом Гаусса Unit2 Gaussj Процедура для решения системы линейных уравнений методом Жордана-Гаусса Unit2 i,j,l Счетчики Unit1 prover Промежуточная переменная типа String, используется для проверки наличия букв среди коэффициентов системы, а также для замены «.» на «,». Unit1 S Переменная для хранения размера матрицы Unit1 k Переменная для хранения длины строчки хранящейся в переменной prover. Unit1 dl Переменная для проверки размера системы. Unit1 MainMenu1 Меню программы. Unit1 File1, New1, Save1, Exit1 Пункты меню. Unit1 Matrix, Coef, Gauss, Jgauss Таблицы для ввода элементов системы и вывода результатов расчета. Unit1 XPManifest1 Компонент, который дает программе возможность использовать оформление Windows. Unit1 SaveDialog1 Диалоговое окно для сохранения результатов. Unit1 Button1, Button2 Кнопки для запуска процедур решения системы. Unit1 New1Click Процедура, которая выполняется после выбора пункта меню New. Unit1 Button1Click Процедура, которая выполняется после нажатия кнопки Gauss. Unit1 Button2Click Процедура, которая выполняется после нажатия кнопки J-Gauss. Unit1 Save1Click Процедура, которая выполняется после выбора пункта меню Save. Unit1 Exit1Click Процедура, которая выполняется после выбора пункта меню Exit. Unit1 Form1 Собственно окно программы. Unit1 />Описание процедур иалгоритм роботы программыВ программу включены следующие процедуры: «gauss1», «gaussj», «New1Click», «Button1Click», «Button2Click», «Save1Click», «Exit1Click». С каждой из них мы ознакомимся ниже.
Процедура «gauss1» выполняет проверку системына сходимость и решение методом Гаусса.
Процедура «gaussj» выполняет проверку системы насходимость и решение методом Жордана-Гаусса.
Процедура «New1Click» выполняетсяпосле выбора пункта меню «New» или сразу после запуска программы и выполняет чтениеразмера системы и устанавливает размер таблиц для ввода коэффициентов системы.
Процедура «Button1Click» считываеткоэффициенты системы, проверяет корректность ввода коэффициентов и заменяет принеобходимости «.» на «,». Потом запускает процедуру «gauss1» для решения системы ивыводит результаты.
Процедура «Button2Click» считываеткоэффициенты системы, проверяет корректность ввода коэффициентов и заменяет принеобходимости «.» на «,». Потом запускает процедуру «gaussj» для решения системы и выводитрезультаты.
Процедура «Save1Click» запускаетдиалог сохранения файлов и выполняет сохранение результатов.
Процедура «Exit1Click» — Выход изпрограммы./>
Текст программы.Файл-модульunit1.pasunit Unit1;
interface
uses
Windows, Messages, SysUtils,Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, XPMan,StdCtrls, Grids, unit2;
type
TForm1 = class(TForm)
Coef: TStringGrid;
Gauss: TStringGrid;
Jgauss: TStringGrid;
Button1: TButton;
Button2: TButton;
XPManifest1: TXPManifest;
SaveDialog1: TSaveDialog;
MainMenu1: TMainMenu;
File1: TMenuItem;
New1: TMenuItem;
Save1: TMenuItem;
Exit1: TMenuItem;
Matrix: TStringGrid;
procedure New1Click(Sender:TObject);
procedureButton1Click(Sender: TObject);
procedureButton2Click(Sender: TObject);
procedure Save1Click(Sender:TObject);
procedure Exit1Click(Sender:TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
s:integer;
implementation
{$R *.dfm}
procedureTForm1.Exit1Click(Sender: TObject);
begin
close;
end;
procedureTForm1.New1Click(Sender: TObject);
var i,dl:integer;
prover:string;
begin
form1.Enabled:=false;
repeat
prover:=inputbox('Введите размер системы','Значение между 2 и 20','2');
dl:=length(prover);
if dl=0 then showmessage('Введите размер системы') else
begin
if (dl=1) and (prover<'9')and (prover>'0') then s:=trunc(strtofloat(prover))
else
begin
for i:=1 to dl do
begin
if prover[i]>'9' then
begin
showmessage('Введите число');
break;
end
else if i=dl thens:=trunc(strtofloat(inputbox('Введите размер системы','Значение между 2 и 20','2')));
end;
end;
end;
until (s>=2) and(s<=maxr);
form1.Enabled:=true;
matrix.RowCount:=s+1;
matrix.ColCount:=s+1;
gauss.colCount:=s+1;
coef.rowCount:=s+1;
jgauss.colCount:=s+1;
coef.Cells[1,0]:='B';
gauss.Cells[0,1]:='Gauss';
jgauss.Cells[0,1]:='J-Gauss';
for i:=1 to s do
begin
matrix.Cells[0,i]:=floattostr(i);
matrix.Cells[i,0]:='A'+floattostr(i);
coef.Cells[0,i]:=floattostr(i);
gauss.Cells[i,0]:='X'+floattostr(i);
jgauss.Cells[i,0]:='X'+floattostr(i);
end;
end;
procedureTForm1.Button1Click(Sender: TObject);
var a:ary2s;
x,y:arys;
error:boolean;
i,j,l,K:integer;
prover:string;
begin
{Считывание массивов с исходными даннымии проверка '.' или ','}
{***********************************************}
for i:=1 to s do
for j:=1 to s do
begin
prover:=matrix.Cells[j,i];
k:=length(prover);
if k=0 then
begin
showmessage('Вы не ввели один илинесколько элементов системы.');
exit;
end;
for l:=1 to length(prover) do
if prover[l]='.' thenprover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного илинескольких элементов системы введена буква. Замените их на числа!');
exit;
end;
matrix.Cells[j,i]:=prover;
a[i,j]:=strtofloat(matrix.cells[j,i]);
end;
for i:=1 to s do
begin
prover:=coef.cells[1,i];
for l:=1 to length(prover) do
if prover[l]='.' thenprover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного илинескольких элементов системы введена буква. Замените их на числа!');
exit;
end;
coef.cells[1,i]:=prover;
y[i]:=strtofloat(coef.cells[1,i]);
end;
{***********************************************}
{Решение и вывод результатов}
{***********************************************}
gauss1(a,y,x,s,error);
if not error then
for i:=1 to s do
gauss.cells[i,1]:=floattostr(x[i])
else
begin
showmessage('Система решения не имеет');
new1.Click;
end;
{***********************************************}
end;
procedureTForm1.Button2Click(Sender: TObject);
var a:ary2s;
x,y:arys;
error:boolean;
i,j,l,k:integer;
prover:string;
begin
{Считывание массивов с исходными данными}
{***********************************************}
{Считывание массивов с исходными даннымии проверка '.' или ','}
{***********************************************}
for i:=1 to s do
for j:=1 to s do
begin
prover:=matrix.Cells[j,i];
k:=length(prover);
if k=0 then
begin
showmessage('Вы не ввели один илинесколько элементов системы.');
exit;
end;
for l:=1 to length(prover) do
if prover[l]='.' thenprover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного илинескольких элементов системы введена буква. Замените их на числа!');
exit;
end;
matrix.Cells[j,i]:=prover;
a[i,j]:=strtofloat(matrix.cells[j,i]);
end;
for i:=1 to s do
begin
prover:=coef.cells[1,i];
for l:=1 to length(prover) do
if prover[l]='.' thenprover[l]:=','
else if prover[l]>'9' then
begin
showmessage('В качестве одного илинескольких элементов системы введена буква. Замените их на числа!');
exit;
end;
coef.cells[1,i]:=prover;
y[i]:=strtofloat(coef.cells[1,i]);
end;
{***********************************************}
{***********************************************}
{Решение и вывод результатов}
{***********************************************}
gaussj(a,y,x,s,error);
if not error then
for i:=1 to s do
jgauss.cells[i,1]:=floattostr(x[i])
else
begin
showmessage('Система решения не имеет');
new1.Click;
end;
{***********************************************}
end;
procedureTForm1.Save1Click(Sender: TObject);
var f:textfile;
i,j:integer;
begin
savedialog1.Filter:='Textfiles (*.txt)|*.txt|';
if savedialog1.Execute then
begin
assignfile(f,savedialog1.filename+'.txt');
rewrite(f);
for i:=1 to s do
begin
writeln(f);
for j:=1 to s do
write(f,matrix.cells[i,j]:4,'');
write(f,'|',coef.cells[1,i]);
end;
writeln(f);
writeln(f);
writeln(f,'Gauss');
for i:=1 to s do
writeln(f,'X'+floattostr(i)+'='+gauss.cells[i,1],'');
writeln(f);
writeln(f,'J-Gauss');
for i:=1 to s do
writeln(f,'X'+floattostr(i)+'='+jgauss.cells[i,1],'');
closefile(f);
end;
end;
end.
Файл-модуль unit2.pasunit unit2;
interface
const maxr=20;
type arys=array[1..maxr] ofreal;
ary2s=array[1..maxr,1..maxr]of real;
procedure gauss1(a:ary2s;y:arys; var coef:arys; ncol:integer; var error:boolean);
procedure gaussj(var b:ary2s;y: arys; var coef:arys; ncol:integer; var error: boolean);
implementation
{Решение системы линейных уравненийметодом Гаусса}
{**********************************************************}
procedure gauss1(a:ary2s;y:arys; var coef:arys; ncol:integer; var error:boolean);
var b:ary2s;
w:arys;
i,j,i1,k,l,n:integer;
hold,sum,t,ab,big:real;
begin
error:=false;
n:=ncol;
for i:=1 to n do
begin
for j:=1 to n do
b[i,j]:=a[i,j];
w[i]:=y[i]
end;
for i:=1 to n-1 do
begin
big:=abs(b[i,i]);
l:=i;
i1:=i+1;
for j:=i1 to n do
begin
ab:=abs(b[j,i]);
if ab>big then
begin
big:=ab;
l:=j
end
end;
if big=0.0 then error:= true
else
begin
if l<>i then
begin
for j:=1 to n do
begin
hold:=b[l,j];
b[l,j]:=b[i,j];
b[i,j]:=hold
end;
hold:=w[l];
w[l]:=w[i];
w[i]:=hold
end;
for j:=i1 to n do
begin
t:=b[j,i]/b[i,i];
for k:=i1 to n do
b[j,k]:=b[j,k]-t*b[i,k];
w[j]:=w[j]-t*w[i]
end
end
end;
if b[n,n]=0.0 thenerror:=true
else
begin
coef[n]:=w[n]/b[n,n];
i:=n-1;
repeat
sum:=0.0;
for j:=i+1 to n do
sum:=sum+b[i,j]*coef[j];
coef[i]:=(w[i]-sum)/b[i,i];
i:=i-1
until i=0
end
end;
{**********************************************************}
{Решение системы линейных уравненийметодом Жордана-Гаусса}
{**********************************************************}
procedure gaussj(var b:ary2s;y: arys; var coef:arys; ncol:integer; var error: boolean);
var w:array[1..maxr,1..maxr]of real;
index:array[1..maxr,1..3]of integer;
i,j,k,l,nv,irow,icol,n,l1:integer;
determ,pivot,hold,sum,t,ab,big:real;
{++++++++++++++++++++++++++++++++++++++++++++}
procedure swap(var a,b:real);
var hold:real;
begin
hold:=a;
a:=b;
b:=hold
end;
{++++++++++++++++++++++++++++++++++++++++++++}
{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
procedure gausj2;
var i,j,k,l,l1:integer;
{===============================================}
procedure gausj3;
var l:integer;
begin
if irow<>icol then
begin
determ:=-determ;
for l:=1 to n do
swap(b[irow,l],b[icol,l]);
if nv>0 then
for l:=1 to nv do
swap(w[irow,l],w[icol,l])
end
end;
{===============================================}
begin
error:=false;
nv:=1;
n:=ncol;
for i:=1 to n do
begin
w[i,1]:=y[i];
index[i,3]:=0
end;
determ:=1.0;
for i:=1 to n do
begin
big:=0.0;
for j:=1 to n do
begin
if index[j,3]<>1 then
begin
for k:=1 to n do
begin
ifindex[k,3]>1 then
begin
error:=true;
exit;
end;
if index[k,3]<1 then
ifabs(b[j,k])>big then
begin
irow:=j;
icol:=k;
big:=abs(b[j,k])
end
end
end
end;
index[icol,3]:=index[icol,3]+1;
index[i,1]:=irow;
index[i,2]:=icol;
gausj3;
pivot:=b[icol,icol];
determ:=determ*pivot;
b[icol,icol]:=1.0;
for l:=1 to n do
b[icol,l]:=b[icol,l]/pivot;
if nv>0 then
for l:=1 to nv do
w[icol,l]:=w[icol,l]/pivot;
for l1:=1 to n do
begin
if l1<>icol then
begin
t:=b[l1,icol];
b[l1,icol]:=0.0;
for l:=1 to n do
b[l1,l]:=b[l1,l]-b[icol,l]*t;
if nv>0 then
for l:=1 to nv do
w[l1,l]:=w[l1,l]-w[icol,l]*t;
end
end
end;
end;
{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}
begin
gausj2;
if error then exit;
for i:=1 to n do
begin
l:=n-i+1;
ifindex[l,1]<>index[l,2] then
begin
irow:=index[l,1];
icol:=index[l,2];
for k:=1 to n do
swap(b[k,irow],b[k,icol])
end
end;
for k:=1 to n do
if index[k,3]<>1 then
begin
error:=true;
exit;
end;
for i:=1 to n do
coef[i]:=w[i,1];
end;
{**********************************************************}
end.
Файл проекта — Project1.dpr:program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas';
{$R *.res}
begin
Application.Initialize;
Application.Title :='Gauss&J-Gauss';
Application.CreateForm(TForm1,Form1);
Application.Run;
end.
/>Результат работыпрограммы
/>
Результаты сохраненные вфайле:
2 1 1 |2
3 2 3 |6
6 5 4 |5
Gauss
X1=-7,4
X2=1,2
X3=2,2
J-Gauss
X1=-7,4
X2=1,2
X3=2,2
/> Инструкция по работе с программой1. Сразу после запуска файлапрограммы (pragramma.exe) перед вами появиться окно с запросом размера системы.Введите нужный размер и нажмите «ОК»(поскольку система размера n на nнужно ввести только одно число).
2. После ввода размера перед вамипоявится рабочее окно программы. Введите в него данные по следующей схеме:
/>
3. Для решения нужным методом нажмитесоответствующую кнопку, и в таблице возле нее будут выведены корни системы.
4. Для сохранения результатов в меню«File» выберите «Save», перейдите в нужную папку ивведите имя файла. Нажмите «ОК».
5. Для начала новыхрассчетов «File» выберите «New»,введите новый размер системы, нажмите «ОК».
6. Для выхода в меню «File»выберите пункт «Exit».
/>ИспользованнаяЛитература.
· Волков Е.А. численные методы: Учебное пособие для вузов. – 2-еизд., испр. – М.: Наука, 1987. – 248 с.
· Роганин А.М. Основные формулы высшей математики. – Х.: Торсинг, 2002
· Справочная система Borland Delphi 7.
· http://delphi.vitpc.com/
· http://www.fortunecity.com/campus/beverly/963/
· http://www.delphi.agava.ru/
· http://www.interface.ru/delphi/delphi_page.htm
· http://pog.da.ru/