Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.041 c
15-1158989682
Калашник
2006-09-23 09:34
2006.10.15
Проблемы с утсновкой


2-1159543721
Dysan
2006-09-29 19:28
2006.10.15
Как сворачивать дополнительную форму?


15-1158845961
oldman
2006-09-21 17:39
2006.10.15
А вот если Вы все такие умные, почему Вы строем не ходите?


3-1155984409
Lexx_
2006-08-19 14:46
2006.10.15
Autoincrement + ADOCommand


1-1157523050
DmiSb
2006-09-06 10:10
2006.10.15
Как программно открыть календарь у TDateTimePicker ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский