Цитата:
Сообщение от Vladimir_S
Впрочем, завтра, если будет время, попробую "в лоб" - подумал, что условие сходимости типа "диагональное преобладание" может быть и избыточным. Авось и так сойдется.
|
Ну вот - получилось-таки! Действительно, всё сошлось и программа не пошла вразнос. А могла бы: условие гарантированной сходимости здесь не выполняется. Но - повезло:
Код:
Type
Matrix=Array[1..3,1..3] of Real;
Vector=Array[1..3] of Real;
Const
A:Matrix=(( 1.000000, 3.00000, -1.16667),
( 0.264706, 1.00000, -0.20588),
(-0.333330, -0.66667, 1.00000));
B:Vector=(-0.16667, 0.058824, 0.666667);
Eps=0.0018;
Var
X1,X2:Vector;
i,j:byte;
Nrm:real;
Function Dif(D1,D2:Vector):Vector;
var
p:byte;
DX:Vector;
begin
for p:=1 to 3 do DX[p]:=D1[p]-D2[p];
Dif:=DX;
end;
Function Norm_Vect(NV:Vector):Real;
var
p:byte;
Sum:Real;
begin
Sum:=0;
for p:=1 to 3 do Sum:=Sum+Sqr(NV[p]);
Norm_Vect:=Sqrt(Sum);
end;
Begin
for i:=1 to 3 do X1[i]:=0;
X2:=X1;
Repeat
for i:=1 to 3 do
begin
X2[i]:=B[i];
for j:=1 to 3 do
if j<>i then X2[i]:=X2[i]-A[i,j]*X2[j];
end;
Nrm:=Norm_Vect(Dif(X1,X2));
for i:=1 to 3 do write(' ',X2[i]:8:5);
write(' ');
for i:=1 to 3 do write(' ',X2[i]-X1[i]:8:5);
writeln;
X1:=X2;
Until Nrm<=Eps;
Writeln;
Writeln('x1= ',X2[1]:8:5,' x2= ',X2[2]:8:5,' x3= ',X2[3]:8:5);
Readln
End.