Автор: Пользователь скрыл имя, 14 Февраля 2011 в 13:23, курсовая работа
Цель работы – разработка программы, которая методом Крамера и методом простой итерации решает систему линейных уравнений.
ВВЕДЕНИЕ 5
1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 7
1.1 ПОСТАНОВКА ЗАДАЧИ 7
1.2 Основные понятия 8
1.3 Метод Крамера 10
1.4 Метод простой итерации 11
2. ПРАКТИЧЕСКАЯ ЧАСТЬ 15
2.1 Обоснование выбора средств разработки 15
2.2. Реализация математической модели в Delphi 16
ЗАКЛЮЧЕНИЕ 17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 18
Преимуществом
итерационных методов является удобное
применение в современной вычислительной
технике, т.к. решения, полученные с помощью
прямых методов обычно содержат погрешность.
Итерационные методы же позволяют получить
решение данной системы с заранее определенной
погрешностью. Явным преимуществом является
значительное превосходство над точные
методы по скорости и удобнее реализуются
на практике.
Т1: Элементы линейной алгебры и аналитической геометрии. – 288 с.: ил.
unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type mas= array[1..10,1..10] of real;
mas1 = array[1..10] of real;
TForm1 = class(TForm)
Matr: TStringGrid;
Svb: TStringGrid;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Eps: TEdit;
Label1: TLabel;
Razm: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Memo1: TMemo;
Label5: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const nmax=20;
var i,j,n:integer; p,p1:integer;
d:real;
mxz:mas1;
tmp:mas;
A: array [1..nmax,1..nmax+1] of real; //расширенная матрица системы
X: array [1..nmax] of real; // решение системы
Form1: TForm1;
implementation
{$R
*.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Clear; // Ввод начальных данных
Matr.Cells[0,0]:='1,02';
Matr.Cells[1,0]:= '-0,25';
Matr.Cells[2,0]:='-0,3';
Matr.Cells[0,1]:='-0,41';
Matr.Cells[1,1]:='1,13';
Matr.Cells[2,1]:='-0,15';
Matr.Cells[0,2]:='-0,25';
Matr.Cells[1,2]:=' -0,14';
Matr.Cells[2,2]:='1,31';
Svb.Cells[0,0]:='0,515';
Svb.Cells[0,1]:='1,555';
Svb.Cells[0,2]:='1,21';
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Application.Terminate; //выход из приложения
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
n:=StrToInt(Razm.Text); //задаем количество неизвестных
for i:=0 to n do //цикл обнуления матрицы
for j:=0 to n do begin
Matr.Cells[i,j]:='';
Svb.Cells[0,j]:='';
end;
//задаем размеры матрицы
Matr.ColCount:=n;
Matr.RowCount:=n;
Svb.RowCount:=n;
end;
procedure TForm1.Button2Click(Sender: TObject);
var x0: array [1..nmax] of real;//начальное приближение
k: integer;
p,s,am,bm,t,e:real;
begin
e:=StrToFloat(Eps.Text);
n:=StrToInt(Razm.Text);
for i:=1 to n do
for j:=1 to n do
a[i,j]:=StrToFloat(Matr.Cells[
for i:=1 to n do
a[i,n+1]:=Strtofloat(Svb.
//Проверка достаточного условия сходимости: абсолютная сумма недиагональных
//коэффициентов элементов
//коэффициентов этой строки
for i:=1 to n do
begin
p:=0;
for j:=1 to n-1 do //цикл получения суммы модулей недиагональных элементов
if j<>i then p:=p+abs(a[i, j]);
if abs(a[i,i])<p then //вывод "Итерационный процесс расходится" и закрытие приложения
begin
messageDLG('Итерационный процесс расходится',mtWarning,[mbOk],
Exit;
end;
end;
//приводим систему к
for i:=1 to n do
begin
for j:=1 to n do
if j<>i then
a[i,j]:=-a[i, j]/a[i, i];
a[i,n+1]:=a[i,n+1]/a[i,i];
a[i,i]:=0;
end;
//вычисление m-нормы матрицы системы уравнений и столбца свободных членов
for i:=1 to n do
begin
s:=0;
for j:=1 to n do
s:=s+abs(a[i, j]);
if i = 1 then
begin
am:=s;
bm:=abs(a[1, n+1]);
end
else
begin
if s>am then
am:=s;
if abs(a[i,n+1])>bm then
bm:=abs(a[i,n+1]);
end;
end;
k:=round((ln(e)+ln(abs(1-am))-
//устанавливаем начальные приближения равные bi
x0[i]:=a[i,n+1];
//цикл вычисления последующих приближений
t:=0;
repeat
for i:=1 to n do //цикл вычисления нового значения корня xi
begin
s:=0;
for j:=1 to n do
s:=s+a[i,j]*x0[j];
x[i]:=a[i,n+1]+s;
end;
t:=t+1;
for i:=1 to n do
x0[i]:=x[i];
until t>k;
// вывод решения
memo1.lines.Add('Решение методом простой итерации:');
for i:=1 to n do
memo1.lines.Add('x'+inttostr(
memo1.lines.Add('k='+ inttostr(k));
end;
function opr(n:integer; a:mas):real; //функция нахождения определителя
var i, j, k: Integer; d: Double;
const
E = 0.000001;
begin
for i := 1 to Pred(n) do
begin
if Abs(a[i, i])<E then
begin
Opr := 0.0; Exit
end;
for j := Succ(i) to n do
begin
d := a[j, i] / a[i, i];
for k := i to n do
a[j, k] := a[j, k] - d * a[i, k];
end;
end;
d := 1;
for i := 1 to n do
d := d * a[i, i];
Opr := d;
end;
procedure zamena(q:mas; q1:mas1; n,y:integer); //замена y-ого столбца столбцом свободных членов
begin
for i:=1 to n do
q[i,y]:=q1[i];
for i:=1 to n do
for j:=1 to n do
tmp[i,j]:=q[i,j];
end;
procedure TForm1.Button1Click(Sender: TObject);
var
n,i:integer;
mx,Determ:mas;
x,deti:array[1..10] of real;
begin
//ввод количества неизвестных
n:=strtoint(razm.text);
//ввод матрицы
for i:=1 to n do
for j:=1 to n do
mx[i,j]:=StrToFloat(Matr.
for i:=1 to n do
mxz[i]:=Strtofloat(Svb.Cells[
//находим определитель
d:=Opr(n,mx);
for p1:=1 to n do //находим решение
begin
zamena(mx,mxz,n,p1); //заменяем j-ый столбец столбцом свободных членов
deti[p1]:=Opr(n,tmp); //находим определитель
end;
memo1.lines.Add('Решение методом Крамера:');
for i:=1 to n do //вывод решения
begin
x[i]:= deti[i]/d;
Memo1.Lines.Add('x'+inttostr(
end;
end;
end.
Информация о работе Методы решения СЛАУ. Метод простой итерации. Метод Крамера