Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

Матрицы   Найти похожие ветки 

 
Helpsic   (2006-09-27 19:44) [0]

Добрый вечер.Я учусь в 10-ом классе и нам по информатике задали написать прогу на Pascal`е для решения матрицы вида 5X5, используя массивы, я весь вечер ломаю голову но ни как не могу придумать алгоритм, помогите пожалуйста.


 
YurikGL ©   (2006-09-27 20:03) [1]

А что есть решение матрицы?


 
Helpsic   (2006-09-27 20:07) [2]

Что бы решить такую матрицу
1 -2   1   0  -3   2
1 -5  -1   1  1    -2
2 -1  -10 6  7     0
2  1   -1  3  4     4
-2 3   -3  7 -1    5
нужно к второй строке прибавить первую умноженную на такое число что бы первые члены обращались в ноль в данном случаи домножить нужно на -1, и получим
1 -2 1 0 -3   2
0 -3 -2 1 4  0
далее прибовляем к 3,4,5 строке первую умноженную на такое число что бы первые члены обращались в ноль и в конце получим
1 -2 1   0  - 3   2
0 -3 -2  1  4     0
0 3 -12  6  13  -4
0 5 -3   3   10   0
0 -1 -1 -7 -7   1
Далее превращаем числа -3, 3, 5, -1 в ноль оналогичным способ до тех пор пока матрица не будет выглядеть таким образом(числа взял на угад)
12349    0
02459   -2
00765    5
00074   4
00002   4
далее находим x из пятой строки он равен 2 и далее подставляем в остальные строки и получаем 5 корней


 
DevilDevil ©   (2006-09-27 20:17) [3]

Я такую же программу... только по-сложней писал "наспор" преподователю по ГА (геометрии и алгебре) на первом курсе универа. Не так то это просто...  что у вас за школа такая?

Самый простой способ (в программировании) - методом Крамера [через определители]. А так, как определители и уж тем более метод Крамера вы не изучали, могу предложить свой вариант:

1) сначала реализовывай дробь: числитель, занаменатель : integer;
2) все операции с ней: сложение, вычетание, умножение, деление
3) потом наткнёшься на необходимость нахождения НОД

потом... спрашивай, скажу! :)))


 
Helpsic   (2006-09-27 20:38) [4]

Можно и метод Крамера использовать, мне главное что бы программа работала. Ну если можно в чём заключается этот метод?
P.S. Школа с углублённым изучением математики, физики, информатики, англ-яз.


 
DprYg ©   (2006-09-27 20:53) [5]

Считаешь главный детерминант, вспомогательные и делишь каждый вспомогательный на главный.


 
@!!ex ©   (2006-09-27 21:37) [6]

Да уж... 10 класс.....
Фига се....
Я в 10 классе знал определители только потому что мне это было пазарез нужно....
Могу прислать нашу методичку....
В которой метод Крамера описан...


 
DevilDevil ©   (2006-09-28 15:08) [7]

В методе Крамера самое сложное - запрограммировать нахождения определителя матрицы. Вот нашёл для дробей:

type
  TDrob = record
       Chisl : Integer;
      Znam : Integer;
   end;

function Drob(const Chisl, Znam : integer) : TDrob;
begin
   Result.Chisl:= Chisl;
   Result.Znam := Znam;
end;

function OneDrob(const Src : TDrob) : bool;
begin
  Result := Src.Chisl = Src.Znam;
end;

function ZeroDrob(const Src : TDrob) : bool;
begin
  Result := Src.Chisl = 0;
end;

procedure Invert(var Drob : TDrob);
var X : integer;
begin
   X := Drob.Chisl;
   Drob.Chisl := Drob.Znam;
   Drob.Znam  := X        ;
end;

function DrobToStr(const Drob : TDrob) : string;
begin
  Result := inttostr(Drob.Chisl);
  if (Drob.Znam <> 1) and (Drob.Chisl <> 0)
  then Result := Result + "/" + inttostr(Drob.Znam);
end;

procedure Raven(var Des : TDrob; const Src : TDrob);
begin
   Des.Chisl := Src.Chisl;
   Des.Znam  := Src.Znam ;
end;

function  Raven(const Src : TDrob) : TDrob;
begin
  Raven(Result, Src);
end;

procedure OnZero(var Src : TDrob);
begin
 if Src.Chisl = 0 then Src.Znam := 1;
end;

procedure MakeZnak(var Src : TDrob);
begin
 OnZero(Src);
 if Src.Znam < 0 then
 begin
    Src.Chisl := -Src.Chisl;
    Src.Znam  := abs(Src.Znam);
 end;
end;

function Nod(const Src : TDrob) : Integer;
var D : TDrob; S : Integer;
   function FindNod : Integer;
   begin
      for Result := 20 downto 1 do
      if  (D.Chisl >= Result) and (D.Znam >= Result) then
      if (D.Chisl mod Result = 0)
      and (D.Znam  mod Result = 0)
      then break;
   end;

   procedure Next;
   begin
     S := FindNod;
     if S <> 1 then Result := Result * S;
     D.Chisl := D.Chisl div S;
     D.Znam  := D.Znam  div S;
   end;
begin
   D := Raven(Src);
   D.Chisl := abs(D.Chisl);
   Result := 1;
   Next;
   while S <> 1 do
   Next;
end;

procedure Sokratit(var Src : TDrob);
var N : Integer; fMinus : boolean;
begin
   if (Src.Chisl = 0) or (Src.Znam = 0) then EXIT;
   N := Nod(Src);
   if N = 1 then EXIT;
   Src.Chisl := Src.Chisl div N;
   Src.Znam  := Src.Znam  div N;
   // &#237;&#224; &#247;&#232;&#241;&#235;&#224; &#242;&#232;&#239;&#224; 23, 29, 47 &#232; &#242;.&#228;.
   fMinus := Src.Chisl < 0;
   Src.Chisl := abs(Src.Chisl);
 if (Src.Chisl >= Src.Znam) and (Src.Chisl mod Src.Znam = 0)
 then begin
 Src.Chisl := Src.Chisl div Src.Znam;
 Src.Znam  := 1;
 end else
 if (Src.Znam > Src.Chisl) and (Src.Znam mod Src.Chisl = 0)
 then begin
 Src.Znam := Src.Znam div Src.Chisl;
 Src.Chisl:= 1;
 end;
 if fMinus then Src.Chisl := -Src.Chisl;
end;

procedure Umnogit(var Des : TDrob; const Src : TDrob);
begin
   Des.Chisl := Des.Chisl * Src.Chisl;
   Des.Znam  := Des.Znam  * Src.Znam ;
   Sokratit(Des);
end;

procedure  Razdelit(var Des : TDrob; const Src : TDrob);
begin
   Des.Chisl := Des.Chisl * Src.Znam ;
   Des.Znam  := Des.Znam  * Src.Chisl;
   MakeZnak(Des);
   Sokratit(Des);
end;

procedure Minus(var Des : TDrob; const Src : TDrob);
var N1, N2 : Integer;
begin
   N1 := Nod(Drob(Des.Znam, Src.Znam));
   N2 := Des.Znam div N1;
   N1 := Src.Znam div N1;

   Des.Chisl := Des.Chisl * N1 - Src.Chisl * N2;
   Des.Znam  := Des.Znam  * N1;
   Sokratit(Des);
end;

procedure Plus(var Des : TDrob; const Src : TDrob);
var N1, N2 : Integer;
begin
   N1 := Nod(Drob(Des.Znam, Src.Znam));
   N2 := Des.Znam div N1;
   N1 := Src.Znam div N1;

   Des.Chisl := Des.Chisl * N1 + Src.Chisl * N2;
   Des.Znam  := Des.Znam  * N1;
   Sokratit(Des);
end;

function StrToDrob(const Dr : string) : TDrob;
var S : string; P : Integer;
begin
   S := Dr;
   while S[length(S)] = " " do delete(S, length(S), 1);
   P := Pos("/", S);
   if P = 0 then
   begin
    P := Length(S) + 1;
    S := S + "/1";
   end;
   Result.Chisl := StrToInt(copy(S, 1, P - 1));
   delete(S, 1, P);
   Result.Znam  := StrToInt(S);
end;


Делай массив дробей. Берёшь i-й столбец. Если элемент матрицы[i][i] неравен нулю, то всю i-ю строку делишь на этот элемент. Элемент становится единицей. Все остальные элементы столбца "зануляешь", т.е. отнимаешь из j-й строки i-ю строку помноженную на элемент матрицы[j][i]. Проделаешь такой алгоритм последовательно по каждому столбцу, в итоге получится примерно так:

(1 0 0| 8)
(0 1 0| 1/2)
(0 0 1| 3/5)


Это означает, что x1 = 8; x2 = 1/2; x3 = 3/5;


 
DevilDevil ©   (2006-09-28 15:15) [8]

После этого, я весь проект переделывал чуть ли не с нуля. Но самое большое и качественное изменение в дробях было в нахождении НОД:

// вспомогательная фукция - определение Наиб Общ Дел
function NOD(X1, X2 : DWORD) : DWORD;
var
dlt  : boolean;
Chisl: array[BOOLEAN] of DWORD;
begin
Chisl[false] := X1;
Chisl[true ] := X2;
dlt := X1 < X2;

while Chisl[not dlt] <> 0 do
begin
   Chisl[dlt] := Chisl[dlt] mod Chisl[not dlt];
   dlt := not dlt;
end;

NOD := Chisl[dlt];
end;


Если надо, то сам подкорректируешь


 
Игорь Шевченко ©   (2006-09-28 15:28) [9]

Правила читать.



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.043 c
2-1159512168
vodvorezlaya
2006-09-29 10:42
2006.10.15
Как изменить размер обьектов на форме во время работы программы


15-1158753660
Fidel
2006-09-20 16:01
2006.10.15
Типовые инструкции


2-1159455702
Matri}{
2006-09-28 19:01
2006.10.15
Матрица


1-1156672010
Mr tray
2006-08-27 13:46
2006.10.15
Синхронизация


2-1159343114
Dr. Genius
2006-09-27 11:45
2006.10.15
Объявление модулей в interface и implementation