Форум: "Начинающим";
Текущий архив: 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;
// íà ÷èñëà òèïà 23, 29, 47 è ò.ä.
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