Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2009, 13:54   #1
Tonik_A
Пользователь
 
Регистрация: 04.10.2009
Сообщений: 23
Вопрос Пояснение по методу Зейделя.

Есть программа, она работает, но я не знаю какая переменная что означает и как происходит само вычесление (в программе, с математикой я вроде разобрался) в функции реализующей метод (Seidel). Прошу добавить в эту программу коментарии, поясняющие где что.

#
Program Zeidel;
Uses CRT;

Const
maxn = 8;

Type
Data = Real;
Matrix = Array[1..maxn, 1..maxn] of Data;
Vector = Array[1..maxn] of Data;

{ Процедура ввода расширенной матрицы системы }
Procedure ReadSystem(n: Integer; var a: Matrix; var b: Vector);
Var
i, j, r: Integer;
Begin
r := WhereY;
GotoXY(2, r);
Write('A');
For i := 1 to n do begin
GotoXY(i * 6 + 2, r);
Write(i);
GotoXY(1, r + i + 1);
Write(i:2);
end;
GotoXY((n + 1) * 6 + 2, r);
Write('b');
For i := 1 to n do begin
For j := 1 to n do begin
GotoXY(j * 6 + 2, r + i + 1);
Read(a[i, j]);
end;
GotoXY((n + 1) * 6 + 2, r + i + 1);
Read(b[i]);
end;
End;

{ Процедура вывода результатов }
Procedure WriteX(n :Integer; x: Vector);
Var
i: Integer;
Begin
For i := 1 to n do
Writeln('x', i, ' = ', x[i]);
End;

{ Функция, реализующая метод Зейделя }
Function Seidel(n: Integer; a: Matrix; b: Vector; var x: Vector; e: Data) :Boolean;
Var
i, j: Integer;
s1, s2, s, v, m: Data;
Begin

{ Исследуем сходимость, ***ИМЕННО С МЕТОДОМ ИССЛЕДОВАНИЯ СХОДИМОСТИ БОЛЬШЕ ВСЕГО ВОПРОСОВ*** }
For i := 1 to n do begin

s := 0;
For j := 1 to n do
If j <> i then
s := s + Abs(a[i, j]);

If s >= Abs(a[i, i]) then begin
Seidel := false;
Exit;
end;

end;

Repeat

m := 0;
For i := 1 to n do begin

{ Вычисляем суммы }
s1 := 0;
s2 := 0;
For j := 1 to i - 1 do
s1 := s1 + a[i, j] * x[j];
For j := i to n do
s2 := s2 + a[i, j] * x[j];

{ Вычисляем новое приближение и погрешность }
v := x[i];
x[i] := x[i] - (1 / a[i, i]) * (s1 + s2 - b[i]);

If Abs(v - x[i]) > m then
m := Abs(v - x[i]);

end;

Until m < e;

Seidel := true;
End;

Var
n, i: Integer;
a: Matrix;
b, x: Vector;
e: Data;
m_file: text;

Begin
ClrScr;
assign(m_file,'rez.txt');
Writeln('Programa dly resheniy lineinih system uravneniy metodom Zeidely');
Writeln;

Writeln('Vvedite poryadok systemy, ot 2 do 8');
Write('>');
Read(n);
if (n>=2) and (n<=8) then writeln('Dannie vvedini korrektno') else begin
writeln('Programma ne prednaznachena dly etih dannih');
exit;
end;
Writeln;

Writeln('Vvedite tochnost vichisleniy');
Repeat
Write('>');
Read(e);
Until (e > 0) and (e < 1);
Writeln;

Writeln('Vvedite rashirennuy matricu');
ReadSystem(n, a, b);
Writeln;

{ Предполагаем начальное приближение равным нулю }
ReWrite(m_file);
For i := 1 to n do
x[i] := 0;

If Seidel(n, a, b, x, e) then begin
Writeln('Rezultat vichisleniy, viveden na ekran i sohranen v fail');
WriteX(n, x);
for i:=1 to n do
Begin
writeln(m_file, x[i]);
end;
Close(m_file);
readln;
end
else
Writeln('Metod Zeidely ne shoditsy dly vvedenoy systemy');
Writeln;
readln;
end.

#

--------------------------------------------
С уважением, Антон.
Tonik_A вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по методу Perform voron29 Общие вопросы Delphi 1 03.06.2008 11:20
Передача данных Access Word (пояснение) Dryuks Microsoft Office Access 1 28.01.2008 06:06
Помогите дописать пояснение RECREATOR Помощь студентам 4 10.12.2007 09:07