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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 17:39   #1
AnZet
 
Регистрация: 04.12.2011
Сообщений: 6
Восклицание Метод Зейделя Якоби

Доброго времени суток. Проверьте пожалуйста код на наличие ошибок.. В методе Зейделя затаилась ошибка.. Ее надо найти.. Не верно считается количество итераций...

[PASCAL]const n=40;
type mass=array [1..n,1..n] of real;
vect=array [1..n] of real;
procedure yakobi(const a:mass;b:vect;e:real; var x1 : vect);
var x2,pogr:vect;
m,v,max,s,f:real;
i,j,l:integer;
begin
for i := 1 to n do x1[i] := 0;
l := 0;
repeat

for i:=1 to n do
begin
x2[i]:=b[i];
for j:=1 to n do
if i<>j then x2[i]:=x2[i]-a[i,j]*x1[j];
x2[i]:=x2[i]/a[i,i];
end;
max:=0;
for i:=1 to n do
if abs(x1[i]-x2[i])>max then
max:=abs(x1[i]-x2[i]);
m:=max;
x1:=x2;
l:=l+1;
until m<e;

f:=0; max:=0;
for i:= 1 to n do
begin
f:=0;
for j:=1 to n do
f:=f+a[i,j]*x1[j];
pogr[i]:=b[i]-f;
if max<pogr[i] then max:=pogr[i]
end;
writeln('iter(yakobi)=',l,'max=',ma x);
end;
procedure zeidel(const a:mass;b:vect;e:real;var x3:vect);
var pogr:vect;
m,s,v,max,f:real;
i,j,l,it:integer;
begin
it := 0;
for i:=1 to n do x3[i]:=0;
repeat
m:=0;
for i:=1 to n do
begin
s:=0;
for j:=1 to n do
if i<>j then s:=s+a[i,j]*x3[j];
v:=x3[i];
x3[i]:=(b[i]-s)/a[i,i];
pogr[i]:=abs(x3[i])-abs(v);

if pogr[i]>m then begin
max:=pogr[i];
m:=pogr[i];
end;
end;
it:=it+1;
until m<e;
f:=0; max:=0;
for i:= 1 to n do
begin
f:=0;
for j:=1 to n do
f:=f+a[i,j]*x3[j];
pogr[i]:=b[i]-f;
if max<pogr[i] then max:=pogr[i]
end;
writeln('iter(zeidel)=',it,'max=',m ax);
end;
var a:mass;
b,x,x1,x3:vect;
m,e,s,v,max,pogr,sum:real;
i,j,l,iter_yakobi,iter_zeidel:integ er;
begin
randomize;
for i:=1 to n do
begin
for j:=1 to n do
begin
a[i,j]:=random*50-10;
b[i]:=random*50-10;
end;
end;
for i:=1 to n do
begin
sum:=0;
for j:=1 to n do
if i<>j then sum:=sum+abs(a[i,j]);
if sum>abs(a[i,i]) then a[i,i]:=sum+10;
end;

readln(e);
yakobi(a,b,e,x1);
zeidel(a,b,e,x3);
readln;
end.[/PASCAL]
AnZet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метод Зейделя с++ Fackey Помощь студентам 3 29.01.2011 16:26
Паскаль. Метод Якоби Flashmob Помощь студентам 0 23.12.2010 05:13
Метод Зейделя True_girl Помощь студентам 1 19.04.2010 16:16
СЛАР метод Зейделя maloy-rom Общие вопросы C/C++ 4 17.02.2010 23:03
Метод итераций и метод Зейделя prikolist Общие вопросы C/C++ 40 18.06.2009 17:40