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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2010, 18:05   #1
serckesh
Новичок
Джуниор
 
Регистрация: 05.02.2010
Сообщений: 2
По умолчанию проверить на баги

Задали лабу по вычислительной математике, сделал, как мог, но чувствую есть косяк в переборе итераций, гляньте

Program ITERATION;
uses crt;
const n = 9;
const eps = 0.0001;

var
k,s : Real;
a : array [1..4,1..4] of Real;
c : array [1..4,1..4] of Real;
b : array [1..4] of Real;
d : array [1..4] of Real;
x : array [1..4] of Real;
max : array [1..10000] of Real;
i : Integer;
j : Integer;
z : Integer;
normc,normb: Real;
tempc : array [1..4] of Real;


begin
clrscr;
a[1,1] := (0.95 + 0.1*n)/10;
a[1,2] := (0.26 + 0.1*n)/10;
a[1,3] := (-0.17 + 0.1*n)/10;
a[1,4] := (0.27 + 0.1*n)/10;
a[2,1] := (-0.15 + 0.1*n)/10;
a[2,2] := (1.26 + 0.1*n)/10;
a[2,3] := (0.36 + 0.1*n)/10;
a[2,4] := (0.42 + 0.1*n)/10;
a[3,1] := (0.26 + 0.1*n)/10;
a[3,2] := (-0.54 + 0.1*n)/10;
a[3,3] := (-1.76 + 0.1*n)/10;
a[3,4] := (0.31 + 0.1*n)/10;
a[4,1] := (-0.44 + 0.1*n)/10;
a[4,2] := (0.29 + 0.1*n)/10;
a[4,3] := (-0.78 + 0.1*n)/10;
a[4,4] := (-1.78 + 0.1*n)/10;

b[1] := 2.48/10;
b[2] := -3.16/10;
b[3] := 1.52/10;
b[4] := -1.29/10;

{sformiruem matricu C}

for i := 1 to 4 do
begin
for j := 1 to 4 do
c[i,j] := a[i,j];
end;

WriteLn('Matrix:');
WriteLn('');
for i := 1 to 4 do
begin
for j := 1 to 4 do
Write(c[i,j]:3:4,' ');
WriteLn('');
end;

WriteLn('');
WriteLn('b:');
WriteLn('');
for i := 1 to 4 do
Write(b[i]:3:4,' ');
WriteLn('');

{najdem normu C i D}

normb := abs(b[1]);

for i := 2 to 4 do
if (abs(b[i]) > normb) then
normb := abs(b[i]);

WriteLn('');
WriteLn('Norm b: ',normb:3:4);

for i := 1 to 4 do
tempc[i] := abs(c[i,1]) + abs(c[i,2]) + abs(c[i,3]) + abs(c[i,4]);

normc := tempc[1];

for i := 2 to 4 do
if (normc < tempc[i]) then normc := tempc[i];

WriteLn('Norm C: ',normc:3:4);
WriteLn('');

k:=round(((ln(eps*(1-normc)/normb))/ln(normc))-1);

WriteLn('');
writeln('Kolichestvo iteracii: ',k);

for i:=1 to 4 do begin
s:=0;
for j:=1 to 4 do s:=s+c[i,j]*b[i];
d[i]:=s;
end;

WriteLn('');
WriteLn('d:');
WriteLn('');
for i := 1 to 4 do
Write(d[i]:3:4,' ');
WriteLn('');

for i:=1 to 4 do begin
x[i]:=b[i]-d[i];
end;

WriteLn('');
WriteLn('x:');
WriteLn('');
for i := 1 to 4 do
Write(x[i]:3:4,' ');
WriteLn('');

z:=1;
max[z] := abs(x[1]);
for i := 2 to 4 do
if (abs(x[i]) > max[z]) then
max[z] := abs(x[i]);

Write(max[1]:3:4,' ');
z:=z+1;
while abs(max[z]-max[z-1])>=eps do
begin
z:=z+1;
for i:=1 to 4 do
begin
s:=0;
for j:=1 to 4 do s:=s+c[i,j]*x[i];
d[i]:=s;
end;
for i:=1 to 4 do
begin
x[i]:=b[i]-d[i];
end;
max[z] := abs(x[1]);
for i := 2 to 4 do
if (abs(x[i]) > max[z]) then
max[z] := abs(x[i]);
end;
writeln ('chislo iteracii = ', z+1);
WriteLn('x:');
WriteLn('');
for i := 1 to 4 do
Write(x[i]:3:4,' ');
WriteLn('');
Readln();
end.
serckesh вне форума Ответить с цитированием
Старый 05.02.2010, 19:54   #2
serckesh
Новичок
Джуниор
 
Регистрация: 05.02.2010
Сообщений: 2
По умолчанию

переделал так

Program ITERATION;
uses crt;
const n = 9;
const eps = 0.0001;

var
k,s : Real;
c : array [1..4,1..4] of Real;
b : array [1..4] of Real;
d : array [1..4] of Real;
x : array [1..4] of Real;
max : array [1..10000] of Real;
i : Integer;
j : Integer;
z : Integer;
normc,normb: Real;
tempc : array [1..4] of Real;


begin
clrscr;
c[1,1] := (0.95 + 0.1*n)/10;
c[1,2] := (0.26 + 0.1*n)/10;
c[1,3] := (-0.17 + 0.1*n)/10;
c[1,4] := (0.27 + 0.1*n)/10;
c[2,1] := (-0.15 + 0.1*n)/10;
c[2,2] := (1.26 + 0.1*n)/10;
c[2,3] := (0.36 + 0.1*n)/10;
c[2,4] := (0.42 + 0.1*n)/10;
c[3,1] := (0.26 + 0.1*n)/10;
c[3,2] := (-0.54 + 0.1*n)/10;
c[3,3] := (-1.76 + 0.1*n)/10;
c[3,4] := (0.31 + 0.1*n)/10;
c[4,1] := (-0.44 + 0.1*n)/10;
c[4,2] := (0.29 + 0.1*n)/10;
c[4,3] := (-0.78 + 0.1*n)/10;
c[4,4] := (-1.78 + 0.1*n)/10;

b[1] := 2.48/10;
b[2] := -3.16/10;
b[3] := 1.52/10;
b[4] := -1.29/10;

WriteLn('Matrix C:');

for i := 1 to 4 do
begin
for j := 1 to 4 do
Write(c[i,j]:3:4,' ');
WriteLn('');
end;

WriteLn('');
WriteLn('= matrix B:');
for i := 1 to 4 do
Writeln(b[i]:3:4,' ');

normb := abs(b[1]);

for i := 2 to 4 do
if (abs(b[i]) > normb) then
normb := abs(b[i]);

WriteLn('');
WriteLn('Norm b: ',normb:3:4);

for i := 1 to 4 do
tempc[i] := abs(c[i,1]) + abs(c[i,2]) + abs(c[i,3]) + abs(c[i,4]);

normc := tempc[1];

for i := 2 to 4 do
if (normc < tempc[i]) then normc := tempc[i];

WriteLn('Norm C: ',normc:3:4);

k:=round(((ln(eps*(1-normc)/normb))/ln(normc))-1);

writeln('Predvaritelnoe kolichestvo iteracii: ',k:0:0);

for i:=1 to 4 do begin
s:=0;
for j:=1 to 4 do s:=s+c[i,j]*b[i];
d[i]:=s;
end;

for i:=1 to 4 do begin
x[i]:=b[i]-d[i];
end;

WriteLn('');
WriteLn('predvaritelnoe reshenie, x= :');
for i := 1 to 4 do
Write(x[i]:3:4,' ');
WriteLn('');

z:=1;
max[z] := abs(x[1]);
for i := 2 to 4 do
if (abs(x[i]) > max[z]) then
max[z] := abs(x[i]);
z:=z+1;
while abs(max[z]-max[z-1])>=eps do
begin
z:=z+1;
for i:=1 to 4 do
begin
s:=0;
for j:=1 to 4 do s:=s+c[i,j]*x[i];
d[i]:=s;
end;
for i:=1 to 4 do
begin
x[i]:=b[i]-d[i];
end;
max[z] := abs(x[1]);
for i := 2 to 4 do
if (abs(x[i]) > max[z]) then
max[z] := abs(x[i]);
end;
WriteLn('');
writeln ('chislo iteracii = ', z-1);
WriteLn('okonchatelnoe reshenie');
WriteLn('x=');
for i := 1 to 4 do
Write(x[i]:3:4,' ');
WriteLn('');
Readln;
end.
serckesh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баги с Query и Table Toky БД в Delphi 3 15.12.2009 00:01
Баги онлайн игр 4erw Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 10.04.2009 07:58
Помогите найти баги Роман Радер Софт 0 01.04.2007 17:44