Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Решить методом простых итераций систему уравнений

Автор: Hi-Tech 9.04.2008 19:50

Приветствую!!

Значит есть такое задание:

решить методом простых итераций систему уравнений :

-9,13*x1 + 2,02*x2 - 0,73*x3 = -1,34
7,51*x1 + 6,25*x2 -2,32*x3 = 2,33
-4,64*x1 + 1,13*x2 - 8,88*x3 = -3,75


Вот программа, которую написали:


program itera;
uses wincrt;
label 1;
const n=3;
var i,j: integer;
s,l,m,e,r,z:real;
type matr=array[1..n,1..n] of real;
vektor=array[1..n] of real;
const ap: matr=((-9.13,2.02,-0.73),(7.51,6.25,-2.32),(-4.64,1.13,-8.88));
bp:vektor=(-1.34,2.33,-3.75);
a:matr=((1,0.221,0.079),(-0.195,1,-0.368),(0.522,-0.127,1));
b:vektor=(0.146,0.119,0.422);
var x,y:vektor;
begin
writeln('vvedi e,l');
readln(e,l);
m:=e*(1-l)/l;
for i:=1 to n do
x[i]:=0;
1: for i:=1 to n do
begin
s:=0;
for j:=1 to n do
s:=s-(a[i,j]/a[i,i])*x[j];
y[i]:=s+x[i]+b[i]/a[i,i];
end;
r:=abs(x[1]-y[1]);
for i:=1 to n do
z:=abs(x[i]-y[i]);
if r>z then
r:=z
else r:=r;
if r>m then
begin
for i:=1 to n do
x[i]:=y[i];
goto 1;
end
else
begin
writeln('r=',r);
for i:=1 to n do
writeln('x',i,' = ',x[i]:8:3);
end;
a:=ap; b:=bp;
for i:=1 to n do
writeln(x[1]*a[i,1]+x[2]*a[i,2]+x[3]*a[i,3]:8:3);
end.




Когда зпускаем программу, вводим значение: 0.001 0.649 и жмем Enter.

Он начинает выдавать следующий результат:

x1 = 0.054
x2 = 0.282
x3 = 0.430

А должны быть другие значения x1,x2,x3:

x1=0,182
x2=0,290
x3=0,364


Что там не так не можем понять... подскажите кто-нибудь...
Заранее благодарен.

Автор: volvo 9.04.2008 21:35

blink.gif blink.gif Что это такое? goto - зло, лишние переменные (да и глобальные, тоже) тоже не стоит применять... Вот так система решается методом простых итераций:

program itera;
const
n = 3;
type
matr = array[1..n,1..n] of real;
vektor = array[1..n] of real;

const eps = 0.0001;

procedure iteration(const a: matr; const b: vektor; var x: vektor);
var
i, j: integer;
norma: real;
xn: vektor;
begin
for i := 1 to n do xn[i] := 0;

repeat
norma := 0;
for i := 1 to n do begin
xn[i] := -b[i];
for j := 1 to n do begin
if i <> j then xn[i] := xn[i] + a[i][j]*x[j];
end;

xn[i] := xn[i] / (-a[i][i]);
end;

for i := 1 to n do begin
if abs(x[i] - xn[i]) > norma then
norma := abs(x[i] - xn[i]);
x[i] := xn[i];
end;

until norma <= eps;
end;

const
ap: matr=
(
(-9.13,2.02,-0.73),
( 7.51,6.25,-2.32),
(-4.64,1.13,-8.88));
bp: vektor=
(-1.34,2.33,-3.75);

var
i: integer;
x: vektor;

begin
iteration(ap, bp, x);
for i := 1 to n do begin
writeln('X[', i, '] = ', x[i]:8:3);
end;
writeln;
end.

Автор: Hi-Tech 9.04.2008 22:10

О, спасибо. Но блин... преподу вот надо таким способом, которым у меня не верно вычисляет, а то не примет

А что там не так? Вроде тоже считает, но чуток не те результаты. Мож все-таки можно там внести коррективы?

Надеюсь на ответ smile.gif

Автор: volvo 9.04.2008 22:17

Ну, сравни мой метод и свой. Можешь вообще вынести вычисления из процедуры, и сделать их в основной части программы, тогда все изменения буду как на ладони...

Только помни: "Нужно делать так, как нужно, а как не нужно, делать не нужно" (С) Винни-Пух... Это я об использовании goto... Ну не надо оно тебе, есть без него достаточно конструкций, позволяющих реализовать нужную логику работы...

Автор: Hi-Tech 9.04.2008 22:25

Спасибо большое, будем разбираться smile.gif

Автор: Hi-Tech 10.04.2008 2:40

Вобщем сидел парился, вот че получилось:


program itera;
uses wincrt;
label 1;
const n=3;
var
i,j: integer;
s,l,m,e,r,z:real;
type
matr=array[1..n,1..n] of real;
vektor=array[1..n] of real;
const

a:matr=((-9.13,2.02,-0.73),(7.51,6.25,-2.32),(-4.64,1.13,-8.88));
b:vektor=(-1.34,2.33,-3.75);

var x,y:vektor;

begin
writeln('vvedi e,l');
readln(e,l);
m:=e*(2-l)/l;

for i:=1 to n do x[i]:=0;

1: for i:=1 to n do
begin
s:=0;
for j:=1 to n do s:=s-(a[i,j]/a[i,i])*x[j];
y[i]:=s+x[i]+b[i]/a[i,i];
end;

for i:=1 to n do begin
r:=abs(x[i]-y[i]);

for j:=1 to n do z:=abs(x[j]-y[j]);
if z>r then r:=z else r:=r;

end;

if r>m then
begin
for i:=1 to n do x[i]:=y[i];
goto 1;
end
else
begin
writeln('r=',r);
for i:=1 to n do
writeln('x',i,' = ',x[i]:8:3);
end;


for i:=1 to n do writeln(x[1]*a[i,1]+x[2]*a[i,2]+x[3]*a[i,3]:8:3);

end.



Вобщем выдает следующее:

x1 = 0.182
x2 = 0.292
x3 = 0.365


Получается небольшая погрешность sad.gif . Значения должны быть такими ведь:

x1 = 0,182
x2 = 0,290
x3 = 0,364


Чуток не сходится... volvo, подскажи пожалуйста, дело то за малам...
Спасибо.

Автор: Hi-Tech 11.04.2008 5:21

Все, приняли, тему можно закрывать.
Спасибо за помощь smile.gif