Лабораторная работа - Прямые методы решения СЛАУ
.docНауково-навчальний комплекс "Інститут прикладного системного аналізу"
при Національному технічному університеті України "КПІ"
Кафедра математичних методів системного аналізу
ЛАБОРАТОРНА РОБОТА №2
З курсу «ЧИСЕЛЬНІ МЕТОДИ»
Виконав: Студент 2-го курсу
Групи КА-65
Ільяшов В.О.
Прийняв: Заводник В.В.
Київ - 2008 р.
Тема: ПРЯМІ МЕТОДИ РОЗ'ЯЗАННЯ СИСТЕМ ЛІНІЙНИХ АЛГЕБРАЇЧНИХ РІВНЯНЬ (СЛАР)
1. Умова задачі:
1.Проаналізувати конкретну СЛАР та обгрунтувати обрання методу розв’язання.
2.Розвязати СЛАР з точністю e = 10-5 (максимальна координата вектору нев’язки).
3.Обчислити A-1 та det A.
А * x = b: |
Примітка: Конец формы |
2. Хід роботи:
1. Проаналізувати конкретну СЛАР та обгрунтувати обрання методу розв’язання. Реалізувати обраний метод у вигляді окремої процедури або методу відповідного об'єкту "СЛАР".
2. Розв’язати СЛАР з точністю e = 10-5 (максимальна координата вектору нев’язки).
3. Обчислити A-1 та det A.
4. Обгрунтування вибору методу.
5. Результати роботи:
- проміжні результати (від ітерації до ітерації);
- результати перевірки – вектор нев’язки r = b – Ax – у експоненціальній формі з принаймні шістьма значущими цифрами;
- A-1 та det A;
- A · A-1 – у експоненціальній формі з принаймні шістьма значущими цифрами.
3. Аналіз:
Оскільки система є несиметричною, то застосуємо метод Халецького. У програмі реалізовано цей метод, знайдено матриці L та D, розв’язок системи, детермінант, обернену матрицю і зроблено перевірку.
4.Результат роботи:
Файл Input.txt:
7.14 1 1.07 1.12 -0.96
1.2 3.28 1.3 -1.63 -1.08
0.87 -2.46 6.32 2.1 -0.617
1.36 0.16 2.1 5.22 10
1.44 0.42 0.883 -5 13
2.1 0.96 -2.15 2.76 -1.92
Файл Rez.txt:
Matruca A:
7.140000 1.000000 1.070000 1.120000 -0.960000
1.200000 3.280000 1.300000 -1.630000 -1.080000
0.870000 -2.460000 6.320000 2.100000 -0.617000
1.360000 0.160000 2.100000 5.220000 10.000000
1.440000 0.420000 0.883000 -5.000000 13.000000
Vector B:
2.100000
0.960000
-2.150000
2.760000
-1.920000
Matruca L:
7.140000 0.000000 0.000000 0.000000 0.000000
1.200000 3.280000 0.000000 0.000000 0.000000
0.870000 -2.460000 6.320000 0.000000 0.000000
1.360000 0.160000 2.100000 5.220000 0.000000
1.440000 0.420000 0.883000 -5.000000 13.000000
Matruca C:
1.000000 0.140056 0.149860 0.156863 -0.134454
0.000000 0.948760 0.341515 -0.554340 -0.280078
0.000000 0.000000 1.112302 0.094913 -0.188136
0.000000 0.000000 0.000000 0.937939 2.035010
0.000000 0.000000 0.000000 0.000000 1.819417
Vector Y:
0.294118
0.185079
-0.308637
0.570599
0.054174
Vector X:
0.200309
0.572290
-0.342139
0.460355
0.054174
Determinant:10043.914084
Vector nevazku:
0.00000000000000E+0000
9.61832588172911E-0002
3.12565460139012E-0001
1.69716381311446E-0001
-5.49183033825102E-0001
Zvorotna matruca:
0.149876 -0.054974 -0.009805 -0.022827 0.023606
-0.042352 0.268826 -0.067852 0.078163 -0.044173
-0.039315 0.114678 0.139276 0.000475 0.012895
0.002048 -0.011776 -0.022776 0.112267 -0.088319
-0.012509 -0.014761 -0.014940 0.043151 0.040891
A*A^-1:
9.99999999999091E-0001 -2.37636926331492E-0013 -9.43850032852911E-0014 1.84876602687869E-0013 3.48921907263478E-0014
-6.05957367006619E-0014 1.00000000000000E+0000 1.82397499881581E-0014 -8.55361076835658E-0014 1.00745875129728E-0013
-1.87217970370313E-0003 -1.30498993467681E-0012 9.99999999999091E-0001 -1.20087718320284E-0013 -1.02777705576350E-0013
9.53902324454248E-0005 -9.66684936543061E-0006 -1.13686837721616E-0013 9.99999999999091E-0001 0.00000000000000E+0000
-9.53737339625604E-0003 1.99431758368007E-0003 2.79568602650215E-0005 -3.97903932025656E-0013 9.99999999999091E-0001
5.Висновок:
Результатом розв’язання даної СЛАР є вектор
x = (0.200309 0.572290 -0.342139 0.460355 0.054174 ).
Отримані також значення визначника матриці: Determinant:10043.914084
та матриця, обернену до матриці системи А-1.
6. Текст програми
uses crt;
const n=5;
type ar=array[1..10,1..10] of real;
br=array[1..10] of real;
var t:text;
a,a1,od:ar;
b,x,e:br;
i,j,k:integer;
r:real;
procedure outa(a:ar; var t:text);
var i,j:integer;
begin
for i:=1 to n do
for j:=1 to n do
if j=n then writeln(t,a[i,j]:0:6,' ')
else write(t,a[i,j]:0:6,' ');
writeln(t,' ');
end;
procedure outb(b:br; var t:text);
var i:integer;
begin
for i:=1 to n do write(t,b[i]:0:6,' ');
writeln(t,' ');
writeln(t,' ');
end;
procedure host(a:ar; b:br; var t:text; var x:br; bool:boolean);
var i,j,k:integer;
l,c:ar;
y:br;
s,p:real;
begin
for i:=1 to n do
for j:=1 to n do
begin
if j=1 then l[i,j]:=a[i,j]
else
if i<j then l[i,j]:=0
else
begin
s:=0;
for k:=1 to j-1 do s:=s+l[i,k]*c[k,j];
l[i,j]:=a[i,j]-s;
end;
end;
for i:=1 to n do
for j:=1 to n do
begin
if i=1 then c[1,j]:=a[1,j]/l[1,1]
else
if i>j then c[i,j]:=0
else
begin
if i=j then c[i,i]:=1;
s:=0;
for k:=1 to i-1 do s:=s+l[i,k]*c[k,j];
c[i,j]:=(a[i,j]-s)/l[i,i];
end;
end;
for i:=1 to n do
begin
if i=1 then y[i]:=b[i]/l[1,1]
else
begin
s:=0;
for k:=1 to i-1 do s:=s+l[i,k]*y[k];
y[i]:=(b[i]-s)/l[i,i]
end;
end;
for i:=n downto 1 do
begin
if i=n then x[i]:=y[n]
else
begin
s:=0;
for k:=i+1 to n do s:=s+c[i,k]*x[k];
x[i]:=y[i]-s;
end;
end;
p:=1;
for i:=1 to n do p:=p*l[i,i];
if bool then
begin
writeln(t,'Matruca L:');
outa(l,t);
writeln(t,'Matruca C:');
outa(c,t);
writeln(t,'Vector Y:');
outb(y,t);
writeln(t,'Vector X:');
outb(x,t);
write(t,'Determinant:');
writeln(t,p:0:6);
writeln(t,' ');
end;
end;
procedure perev(a,a1:ar; b:br; x:br; var t:text);
var ne:br;
i,j:integer;
begin
for i:=1 to n do
begin
ne[i]:=0;
for j:=1 to n do ne[i]:=ne[i]+a[i,j]*x[j];
ne[i]:=b[i]-ne[i];
end;
writeln(t,'Vector nevazku:');
for i:=1 to n do write(t,ne[i],' ');
writeln(t,' ');
end;
Begin
clrscr;
assign(t,'input.txt');
reset(t);
for i:=1 to n do
for j:=1 to n do
if j=n then readln(t,a[i,j])
else read(t,a[i,j]);
for i:=1 to n do read(t,b[i]);
close(t);
assign(t,'rez.txt');
rewrite(t);
writeln(t,'Matruca A:');
outa(a,t);
writeln(t,'Vector B:');
outb(b,t);
host(a,b,t,x,true);
perev(a,a1,b,x,t);
for i:=1 to n do
begin
for j:=1 to n do
if i=j then e[j]:=1 else e[j]:=0;
host(a,e,t,x,false);
for j:=1 to n do a1[j,i]:=x[j];
end;
writeln(t,'Zvorotna matruca:');
outa(a1,t);
for i:=1 to n do
for j:=1 to n do
begin
r:=0;
for k:=1 to n do r:=r+a[i,k]*a1[k,j];
od[i,j]:=r
end;
writeln(t,'A*A-1:');
for i:=1 to n do
for j:=1 to n do
if j=n then writeln(t,od[i,j],' ')
else write(t,od[i,j],' ');
close(t);
End.