решение системы уравнений
- 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)