Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
20071022_Chumac_MU.doc
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
4.54 Mб
Скачать

Програма SysIter

program SysIter; {$N+} {$E+} { розв’язання СЛР за методом простих ітерацій

ВХІД : SysIter.inp --- текстовий вихідний файл з СЛР. Наприклад,

--------------------- початок ------------------------

4 1.0e-3 8 5

0.00 -1.15 0.20 -0.35 0.40 0.00

0.12 0.00 0.36 -0.15 0.40 0.00

0.36 -0.24 0.00 0.20 -0.12 0.00

-0.40 0.15 -0.25 0.00 0.85 0.00

---------------------------------------------------------

де 4 – розмір матриці В , 1.0е-3 - точність підрахунків , 8 – число всіх позіцій для виведення числа , 5 – число цифр після коми

ВИХІД: SysIter.out --- текстовий результуючий файлЇ

const _N=10 ; {1 = норма , 2=k- норма , 3 = 1 норма}

type TVect = array [ 1.._N] of extendet ;

TMatr = array [1.._N,1.._N] of extendet ;

{індекс у TNorm : 1=m- норма,2=k- норма ,3=k- норма }

TNorm = array [1..3] of extendet ;

Var Stop, Step : Boolean;

i,j,k,n,NN,All,Dec : integer;

All_Iter, { Загальне число ітерацій}

NIter: longint; {Номер поточної ітерації}

eps, {Точність підрахунків}

q, {Коефіцієнт стиску}

delta:extendet; {граничній крок для зупинки}

norm: TNorm;

NameInp,NameOut, {Імена вхідного, вихідного файлів}

answer: string;

a: TMatr; {матриця B ітераційної схеми}

b, {вектор d ітераційної схеми}

XtempOld, {старий поточний вектор}

Xtemp: TVect; {новий поточний вектор}

finp,fout:text; {вхідний та вихідний файли}

procedure VectNorms (n : integer ; v: TVect ; var norm:TNorm) ;

var j,k : integer ;sum :extendet ;

BEGIN {VectNorms}

norm[1] :=abs (v[1]) ; {m - норма}

for i :=1 to n do

if norm[1]<abs ( v [ i ] ) then norm [1] :=abs ( v [ i ] );

norm [2]=0; {k - норма}

for i :=1 to n do norm[2] :=norm[2] + sqr(v[i]);

norm[2] :=sqrt(norm [2] );

norm[3]:=0; {l - норма}

for i :=1 to n do norm [3] :=[3] + abs (v[i]) ;

END; {VectNorms}

procedure MatrNorms (n,m : integer ; A : TMatr ; var norm : TNorm) ;

var j , k : integer ; sum : extendet ;

BEGIN {MatrNorms}

norm[1] :=0; {m - норма}

for i :=1 to n do

begin sum:=0; for j:=1 to m do sum:=sum + abs( a [ i , j ] ) ;

if norm[1]<sum then norm[1] : =sum;

end ;

norm[2] :=0 ; {k - норма}

for i:=1 to n do for j:= to m do

norm[2] : =norm [2] + sqr( a[ i , j ]);

norm[2] : =sqrt (norm[2]) ;

norm[3] : =0 ; {l - норма}

for j : = to m do

begin sum : = 0 ; for i : = to n do sum := sum + abs ( a [ i , j ] ) ;

if norm[3]<sum then norm[3] : =sum ;

end;

END; {MatrNorms}

procedure PrintIter (Niter : integer ; : integer ;

X : TVect ; All , Dec : integer ; var f : text ) ;

var j , k : integer ;

BEGIN {PrinIter}

writeln ( f ) ; weite (f , ‘ x [‘ , Niter : 2 , ‘ ] = { ‘ ) ;

for k : =1 to n – 1 do write ( f , x [ k ] : All : Dec , ‘ , ‘ );

write ( f , x [ k] : All : Dec , ‘ } ‘ ) ;

END; { PrintIter}

procedure NextIter ( n : integer ; A : TMatr ; b :TVect ;

var X: TVect ) ;

var j , k : integer ; Xold : TVect ;

BEGIN { NextIter } Xold : = X ;

for j : = 1 to n do

begin x[ j ] : = b [ j ];

for k:=1 to n do x[j]:=x[j]+a[j,k]*xold[k];

end;

END;{NextIter}

BEGIN {Sysiter}

All_Iter:=0;writeln(‘Start Sysiter’);

Repeat write(‘Зупинка за кроком (у/n)?=’);

Readln(answer);if answer=‘’then answer:=‘y’;

If answer=‘y’ then Step:=true else Step:=false;

Until(answer=‘y’)or(answer=‘n’);

Write (‘Iмя вхідного файла=‘);readln(answer);

If Length(answer)>0

Then NameInp:=answer else Nameinp:=‘Sysiter.inp’;

Write(‘Iмя вхідного файла=‘);readln(answer);

If Length(answer)>0

Then NameOut:=answer else NameOut:=‘Sysiter.out’;

Assign(fout,NameOut);rewrite(fout);

Assign(finp,NameInp);reset(finp);

Readln(finp,n,eps,All,Dec);

Writeln;write(n,’ ‘,eps,’ ‘,All:1,’ ‘,Dec:1);

Writeln(fout);write(fout, n,’ ‘,eps,’ ‘,All:1,’ ‘,Dec:1);

If ((n<1)or(n>_N)or(eps<=0))

Then begin{(n<1)or(n>_N)or(eps<=0)}

Writeln(fout,’Eror: n=‘,n:1);

End {(n<1)or(n>_N)or(eps<=0)}

Else begin {(1<=n<=_N)and (eps>0)}

For I:=1 to n do

Begin

For J:=1 to n do begin read (finp,a[I,j]);

Write(fout,’ ‘,a [I,j]:All:Dec);

end;

readln(finp,b[i],xtemp[i]);

writeln(fout,' ',b[i]:All:Dec,' ',Xtemp[i]:All:Dec);

end;

close(fnip);writeln('Матриця В:');

for i:=1 to n do begin

for j:=1 to n do write (' ',[i,j]:All:Dec);

writeln;

end;

writeln;write('Вектор d':');

for i:=1 to n do write(' ',Xtemp[i]:All:dec);

writeln;writeln(fout,'Матриця В:')ж

For i:=1 to n do

begin for j:=1 to n do

write(fout,' ',a[i,j]:All:Dec);

writeln(fout);

end;

writeln(fout);write (fout);write(fout,'Вектор d':');

for i:=1 to n do

write(fout,' ',b[i]:All:Dec);

writeln(fout);write(fout,'x[0]:');

for i:=1 to n do

write(' ',Xtemp[i]:All:Dec);

writeln;writeln(fout,'Матриця B:');

for i:=1 to n do

begin for j:=1 to n do

write(fout,' ',a[i,j]:All:Dec);

write(fout);

end

writeln(fout);write(fout,' ',Вектор d:');

for i:=1 to n do

write(fout,' ',b[i]:All:Dec);

writeln(fout);write(fout,'[0]:');

for i:=1 to n do

write(fout,' ',Xtemp[i]:All:Dec);

MatrNorms(n,n,A,norm);q:=norm[1];NN:=1

For i:=1 to 3 do

if q>norm[i] then begin q:=norm[i];NN:=i;end;

if q>=1

then begin

writeln(fout);write(fout,'q=',q:All:Dec,'>=1')close(fout);

writeln;write('q=',q:All:Dec,'>=1');readln;halt;

end;

VectNorms(n,b,norm);

if Step then begin delta:=eps*(1-q);

writeln;

write('Зупинка обчислень за кроком=',delta:All:Dec);

writeln(fout);

write(fout,'Зупинка обчислень за кроком=',delta:All:Dec);

end

else begin

All_Iter:=Round(In((eps*(1-q))/(norm[NN]))/In(q))+1;

writeln;

write('Зупинка обчислень за числом iтерацiй=',All_Iter:1);

writeln(fout); write(fout,

'Зупинка обчислень за числом iтерацiй=',All_Iter:1);

end;

if Step then begin {YesStep}

Niter:=0;Stop:=false;

while not Stop do

Begin {while not Stop}

Niter:=Niter+1;XtempOld:=Xtemp;

Ne[tIter(n,A,b,Xtemp);

PrintIter(Niter,n,xtemp,All,Dec,fout);

for i:=1 to n do

XtempOld[i]:=Xtemp[i]-XtempOld[i];

VectNorms(n,XtempOld,norm);

if norm[NN]<Delta then Stop:=true

end;{while not Stop}

end {Step}

else begine {not Stop}

for Niter:=0 to All_Iter do begin

NextIter(n,A,b,Xtemp);

PrintIter( Niter,n,Xtemp,All,Dec,fout )

end;

end; {not Step}

end; {(1<=n<=_N)and(eps>0)}

writeln;

if Step then write(‘x[‘,NIter:1,’]={‘)

else write(‘x[‘,All_Iter:1,’]={‘);

for i:=1 to n do

write(‘ ‘,Xtemp[i]:All:Dec);write(‘}’);

close(fout);

writeln;write (‘Finish SysIter’); readln;

END. {SysIter}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]