Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Решение СЛУ методом Дулитла (http://forum.oszone.net/showthread.php?t=193065)

dasha131 05-12-2010 07:10 1558595

Решение СЛУ методом Дулитла
 
Вот нашлась программа, подскажите пожалуйста для чего здесь используется массив int ?
Код:

Program laba4;
uses crt;
const N=3;
type typ_matr=array[1..N,1..N] of real;
type typ_mas=array[1..N] of real;
type typ_m=array[1..N] of integer;
var a: typ_matr;
    b,a0,x: typ_mas;
    int: typ_m;
    i,j,p,k: integer;
    macheps,s: real;
    retcod: byte;
function machineeps: real;
var mach: real;
begin
    mach:=1;
    while 1+mach>1 do
          mach:=mach/2;
    machineeps:=mach*2;
end;
procedure vvod_matr(var Z:typ_matr);
begin
    writeln;
    for i:=1 to N do
      for j:=1 to N do
          begin
            writeln('a[',i,',',j,']');
            readln(Z[i][j]);
          end;
end;
procedure vvod_mass(var Y:typ_mas);
begin
    writeln;
    for i:=1 to N do
    begin
        writeln('b[',i,']');
        read(Y[i]);
    end;
end;
procedure vivod_matr(var Z:typ_matr);
begin
    writeln;
    for i:=1 to N do
    begin
      for j:=1 to N do
      begin
          write(Z[i][j]);
          write('');
      end;
    writeln;
    end;
end;
procedure normmatr(var z0:typ_mas;var Z:typ_matr);
begin
    for i:=1 to N do
    begin
        z0[i]:=Z[1,i];
        for j:=2 to N do
            if abs(Z[j,i])>z0[i] then  z0[i]:=abs(Z[j,i]);
        for j:=1 to N do
            Z[j,i]:=Z[j,i]/z0[i];
    end;
    write('matr A!!!:');
    vivod_matr(A);
end;
procedure dulitdecomp(var Z:typ_matr;
          var z0:typ_mas;
          var int:typ_m;
          var mach:real;
          var ret:byte);
var amax,dd:real;
var imax: integer;
begin
    normmatr(z0,z);
    for i:=1 to N do
        int[i]:=i;
    for k:=1 to N do
    begin
        amax:=abs(Z[int[k],k]);
        for i:=k+1 to N do
        if abs(Z[int[k],k])>amax then
        begin
        amax:=abs(Z[int[k],k]);
        imax:=i;
        end;
      if imax<>k then
      begin
        j:=int[k];
        int[k]:=int[imax];
        int[imax]:=j;
      end;
      if abs(Z[int[k],k])<n*mach
      then begin
      ret:=1; break;
      end;
      for i:=1 to k do
      begin
          for j:=1 to k do
            begin
            A[int[k],i]:=A[int[k],i]-A[int[k],j]*A[int[j],i];
            end;
      end;
      for i:=k+1 to n do
      begin
          for j:=1 to k-n do
          begin
              A[int[k],i]:=A[int[k],i]- A[int[k],j]*A[int[j],i];
          end;
          A[int[k],i]:=A[int[k],i]/A[int[k],k];
      end;
      end;

    end;
procedure dulitslu(var A: typ_matr;
          var b:typ_mas;
          var int: typ_m;
          var x: typ_mas);
begin
    for i:=1 to N do
      x[i]:=b[i];
    for i:=1 to N do
    begin
      if int[i]<>i
      then begin
          s:=x[i];
          x[i]:=x[int[i]];
          x[int[i]]:=s;
      end;
    end;
    for i:=1 to N do
    begin
      s:=0;
      for j:=1 to i-1 do
        s:=s+A[i,j]*x[j];
      x[i]:=(x[i]-s)/A[i,i];
    end;
    for i:=N downto 1 do
    begin
        s:=0;
        for j:=i+1 to N do
            s:=s+A[i,j]*x[i];
        x[i]:=x[i]-s;
    end;
    for i:=1 to N do
        x[i]:=x[i]/a0[i];
  end;
  {Osnovnaya proga}
begin
  clrscr;
  retcod:=0;
macheps:=machineeps;
writeln('macheps=',macheps);
vvod_matr(A);
vvod_mass(b);
vivod_matr(A);
for i:=1 to N do
    write(b[i],'');
dulitdecomp(A,a0,int,macheps,retcod);
if retcod=0 then
    write('Razlozhenie uspechno');
dulitslu(A,b,int,x);
writeln;
writeln('matr A:');
vivod_matr(a);
writeln('MATS A0;');
for i:=1 to n do
      begin
      write(a0[i]);
      write('');
      end;
writeln('reshenie x:');
for i:=1 to n do
      begin
      write(x[i]);
      write('');
      end;
readkey;
end.


Любезный 05-12-2010 09:46 1558619

Бред какой-то... Одни и те же имена глобальных переменных и параметров процедур явно не способствуют корректной работе программы.

dasha131 05-12-2010 10:18 1558630

По заданию нужно составить программу в процедурах

Любезный 05-12-2010 14:07 1558749

Это Вы сами написали? Или нашли в инете?

dasha131 06-12-2010 16:04 1559596

Написали) но не это важно, просто подскажите "для чего здесь используется массив int" ну или вообще такие массивы применяются с какой целью

Любезный 06-12-2010 17:28 1559651

Если писали сами - сами и должны знать. Я не пойму, как поведёт себя компьютер, ибо нельзя, чтобы имена параметров функций совпадали с именами глобальных переменных.

dasha131 09-12-2010 14:38 1561864

Дело даже не в программе, уже жалею что ее написал(
Я задаю общий вопрос "В алгоритме Дулитла используется массив Int, i-ый элемент которого фиксирует порядок перестановки строк на i-ом шаре алгоритма "
Впринципе можно обойтись и без этого массива, но вчем удачность его использования? в чем минусы? в чем плюсы?
Так то он занимает лишнюю память в программе, тогда какой смысл в его использовании?


Время: 01:36.

Время: 01:36.
© OSzone.net 2001-