решение системы уравнений

From
Ilya Rogov (2:5030/1334.1024)
To
Juriy Tikhomirov ()
Date
2003-01-22T01:29:05Z
Area
RU.ALGORITHMS
    Привет тебе, Juriy, с того света от Ильи.

 Давным-давно, 20 Jan 03 02:54, когда земля была ещё тёпленькая
 и по ней бегали мамонты, Juriy Tikhomirov и All говорили про решение системы уравнений:

 JT> никто не может рассказать о способе решения системы линейных уравнений
 JT> от Гаусса-Зейдера (или как-то так). что такое "метод Гаусса", я знаю,
 JT> меня интереснует именно вышеприведенная фигня. если есть экзампель
 JT> проги - это кул, но желательно пояснить. (пс: а если есть эффективная
 JT> реализация метода Гаусса - тоже давайте!:)

 JT> заранее большое фидошное спасибо :)

   Я знаю про метод Гаусса-Зейделя. Вот он:

=== Как писал великий Я в zeid.pas ===
program zeidel;

uses crt;

const
     n = 4;

     A : array [1..n,1..n] of real =
               ((50,2,3,4),
                (2,40,6,8),
                (3,6,90,2),
                (5,0,5,10));


   err = 1.0e-07;

   B : array [1..4] of real = (1, 1, 1, 1);
   outname = 'zeid.out';

var
   i,j       : integer;
   sum,zzz   : real;
   out       : text;
   flag      : boolean;
   Al        : array [1..n,1..n] of real;
   Be        : array [1..n] of real;
   x         : array [1..n] of real;
   xp        : array [1..n] of real;

Begin
     clrscr;
     assign(out,outname);
     rewrite(out);
     flag:=false;

     for i:= 1 to n do if (A[i,i]=0) then
                                         begin
                                              writeln('Error!!! Diagonal element is equal to zero !!');
                                              close(out);
                                              halt;
                                         end;
     for i:=1 to n do for j:=1 to n do
                                      begin
                                           if i<>j then Al[i,j]:=-A[i,j]/A[i,i]
                                           else Al[i,j]:=0;
                                      end;

     for i:=1 to n do
                     begin
                          Be[i]:=B[i]/A[i,i];
                          x[i] :=B[i];
                     end;

     repeat
           begin
                for i:=1 to n do begin
                                      xp[i]:=x[i];
                                      write(out,x[i]:12:9,' ');
                                 end;

                writeln(out);

                for i:=1 to n do
                                begin
                                     sum:=0;
                                     for j:=1 to n do sum:=sum+Al[i,j]*x[j];
                                     x[i]:=Be[i]+sum;
                                end;
                zzz:=abs(x[1]-xp[1]);
                for i:=2 to n do if (abs(x[i]-xp[i])>zzz) then zzz:=abs(x[i]-xp[i]);
                if zzz<err then flag:=true;
           end;
     until flag;

     close(out);

end. === (загробным голосом) ЭТО КОНЕЦ !!! ===

   Только вот писал давно, поэтому математики метода не помню, но помню, что прога рабочая, ибо была сдана.

 JT> pps: какие однозначные признаки есть для ситуаций "корней дофига" и
 JT> "корней нет"?

   Простой признак
     Ax=B, A - NxN матрица.
     if detA=0 then корней бесконечно много.
     if detA<>0 and B=0 then единственное решение - X=0
     Во всех остальных случаях есть ровно N корней (возможно одинаковых).

                                                        Ilya Rogov
... Бредить помогали вопли моих соседей
---
 * Origin: Когда Бог делал время - он сделал его достаточно (2:5030/1334.1024)