Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
20071022_Chumac_MU.doc
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
4.54 Mб
Скачать

Процедура g3v33l4

Program G3V33L4;{$M 65520,0,645500}{$N+}{$E+}

{ВХIД: G3V33L4.inp - текстовий вихідний файл

з розширеною матрицею СЛР:

n m All Dec

a11 a12 ... a1n b11 b12 ... b1m

... ... ... ... ... ... ... ...

an1 an2 ... ann bn1 bn2 ... bnm

де n - число рiвнянь (= невiдомих) СЛР

m - число компонент векторiв у правих частинах СЛР

All - загальне число позицій для виведення числа,

Dec - кількість знаків після коми. Наприклад,

________ початок __________

5 1 3 0

0 8 1 2 -3 -1

-8 -9 9 0 9 -1

-5 -2 3 -1 0 -3

-9 5 -8 7 -6 33

1 -7 2 2 0 -1

_________ кінець ___________

ВИХIД: G3V33L4.out --- текстовий результуючий файл. Наприклад,

Start G3V33L4

Groop БIТ-3-09 Yablonska Olena

Variant 33 02.10.2009

n=5 m=1 All=3 Dec=0

0 8 1 2 -3 | -1

-8 -9 9 0 9 | -1

-5 -2 3 -1 0 | -3

-9 5 -8 7 -6 | 33

1 -7 2 2 0 | -1

det=28557

Answer:

x1=[ -1]

x2=[ 0]

x3=[ -2]

x4=[ 2]

x5=[ 1]

Finish G3V33L4}

uses GausRows;

var i,j,k,

n, {число рiвнянь (= невiдомих) СЛР}

m, {число компонент векторiв у правих частинах СЛР}

d {промiжнi заокруглення -- до d знакiв пiсля коми}

: integer;

A, {головна матриця СЛР}

B, {матриця з компонентами векторiв правих частин}

X {(векторна) вiдповiдь СЛР (при det<>0)}

: TMatr;

det {визначник головноi матрицi СЛР}

: extended;

S

: string;

finp, {вихiдний файл}

fout {результуючий файл}

: Text;

begin {G3V33L4}

Assign(fout,'G3V33L4.out'); rewrite(fout);

write(fout,'Start G3V33L4');

writeln(fout);write(fout,'Groop БIТ-3-09', ' Yablonska Olena');

writeln(fout);write(fout,'Variant 33 02.10.2009 ');

Assign(finp,'G3V33L4.inp'); reset(finp);

read(finp,n,m,All,Dec);

for j:=1 to n do

begin {введення коефiцiентiв j-го рIвняння СЛР}

readln(finp);

for k:=1 to n do read(finp,a[j,k]);

for k:=1 to m do read(finp,b[j,k]);

end; {введення коефiцiентiв j-го рIвняння СЛР}

Close(finp);

GaussRow(n,m,d,A,B,X,det); S:='';

printSLY(fout,n,m,A,B,X,det,All,Dec,S);

writeln(fout);write(fout,'Finish G3V33L4'); Close(fout);

end.{G3V33L4}

Модуль GaussRow

unit GausRows;{$M 65520,0,645500}{$N+}{$E+}

{Розв'язання СЛР (метод Гауса з використанням головного елемента у стовпцi}

INTERFACE {GausRows}

const

_n = 10; {Максiмальне число рiвнянь (невiдомих)}

type

TMatr = array[1.._n,1.._n] of Extended; {квадратна матрiця}

var d, {заокруглення до d знакiв пiсля коми}

All,Dec{формат виведення элементiв матрицi}

: integer;

{виведення СЛР у результуючий файл}

procedure printSLY(

var f:text; {результуючий файл}

n:integer; {число рiвнянь (=число невiдомих)}

m:integer; {розмiрнiсть векторiв правiй частинi системи}

A:TMatr; {головна матриця системи лiнiйних рiвнянь}

B:TMatr; {матриця з компонентами векторiв правих частей}

X:TMatr; {матриця з компонентами векторiв правих частей}

var det:extended; {визначник головноi матрицi СЛР}

All,Dec:integer;{формат виведення элементiв матрицi}

S:string {рядок з назвою для виведення}

);

{метод Гауса розв'язання СЛР з виделенням головного елемента у стовпцi}

procedure GaussRow(

n:integer; {число рiвнянь (= невiдомих) СЛР}

m:integer; {число компонент векторiв у правих частинах СЛР}

d:integer; {промiжнi заокруглення -- до d знакiв пiсля коми}

A:TMatr; {головна матриця СЛР}

B:TMatr; {матриця з компонентами векторiв правих частин}

var X:TMatr; {(векторна) вiдповiдь СЛР (при det<>0)}

var det:extended {визначник головноi матрицi СЛР}

);

IMPLEMENTATION {GausRows}

{заокруглення чисел до d десяткових знакiв пiсля коми}

function RoundDec(X:extended;d:integer):extended;

var i:integer; y:extended;

begin {RoundDec}

Y:=X;

if d>0

then begin

for i:=1 to d do Y:=Y*10; Y:=Round(Y); for i:=1 to d do Y:=Y/10;

end;

RoundDec:=Y;

end; {RoundDec}

{виведення СЛР у результуючий файл}

procedure printSLY(

var f:text; {результуючий файл}

n:integer; {число рiвнянь (=число невiдомих)}

m:integer; {розмiрнiсть векторiв правiй частинi системи}

A:TMatr; {головна матриця системи лiнiйних рiвнянь}

B:TMatr; {матриця з компонентами векторiв правих частей}

X:TMatr; {матриця з компонентами векторiв правих частей}

var det:extended; {визначник головноi матрицi СЛР}

All,Dec:integer;{формат виведення элементiв матрицi}

S:string {рядок з назвою для виведення}

);

var j,k:integer;

begin {printSLY}

if S<>'' then begin writeln(f);write(f,S); end;

writeln(f);write(f,' n=',n:1,' m=',m:1,' All=',All:1,' Dec=',Dec:1);

for k:=1 to n do

begin {виведення коефiцiентiв k-го рiвняння СЛР}

writeln(f);

{вывод k-го рядка матрицы A}

for j:=1 to n do write(f,' ',a[k,j]:All:Dec); write(f,' | ');

{вывод k-го рядка матрицы B}

for j:=1 to m do write(f,' ',b[k,j]:All:Dec);

end; {виведення коефiцiентiв k-го рiвняння СЛР}

writeln(f);write(f,'det=',det:All:Dec);

if det<>0

then begin {det<>0}

writeln(f);write(f,' Answer:');

for k:=1 to n do

begin {виведення k-го компонента розвязку СЛР}

writeln(f);;write(f,' x',k:1,'=[');

for j:=1 to m do write(f,' ',x[k,j]:All:Dec);write(f,']');

end; {виведення k-го компонента розвязку СЛР}

end; {det<>0}

end; {printSLY}

{метод Гауса розв'язання СЛР з виделенням головного елемента у стовпцi}

procedure GaussRow(

n:integer; {число рiвнянь (= невiдомих) СЛЗР}

m:integer; {число компонент векторiв у правих частинах СЛР}

d:integer; {промiжнi заокруглення -- до d знакiв пiсля коми}

A:TMatr; {головна матриця СЛР}

B:TMatr; {матриця з компонентами векторiв правих частин}

var X:TMatr; {(векторна) вiдповiдь СЛР (при det<>0)}

var det:extended {визначник головноi матрицi СЛР});

var

OK:boolean; {ознака знаходження ро'звязку СЛР}

j,k,j1,j2:integer;

b1:extended;

begin {GaussRow} det:=1;

if (n<1)or(n>_n)or(m>_n) then OK:=false else OK:=true;

if not OK then begin

writeln;write('GaussRow>ОШ: n=',n:1,' m=',m:1,' Max_n=',_n);

end;

{ п р я м и й х i д }

j:=0;

while ((j<n)and OK) do

begin {обробка j-го рядка, який е замороженим}

j:=j+1;

{пошук головного елемента з iндексами j1,j}

j1:=0; b1:=0;

for j2:=j to n do

if abs(a[j2,j])>abs(b1) then begin j1:=j2;b1:=a[j1,j]; end;

if j1=0 then begin OK:=false;end;

if OK then begin {if OK}

{переставлення рядків j1 та j}

for k:=1 to n do begin b1:=a[j,k];a[j,k]:=a[j1,k];a[j1,k]:=b1; end;

for k:=1 to m do begin b1:=b[j,k];b[j,k]:=b[j1,k];b[j1,k]:=b1; end;

if (j1<>j) then det:=-det;

{ділення на a[j,j]}

b1:=a[j,j]; det:=det*b1;

for k:=1 to n do a[j,k]:=RoundDec(a[j,k]/b1,d);

for k:=1 to m do b[j,k]:=RoundDec(b[j,k]/b1,d);

{ занесення нулів до елементів "під" в j стовпці}

for j1:=j+1 to n do

begin { занесення нулів в рядку j1}

b1:=a[j1,j];

for k:=1 to n do a[j1,k]:=RoundDec(a[j1,k]-b1*a[j,k],d);

for k:=1 to m do b[j1,k]:=RoundDec(b[j1,k]-b1*b[j,k],d);

end; { занесення нулів в рядку j1}

end; {if OK}

end; {обробка j-го рядка, який е замороженим}

if OK then begin {if OK}

{ о б е р н е н и й х і д }

for j:=n downto 1 do begin

{ занесення нулів до елементів "над" в j рядку}

for j1:=j-1 downto 1 do

begin { занесення нулів в рядку j1}

b1:=a[j1,j];

for k:=1 to n do a[j1,k]:=RoundDec(a[j1,k]-b1*a[j,k],d);

for k:=1 to m do b[j1,k]:=RoundDec(b[j1,k]-b1*b[j,k],d);

end; {занесення нулів в рядку j1}

end;

{формування розв'язку}

for j:=1 to n do for k:=1 to m do x[j,k]:=b[j,k];

end; {if OK}

if not OK then det:=0;

end; {GaussRow}

END. {GaussRows}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]