[Delphi] Czy istnieją takie typy ???

0

Czy w Delphi 4 można zrobić zmienną odpowiadającą liczbie zespolonej (Complex). Jeśli tak to jak się taki typ nazywa, i jak wprowadzać jednostkę urojoną?

I czy jest typ macierzowy w D4 (matrixsize)?? Czym się różni od zwykłej tablicy wielowymiarowej? Jak się liczy jej wyznacznik??

0

Pisalem kiedys na laborkach z programowania modul do operacji na liczbach zespolonych. Typ zespolony (jesli dobrze pamietam) byl w tym module zdefiniowany nastepujaco:

type TZespol = record Re:Real; Im:Real; end;

Zadna filozofia, wazniejsze sa operacje na tym typie np. suma:

function sumaZes(a,b:TZespol):TZespol;
var s:tzespol;
begin
s.re := a.re + b.re;
s.im := a.im + b.im;
sumazes := s;
end;

Analogicznie dla innych dzialan (uwaga na wzory przy iloczynie, ilorazie i potegach).

--
-=[.SlimY.]=-

0

Jest typ zespolony oparty na Variant. Jest chyba w module cmplx (czy coś takiego. Jest w helpie).
Oprócz tego możesz zrobić sobie sam moduł do obliczenia. Dodatkowo nie będziesz ograniczony tylko do postaci algebraicznej (która jest moim zdaniem bardziej ograniczona niż np. trygonometryczna).

Co do macierzy to proszę bardzo. Oto macież m x n
type Macierz = array [0..m, 0..n] of Integer;

Jak się oblicza wyznacznik? Ze wzoru:
Jeżeli macierz jest stopnia 1 to det A = a(11)
w innym wypadku:
det A = Suma(k=1 -> n) (-1)^(k+1)*a(1k)A(1k)

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC: #4programmers, warszawa.ircnet.pl (POLNet)

0

Jest typ zespolony oparty na Variant.

Czy na pewno jest juz w D4?

--
Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Jest typ zespolony oparty na Variant.

Czy na pewno jest juz w D4?

Szczerze mówiąc nie wiem. To jedyne Delphi, którego nie miałem (nie licząc D7).

A wracając do obliczania wyznacznika macierzy. Podany wzór rekurencyjny jest oczywiście jak najbardziej prawidłowy, ale jeżeli chodzi o jego złożoność to jest fatalny. Można wyznacznik obliczyć szybciej. Trzeba tylko skorzystać z kilku własności wyznaczników.

  1. Jeżeli wszystkie elementy wyznacznika leżące poniżej (lub powyżej) głównej przekątnej są równe 0 to wartość wyznacznika jest równa iloczynowi elementów leżących na głównej przekątnej.
  2. Wartość wyznacznika nie zmienia się, jeżeli do danego wiersza (lub kolumny) dodamy kombinację liniową innego wiersza (lub kolumny). Dzięki temu możemy skorzystać z metody Gaussa.

Jeżeli mamy wyznacznik:
1 2 3 4 5 w1
4 2 1 6 8 w2
1 3 6 8 9 w3
1 3 6 8 0 w4
9 0 3 1 4 w5
To możemy kombinację liniową pierwszego wiersza odjąć od pozostałych.
Wykonajmy następujące operacje.
w2 - w14
w3 - w1
w4 - w1
w5 - w1
9
Otrzymamy:
1 2 3 4 5 w1
0 -2 -11 -10 -12 w2
0 1 3 4 4 w3
0 1 3 4 -20 w4
0 -18 -24 -35 -41 w5
Dalej możemy drugi wiersz odjąć od następnych:
w3 + w20.5
w3 + w2
0.5
w3 - w29
Otrzymamy:
1 2 3 4 5 w1
0 -2 -11 -10 -12 w2
0 0 2.5 -1 -2 w3
0 0 2.5 -1 -26 w4
0 0 73 55 67 w5
Dalej 3 wiersz od następnych:
w4 - w3
w5 - w3
29.2

1 2 3 4 5 w1
0 -2 -11 -10 -12 w2
0 0 2.5 -1 -2 w3
0 0 0 0 -24 w4
0 0 0 84.2 125.4 w5

Teraz możemy przestawić wiersz w4 i w5 zmieniając znak wyznacznika
-1*
1 2 3 4 5 w1
0 -2 -11 -10 -12 w2
0 0 2.5 -1 -2 w3
0 0 0 84.2 125.4 w5
0 0 0 0 -24 w4

I wymnożyć elementy po przekątnej:
-11(-2)2.584.2*(-24) = -10 104
I gdybym się nie pomylił (a przy takich obliczeniach prawie zawsze się mylę) to to byłby prawidłowy wynik. Na szczęście komputer się nie myli :)

--
Jest jeszcze jeden błąd ... :)
--------Oficjalny kanał----------
Service for programmers w IRC: #4programmers, warszawa.ircnet.pl (POLNet)

0

Wiem jak się liczy wyznacznik (ja akurat mam inny sposób). Chciałem tylko wiedzieć, czy w delphi jest jakaś automatyczna metoda, np: ( det(A)) :)))) - ale thx !!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1