Показать сообщение отдельно
Старый 24.01.2014, 11:14   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от 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.
Изображения
 
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070