Przytaczając definicję liczb zespolonych, wyznacznika, wypowiedź twierdzenia Cramera oraz Kroneckera-Capelliego, korzystałem z I tomu wykładów Prof. Andrzeja Staruszkiewicza dla fizyków: ALGEBRA I GEOMETRIA, Kraków, 1993. Liczby zespolone Liczby zespolone to (uporządkowane) pary liczb rzeczywistych, dla których dodawanie i mnożenie jest określone wzorami: (a,b) + (c,d) = (a+c,b+d) (a,b) * (c,d) = (a*c-b*d,a*d+b*c), gdzie a, b, c i d to liczby rzeczywiste. Liczby zespolone z powyższymi działaniami stanowią ciało. Liczbę (a,b) można napisać w postaci: (a,b) = (a,0)*(1,0) + (b,0)*(0,1). Liczby postaci (a,0) wykazują identyczne własności jak liczby rzeczywiste, a więc możemy je utożsamić z nimi i pisać krótko a. Liczbę zespoloną (0,1) oznaczamy literą i. Ostatecznie, zamiast (a,b) piszemy często a + b*i. Liczbę a nazywamy częścią rzeczywistą liczby z (a = Re(z)), a liczbę b nazywamy częścią urojoną liczby z (b=im(z)). Wielkość z = a 2 + b 2 nazywamy wartością bezwzględną (modułem) liczby
2 NOF_3.nb zespolonej. Każdą liczbę ϕ o tej własności, że Re(z) = z cos ϕ, Im(z) = z sin ϕ, nazywamy argumentem liczby zespolonej z, pisząc ϕ=arg(z). Jeśli ϕ=arg(z) ϕ =ϕ+2π=arg(z). Dlatego umawiamy się co do tzw. argumentu głównego liczby zespolonej, że będzie leżał w przedziale [ 0, 2π ). Każda liczba zespolona z może być więc zapisana w postaci trygonometrycznej: z = z ( cos ϕ + i*sin ϕ ), gdzie ϕ jest dowolnym argumentem z. Często używany jest też zapis wykładniczy z = z e iϕ, równoważny postaci trygonometrycznej. Każda liczba zespolona różna od zera ma n różnych pierwiastków n-tego stopnia. Są to liczby o tej własności, że podniesione do potęgi n dają liczbę z. Jeśli z = z e iϕ, to pierwiastkami są liczby z k = n z W innym zapisie: z k = n z i ϕ + 2 k e n, gdzie k=0, 1,..., n-1. cos ϕ + 2 k n + i * sin ϕ + 2 k, k=0, 1,..., n-1. n (* Przykłady *) Solve[z^2-1, z] rozwiąż równanie {{z -i}, {z i}} Solve[z^4 1, z] rozwiąż równanie {{z -1}, {z -i}, {z i}, {z 1}} Solve[z^4-1, z] rozwiąż równanie z - -1 1/4, z -1 1/4, z - -1 3/4, z -1 3/4
NOF_3.nb 3 Solve z^4 Sqrt[2] 2 + I * Sqrt[2] 2, z rozwiąż równa pierwiastek k j pierwiastek kwadrato 1 + i 1/4 z -, z - 2 1/8 1/4 i 1 + i, z 2 1/8 1/4 i 1 + i, z 2 1/8 Simplify Solve z^4 Sqrt[2] 2 + I * Sqrt[2] 2, z uprość rozwiąż równa pierwiastek k j pierwiastek kwadratow 1 + i 1/4 z -, z - 2 1/8 1/4 i 1 + i, z 2 1/8 1/4 i 1 + i, z 2 1/8 FullSimplify Solve z^4 Sqrt[2] 2 + I * Sqrt[2] 2, z uprość pełniej rozwiąż równa pierwiastek k j pierwiastek kwadratow z - -1 1/16, z - -1 9/16, z -1 9/16, z -1 1/16 (* Żaden z powyższych zapisów mi się nie podoba i spróbuję bezpośrednio wykorzystać definicję *) 1/4 1 + i 2 1/8 1/4 1 + i 2 1/8 (* Najpierw sprawdzam jednak konwencje używane w programie Mathematica *) p1 = ListPlot[{{1, 1}}, AspectRatio 1, AxesLabel {" Re(z)", " Im(z)"}, wykres danych z listy format obrazu oznaczenia osi część rze część urojona PlotStyle { Red, PointSize[ Large]}, PlotRange {{-2, 2}, {-2, 2}}]; styl grafiki cz rozmiar kro duży zakres wykresu p2 = ListPlot[{{-1, 1}}, AspectRatio 1, AxesLabel {" Re(z)", " Im(z)"}, wykres danych z listy format obrazu oznaczenia osi część rze część urojona PlotStyle { Black, PointSize[ Large]}, PlotRange {{-2, 2}, {-2, 2}}]; styl grafiki czarny rozmiar kro duży zakres wykresu p3 = ListPlot[{{-1, -1}}, AspectRatio 1, AxesLabel {" Re(z)", " Im(z)"}, wykres danych z listy format obrazu oznaczenia osi część rze część urojon PlotStyle { Blue, PointSize[ Large]}, PlotRange {{-2, 2}, {-2, 2}}]; styl grafiki niebi rozmiar kro duży zakres wykresu p4 = ListPlot[{{1, -1}}, AspectRatio 1, AxesLabel {" Re(z)", " Im(z)"}, wykres danych z listy format obrazu oznaczenia osi część rze część urojona PlotStyle { Green, PointSize[ Large]}, PlotRange {{-2, 2}, {-2, 2}}]; styl grafiki zielony rozmiar kro duży zakres wykresu
4 NOF_3.nb Show[p1, p2, p3, p4] pokaż Im(z) 2 1-2 -1 1 2 Re(z) -1-2 Arg[1 + I] argum jedność urojo π 4 Arg[-1 + I] argument jedność uro 3 π 4 Arg[-1 - I] argument jedność uro - 3 π 4 Arg[1 - I] argum jedność urojo - π 4 Arg[-1] argument liczby zespolonej π (* Widać, że dostaję wartości z przedziału [-π, π]. Chciałbym używać wartości argumentu głównego z przedziału [ 0, 2 π. Dlatego tworzę własną definicję argumentu: *) MyArg[z_] := If[ Arg[z] 0, Arg[z], Arg[z] + 2 * Pi] argument lic argumen argument lic pi
NOF_3.nb 5 MyArg[1 + I] jedność urojo π 4 MyArg[-1 + I] jedność uro 3 π 4 MyArg[-1 - I] jedność uro 5 π 4 MyArg[1 - I] jedność urojo 7 π 4 Simplify Abs[1 - I] * Cos[MyArg[1 - I]] + I * Sin[MyArg[1 - I]] uprość wartoś jed cosinus jed j sinus jedność 1 - i MyRoot[n_, z_] := Table Abs[z] ^ 1 n * Exp I * MyArg[z] + 2 * k * Pi n, {k, 0, n - 1, 1} tabela wartość bezwzględna fu jedność urojona pi MyRootv2[n_, z_] := Table Abs[z] ^ 1 n * tabela wartość bezwzględna Cos MyArg[z] + 2 * k * cosinus p22 = MyRoot 2, Sqrt[2] 2 + I * Sqrt[2] 2 pierwiastek k j pierwiastek kwad Pi n + I * Sin MyArg[z] + 2 * k * Pi n, {k, 0, n - 1, 1} pi j sinus pi e i π 8, e - 7 i π 8 p22v2 = MyRootv2 2, Sqrt[2] 2 + I * Sqrt[2] 2 pierwiastek k j pierwiastek kwad Cos π 8 + i Sin π 8, -Cos π 8 - i Sin π 8 p22^2 e i π 4, e i π 4 DeleteDuplicates e i π 4, e i π 4 usuń kopie e i π 4
6 NOF_3.nb p61 = MyRoot[6, 1] 1, e i π 3, e 2 i π 3, -1, e - 2 i π 3, e - i π 3 p61^6 {1, 1, 1, 1, 1, 1} DeleteDuplicates[p61^ 6] usuń kopie {1} DeleteDuplicates[p61^ 6][[1]] usuń kopie 1 Teraz spróbujemy bardziej ogólnego zapisu, gdzie występują zmienne z = x + I * y jednoś x + i y Re[z] część rzeczywista -Im[y] + Re[x] (* Mathematica nie wie, że x i y mają być liczbami rzeczywistymi i daje ogólną odpowiedź. Możemy poinformować program, że x i y są rzeczywiste, używając ComplexExpand *) rozwiń na część rzeczywistą i urojoną ComplexExpand[ Re[x + I * y]] rozwiń na część część jedność u x (* Ten zapis oznacza, że x i y wszystkie wielkości w wyrażeniu są liczbami rzeczywistymi *) ComplexExpand[ Re[w^2 * (x + I * y)], w] rozwiń na część część rzeczywi jedność urojon -x Im[w] 2-2 y Im[w] Re[w] + x Re[w] 2 (* Ten zapis oznacza, że x i y są liczbami rzeczywistymi, ale w jest dowolną liczbą zespoloną! *) (* Przykład określania obszarów w płaszczyźnie XY za pomocą liczb zespolonych. z Typowe zadanie: Podać miejsce geometryczne punktów na płaszczyźnie zespolonej spełniających warunek z+i + z-i =4 *) x + i y
NOF_3.nb 7 plot1 = ComplexExpand[ Abs[z] 2] rozwiń na część wartość bezwzg x 2 + y 2 2 RegionPlot plot1, x, -5 2, 5 2, y, -5 2, 5 2, wykres regionu na płaszczyźnie Axes osie, pra AxesLabel {"x", "y"}, oznaczenia osi y AspectRatio 1 format obrazu 2 1 0 x -1-2 -2-1 0 1 2 plot2 = ComplexExpand[ Abs[z - 1 - I] == 2] rozwiń na część wartość b jedność urojona -1 + x 2 + -1 + y 2 2
8 NOF_3.nb ContourPlot -1 + x 2 + -1 + y 2 2, x, -3 2, 4, wykres konturowy 4 y, -3 2, 4, Axes osie y, pra AxesLabel {"x", "y"}, oznaczenia osi AspectRatio 1 format obrazu 3 2 1 0 x -1-1 0 1 2 3 4 plot3 = ComplexExpand[ Abs[z + I] + Abs[z - I] 4] rozwiń na część wartoś je wartoś jedność ur x 2 + -1 + y 2 + x 2 + 1 + y 2 4
NOF_3.nb 9 ContourPlot x 2 + -1 + y 2 + x 2 + 1 + y 2 4, {x, -3, 3}, wykres konturowy 3 {y, -3, 3}, Axes osie, pra AxesLabel {"x", "y"}, oznaczenia osi y AspectRatio 1 format obrazu 2 1 0 x -1-2 -3-3 -2-1 0 1 2 3 plot4 = ComplexExpand[ Abs[z + I] - Abs[z - I] Sqrt[2]] rozwiń na część wartoś je wartoś jed pierwiastek k - x 2 + -1 + y 2 + x 2 + 1 + y 2 2
10 NOF_3.nb ContourPlot - x 2 + -1 + y 2 + x 2 + 1 + y 2 2, {x, -3, 3}, wykres konturowy 3.0 y, 1 2, 3, Axes osie, pra AxesLabel {"x", "y"}, oznaczenia osi y AspectRatio 1 format obrazu 2.5 2.0 1.5 1.0 0.5-3 -2-1 0 1 2 3 Clear[x, y, z]; wyczyść plot5 = Solve[z^4 1] rozwiąż równanie {{z -1}, {z -i}, {z i}, {z 1}} z = Table[z /. plot5[[i]], {i, 1, Length[plot5]}] tabela długość {-1, -i, i, 1} (* Albo rownoważnie tak: *) zz = z /. {plot5} {{-1, -i, i, 1}} zz = Flatten[z /. {plot5}] spłaszcz {-1, -i, i, 1} pkty = Table[{ Re[z[[i]]], Im[z[[i]]]}, {i, 1, Length[z]}] tabela część rzeczyw część urojona długość {{-1, 0}, {0, -1}, {0, 1}, {1, 0}} pkty[[1]] {-1, 0}
NOF_3.nb 11 ListPlot[pkty, AspectRatio 1, wykres danych z li format obrazu AxesLabel {"x", "y"}, oznaczenia osi PlotStyle { Red, PointSize[ Large]}] styl grafiki cz rozmiar kro duży y 1.0 0.5-1.0-0.5 0.5 1.0 x -0.5-1.0 (* Na koniec rozwiążemy jeszcze równanie kwadratowe z zespolonymi współczynnikami *) Clear[z]; wyczyść sol = Solve (5-5 * I) * z^2-3 - 2 * I * z + 1 0, z rozwiąż równanie jedność urojona jedność urojona z 1 10 + 3 i 10, z 2 5 - i 5 z1 = z /. sol[[1]] 1 10 + 3 i 10 z2 = z /. sol[[2]] 2 5 - i 5 (5-5 * I) * z1^2-3 - 2 * I * z1 + 1 0 jedność urojona jedność urojona (5-5 * I) * z2^2-3 - 2 * I * z2 + 1 0 jedność urojona jedność urojona
12 NOF_3.nb W analizie matematycznej definiujemy funkcje sinus i cosinus, bazując na funkcji e z exp(z). I to dla zmiennej zespolonej! Clear[z, x, y]; wyczyść MyCos[z_] := ( E^( I * z) + E^(-I * z)) 2 li jednoś licz jedność urojo MySin[z_] := ( E^( I * z) - E^(-I * z)) 2 * I li jednoś licz jedność urojona jedn Plot[{ Sin[x], MySin[x]}, {x, 0, 4}, PlotLegends "Expressions"] wykres sinus legenda dla grafik 1.0 0.5 sin(x) 1 2 3 4 MySin(x) -0.5 Sin[x] MySin[x] sinus Sin[x] - 1 2 i -e-i x + e i x Simplify[ Sin[x] == MySin[x]] uprość sinus Plot[{ Cos[x], MyCos[x]}, {x, 0, 4}, PlotLegends "Expressions"] wykres cosinus legenda dla grafik 1.0 0.5 cos(x) 1 2 3 4 MyCos(x) -0.5-1.0
NOF_3.nb 13 Cos[x] MyCos[x] cosinus Cos[x] 1 2 e-i x + e i x Simplify[ Cos[x] MyCos[x]] uprość cosinus (* Konsekwencjs: wzor de Moivre'a zwany tez wzorem Eulera : E^( I*z) Cos[z] + lic jedność cosinus I* Sin[z] sinus *) E^( I * z) Cos[z] + Simplify uprość lic jedność ur cosinus I * Sin[z] ] j sinus Sin[ I] si jedność urojona i Sinh[1] Cos[ I] co jedność urojona Cosh[1] (* "Jedynka trygonometryczna" jest prawdziwa dla argumentow zespolonych... *) Simplify[ Cos[2 + I]^2 + Sin[2 + I]^2] uprość cosinus jedno sinus jedność u 1 (*... ale wartosci absolutne sinusa i cosinusa nie musza lezec w przedziale [-1,1]! *) N[ Sin[5 * I]] sinus jedno 0. + 74.2032 i N[ Abs[ Sin[5 * I]]] wa sinus jednoś 74.2032 N[ Cos[3 + 4 * I]] cosinus jedno - 27.0349-3.85115 i N[ Abs[ Cos[3 + 4 * I]]] wa cosinus jednoś 27.3079
14 NOF_3.nb Wektory (trójwymiarowe) W wielu wypadkach wystarcza utożsamienie trzyelementowej listy i wektora v = {v1, v2, v3} {v1, v2, v3} MatrixForm[v] v1 v2 v3 y = {y1, y2, y3} {y1, y2, y3} Iloczyn skalarny vdoty = v.y v1 y1 + v2 y2 + v3 y3 ydotv = y.v v1 y1 + v2 y2 + v3 y3 vdoty === ydotv (* Inaczej iloczym skalarny *) Dot[v, y] iloczyn wektorów, macierzy i tensorów v1 y1 + v2 y2 + v3 y3 Dot[v, y] === v.y iloczyn wektorów, macie (* Norma wektora *) Norm[v] norma Abs[v1] 2 + Abs[v2] 2 + Abs[v3] 2 (* wektor jednostkowy w tym samym kierunku co v *)
NOF_3.nb 15 Normalize[v] znormalizuj v1 Abs[v1] 2 + Abs[v2] 2 + Abs[v3] 2, v2 Abs[v1] 2 + Abs[v2] 2 + Abs[v3] 2, Normalize[{1, 2, 5}] znormalizuj v3 Abs[v1] 2 + Abs[v2] 2 + Abs[v3] 2 1 30, 2 15, 5 6 (* Sprawdzenie, czy mamy do czynienia z wektorem jednostkowym *) Norm[ Normalize[{1, 2, 5}]] norma znormalizuj 1 (* To jest częstym tematem zadań: kąt między wektorami *) VectorAngle[{1, 0, 0}, {0, 1, 0}] kąt pomiędzy wektorami π 2 VectorAngle[{1, 0, 0}, {0, 0, 0}] kąt pomiędzy wektorami Indeterminate MyVectorAngle[z1_, z2_] := If Norm[z1] > 0 && Norm[z2] > 0, ArcCos z1.z2 Norm[z1] * Norm[z2], 0 norma norma arcus cosinus norma norma (* Jak to działa? Przepis jest bardzo prosty, zakładając, że mamy do czynienia z niezerowymi wektorami. Jeśli przynajmniej jeden z wektorów jest wektorem zerowym, przyjmuję, że kąt między wektorami wynosi zero. *) MyVectorAngle[{1, 0, 0}, {0, 1, 0}] π 2 MyVectorAngle[{1, 0, 0}, {0, 0, 0}] 0 Iloczyn wektorowy z1 = Cross[v, y] iloczyn wektorow {-v3 y2 + v2 y3, v3 y1 - v1 y3, -v2 y1 + v1 y2} (* Inaczej *)
16 NOF_3.nb z2 = v y (* to nie jest znak "iks", tylko znak działania wzięty z palety "Writing Assistant"! *) {-v3 y2 + v2 y3, v3 y1 - v1 y3, -v2 y1 + v1 y2} Cross[v, y] === v y iloczyn wektorowy (* Z wektorów niezależnych liniowo można stworzyć zbiór wektorów wzajemnie prostopadłych i unormowanych, czyli bazę ortonormalną *) baza = Orthogonalize[{{1, 2, 3}, {0, 3, 4}, {1, 5, -2}}] znajdź bazę ortogonalną 1 14, 2 7, 3 14, - 9 91, 3 91, 1 91, 1 26, 2 2 13, - 3 26 Do[{ Print[" rób drukuj {i, 1, 3}, {j, 1, 3}] baza[[1]].baza[[1]]= 1 baza[[1]].baza[[2]]= 0 baza[[1]].baza[[3]]= 0 baza[[2]].baza[[1]]= 0 baza[[2]].baza[[2]]= 1 baza[[2]].baza[[3]]= 0 baza[[3]].baza[[1]]= 0 baza[[3]].baza[[2]]= 0 baza[[3]].baza[[3]]= 1 baza[[", i, "]].baza[[", j, "]]= ", baza[[i]].baza[[j]]]}, (* Teraz dowolny wektor r może być zapisany w postaci kombinacji liniowej r= 3 i=1 c i *baza[[i]], gdzie c i =r.baza[[i]] *) ClearAll[r1, r2, r3]; wyczyść wszystko r = {r1, r2, r3} {r1, r2, r3} Do[c[i] = r.baza[[i]], {i, 1, 3}]; rób Simplify[r - Sum[c[i] * baza[[i]], {i, 1, 3}]] uprość sumowanie {0, 0, 0} Wektory mogą mieć zespolone składowe f = { I, 1, 0} jedność uro {i, 1, 0}
NOF_3.nb 17 h = {1 - I, 2 * I + 4, 3 * I} jedn jedność jedn {1 - i, 4 + 2 i, 3 i} (* Norma wektora powinna byc pierwiastkiem kwadratowym z iloczynu skalarnego wektora przez ten sam wektor, ale taki iloczyn skalarny może mieć wartość zero lub być liczbą zespoloną *) f.f 0 h.h 3 + 14 i (* Trzeba zmienić definicję iloczynu skalarnego, bo, jak widać powyżej, kwadrat niezerowego wektora może dać zero lub liczbę zespoloną! *) Dotcmplx[z1_, z2_] := Normcmplx[z_] := Normcmplx[f] 2 Normcmplx[h] 31 Conjugate[z1].z2 (* nie jest przemienny! *) sprzężenie zespolone Sqrt[Dotcmplx[z, z]] pierwiastek kwadratowy (* Funkcja " Norm" wie o tym i liczy poprawnie normę zespolonego wektora *) norma Norm[f] norma 2 Norm[h] norma 31
18 NOF_3.nb PODSTAWOWE TOŻSAMOŚCI WEKTOROWE Dowody powyższych, bardzo potrzebnych twierdzeń, są bardzo łatwe do uzyskania przy pomocy programu Mathematica. W tych dowodach wystarczy używać trzyelementowych list *) Clear[a, b, c, d]; wyczyść a = {a1, a2, a3}; b = {b1, b2, b3}; c = {c1, c2, c3}; d = {d1, d2, d3}; (* Tw. 1 *) left1 = Cross[a, b]. Cross[a, b] + a.b ^2 iloczyn wekto iloczyn wektorowy -a2 b1 + a1 b2 2 + a3 b1 - a1 b3 2 + -a3 b2 + a2 b3 2 + a1 b1 + a2 b2 + a3 b3 2 right1 = (a.a) * b.b a1 2 + a2 2 + a3 2 b1 2 + b2 2 + b3 2 Simplify[left1 right1] uprość (* Tw. 2 *) (* Uwaga: teraz dla odmiany używam palety Writing Assistant, gdzie w grupie Typesetting jest zdefiniowany operator "cross" *)
NOF_3.nb 19 Simplify a. b c c. a b b.(c a) -a. c b -c. b a -b.(a c) uprość (* Tw. 3 *) left3 = Cross[a, Cross[b, c]] iloczyn w iloczyn wektorowy {-a2 b2 c1 - a3 b3 c1 + a2 b1 c2 + a3 b1 c3, a1 b2 c1 - a1 b1 c2 - a3 b3 c2 + a3 b2 c3, a1 b3 c1 + a2 b3 c2 - a1 b1 c3 - a2 b2 c3} right3 = (a.c) * b - a.b * c - a1 b1 + a2 b2 + a3 b3 c1 + b1 a1 c1 + a2 c2 + a3 c3, - a1 b1 + a2 b2 + a3 b3 c2 + b2 a1 c1 + a2 c2 + a3 c3, - a1 b1 + a2 b2 + a3 b3 c3 + b3 a1 c1 + a2 c2 + a3 c3 Simplify[left3 right3] uprość (* Tw. 4 *) left4 = a b c + b (c a) + c a b {0, 0, 0} Simplify[left4 {0, 0, 0}] uprość (* Tw. 5 *) left5 = a b. c d -a2 b1 + a1 b2 -c2 d1 + c1 d2 + a3 b1 - a1 b3 c3 d1 - c1 d3 + -a3 b2 + a2 b3 -c3 d2 + c2 d3 right5 = (a.c) * b.d - a.d * b.c - b1 c1 + b2 c2 + b3 c3 a1 d1 + a2 d2 + a3 d3 + a1 c1 + a2 c2 + a3 c3 b1 d1 + b2 d2 + b3 d3 Simplify[left5 == right5] uprość (* Tw. 6 *) left6 = a b c d {-a3 b1 c2 d1 + a1 b3 c2 d1 + a2 b1 c3 d1 - a1 b2 c3 d1 + a3 b1 c1 d2 - a1 b3 c1 d2 - a2 b1 c1 d3 + a1 b2 c1 d3, -a3 b2 c2 d1 + a2 b3 c2 d1 + a3 b2 c1 d2 - a2 b3 c1 d2 + a2 b1 c3 d2 - a1 b2 c3 d2 - a2 b1 c2 d3 + a1 b2 c2 d3, -a3 b2 c3 d1 + a2 b3 c3 d1 + a3 b1 c3 d2 - a1 b3 c3 d2 + a3 b2 c1 d3 - a2 b3 c1 d3 - a3 b1 c2 d3 + a1 b3 c2 d3}
20 NOF_3.nb right6 = a. b d * c - a. b c * d - a3 -b2 c1 + b1 c2 + a2 b3 c1 - b1 c3 + a1 -b3 c2 + b2 c3 d1 + c1 a3 -b2 d1 + b1 d2 + a2 b3 d1 - b1 d3 + a1 -b3 d2 + b2 d3, - a3 -b2 c1 + b1 c2 + a2 b3 c1 - b1 c3 + a1 -b3 c2 + b2 c3 d2 + c2 a3 -b2 d1 + b1 d2 + a2 b3 d1 - b1 d3 + a1 -b3 d2 + b2 d3, - a3 -b2 c1 + b1 c2 + a2 b3 c1 - b1 c3 + a1 -b3 c2 + b2 c3 d3 + c3 a3 -b2 d1 + b1 d2 + a2 b3 d1 - b1 d3 + a1 -b3 d2 + b2 d3 Simplify[left6 == right6] uprość (* Tw. 7 *) left7 = a b c d {-a3 b1 c2 d1 + a2 b1 c3 d1 + a3 b1 c1 d2 + a2 b2 c3 d2 + a3 b3 c3 d2 - a2 b1 c1 d3 - a2 b2 c2 d3 - a3 b3 c2 d3, -a3 b2 c2 d1 - a1 b1 c3 d1 - a3 b3 c3 d1 + a3 b2 c1 d2 - a1 b2 c3 d2 + a1 b1 c1 d3 + a3 b3 c1 d3 + a1 b2 c2 d3, a1 b1 c2 d1 + a2 b2 c2 d1 + a2 b3 c3 d1 - a1 b1 c1 d2 - a2 b2 c1 d2 - a1 b3 c3 d2 - a2 b3 c1 d3 + a1 b3 c2 d3} right7 = b.d * (a c) - b.c * a d - b1 c1 + b2 c2 + b3 c3 -a3 d2 + a2 d3 + -a3 c2 + a2 c3 b1 d1 + b2 d2 + b3 d3, - b1 c1 + b2 c2 + b3 c3 a3 d1 - a1 d3 + a3 c1 - a1 c3 b1 d1 + b2 d2 + b3 d3, - b1 c1 + b2 c2 + b3 c3 -a2 d1 + a1 d2 + -a2 c1 + a1 c2 b1 d1 + b2 d2 + b3 d3 Simplify[left7 == right7] uprość (* Tw. 8 *) left8 = a b. c d + b c. a d + (c a). b d -b2 c1 + b1 c2 -a2 d1 + a1 d2 + a2 c1 - a1 c2 -b2 d1 + b1 d2 + -a2 b1 + a1 b2 -c2 d1 + c1 d2 + b3 c1 - b1 c3 a3 d1 - a1 d3 + -b3 c2 + b2 c3 -a3 d2 + a2 d3 + -a3 c1 + a1 c3 b3 d1 - b1 d3 + a3 c2 - a2 c3 -b3 d2 + b2 d3 + a3 b1 - a1 b3 c3 d1 - c1 d3 + -a3 b2 + a2 b3 -c3 d2 + c2 d3 Simplify[left8 0] uprość Macierze Clear[A, B, H, X, Y, Z]; wyczyść Macierz układ liczb, symboli lub wyrażeń zapisanych w postaci prostokątnej tablicy. (Wikipedia) Nas chwilowo interesują tablice liczb.
NOF_3.nb 21 A=. Ta macierz ma n wierszy i m kolumn. Do tej pory używaliśmy list trzyelementowych, mówiąc o wektorach i nie zastanawialiśmy się, czy mamy do czynienia z wierszem, czy z kolumną! Czy można mieszać trzyelementowe listy i column vectors? NIE MOŻNA, choć ich postać macierzowa MatrixForm jest identyczna. In[1]:= v = {v1, v2, v3} (* lista *) Out[1]= {v1, v2, v3} In[2]:= Out[2]//MatrixForm= v1 v2 v3 MatrixForm[v] In[3]:= k = {{k1}, {k2}, {k3}} (* kolumna *) Out[3]= {{k1}, {k2}, {k3}} In[4]:= Out[4]//MatrixForm= k1 k2 k3 MatrixForm[k] In[5]:= k.v Dot: Tensors {{k1}, {k2}, {k3}} and {v1, v2, v3} have incompatible shapes. Out[5]= {{k1}, {k2}, {k3}}.{v1, v2, v3} WNIOSEK: Wymagana jest ostrożność, jeśli chcemy konsekwentnie stosować zapis używany w podręcznikach algebry liniowej! Jak wprowadzać macierz w notatniku? Reguła jest bardzo prosta: macierz to lista wierszy! (* Poniżej macierz, która jest pojedynczym wierszem *) In[6]:= w = {{w1, w2, w3}} (* wiersz *) Out[6]= {{w1, w2, w3}} In[7]:= MatrixForm[w] Out[7]//MatrixForm= ( w1 w2 w3 )
22 NOF_3.nb A = {{1, 0, 3, 4}, {2, 4, -2, 8}, {1, 0, -4, 6}, {3, -7, 9, 1}} {{1, 0, 3, 4}, {2, 4, -2, 8}, {1, 0, -4, 6}, {3, -7, 9, 1}} MatrixForm[A] 1 0 3 4 2 4-2 8 1 0-4 6 3-7 9 1 B = {{-2, 1, 8, 0}, {7, 0, -2, 2}, {0, 1, 2, 3}, {2, 1, -9, 3}} {{-2, 1, 8, 0}, {7, 0, -2, 2}, {0, 1, 2, 3}, {2, 1, -9, 3}} MatrixForm[B] -2 1 8 0 7 0-2 2 0 1 2 3 2 1-9 3 X = {{1, 2}, {-2, 3}, {4, 5}, {6, -5}} {{1, 2}, {-2, 3}, {4, 5}, {6, -5}} MatrixForm[X] 1 2-2 3 4 5 6-5 Y = {{-1}, {2}, {0}, {9}} {{-1}, {2}, {0}, {9}} (* Teraz Y jest z zamierzenia "wektorem kolumnowym"! *) MatrixForm[Y] -1 2 0 9 Z = {{-3, 4, 5, 2}} {{-3, 4, 5, 2}} (* Teraz Z jest z zamierzenia "wektorem wierszowym"! *) MatrixForm[Z] ( -3 4 5 2 ) Możemy wykonywać różne działania (* Mnożymy macierz przez liczbę *)
NOF_3.nb 23 2 * A {{2, 0, 6, 8}, {4, 8, -4, 16}, {2, 0, -8, 12}, {6, -14, 18, 2}} MatrixForm[2 * A] 2 0 6 8 4 8-4 16 2 0-8 12 6-14 18 2 (* Kombinacja liniowa macierzy *) 2 * A + 3 * B {{-4, 3, 30, 8}, {25, 8, -10, 22}, {2, 3, -2, 21}, {12, -11, -9, 11}} MatrixForm[2 * A + 3 * B] -4 3 30 8 25 8-10 22 2 3-2 21 12-11 -9 11 Mnożenie macierzowe, wiersz razy kolumna (A.B) ij = n k=1 A ik *B kj, gdzie n jest liczbą kolumn macierzy A i liczbą wierszy macierzy B (obrazek z Wikipedii) Mnożenie macierzowe A.B, tzw. mnożenie wiersz przez kolumnę. Znakiem tego mnożenia też jest kropka wprowadzana wprost z klawiatury, której wcześniej używaliśmy dla oznaczenia iloczynu skalarnego, opisując wektory przy pomocy list! Nie każde mnożenie macierzowe jest wykonalne: wymagane jest aby liczba kolumn macierzy A była równa liczbie wierszy macierzy B. Mnożenie macierzowe na ogół NIE JEST PRZEMIENNE. (* Najprostszy przykład: mnożenie kolumny przez wiersz... *)
24 NOF_3.nb In[10]:= k.w // MatrixForm Out[10]//MatrixForm= k1 w1 k1 w2 k1 w3 k2 w1 k2 w2 k2 w3 k3 w1 k3 w2 k3 w3 (*...jest czymś zupełnie innym niż mnożenie wiersza przez kolumnę, *) In[11]:= w.k // MatrixForm Out[11]//MatrixForm= ( k1 w1 + k2 w2 + k3 w3 ) (* chociaż oba działania k.w oraz w.k są wykonalne. *) A.B {{6, 8, -22, 21}, {40, 8, -68, 26}, {10, 3, -54, 6}, {-53, 13, 47, 16}} MatrixForm[A.B] 6 8-22 21 40 8-68 26 10 3-54 6-53 13 47 16 A.X {{37, -3}, {34, -34}, {21, -48}, {59, 25}} MatrixForm[A.X] 37-3 34-34 21-48 59 25 WAŻNE: Instrukcja lub F=MatrixForm[A.X] F=A.X //MatrixForm jest błędna, jeśli F ma być macierzą! W programie Mathematica macierz i postać macierzowa to dwie różne rzeczy. A.Y {{35}, {78}, {53}, {-8}} MatrixForm[A.Y] 35 78 53-8
NOF_3.nb 25 Z.A {{16, 2, -19, 52}} MatrixForm[Z.A] ( 16 2-19 52 ) Z.A.Y {{456}} (* Mnożenie macierzy jest łączne, więc nie ma potrzeby wskazywania na kolejność działań *) (* Macierz transponowana do A: zamieniamy wiersze z kolumnami *) Transpose[A] transpozycja {{1, 2, 1, 3}, {0, 4, 0, -7}, {3, -2, -4, 9}, {4, 8, 6, 1}} MatrixForm[ Transpose[A]] postać macie transpozycja 1 2 1 3 0 4 0-7 3-2 -4 9 4 8 6 1 (* Na ćwiczeniach sprawdzimy, że Transpose[A.B]= Transpose[B]. Transpose[A] *) transpozycja transpozycja transpozycja A.A.A {{65, -294, 230, 28}, {138, -412, 188, 312}, {-38, -70, -289, 148}, {-40, -217, 188, -289}} MatrixPower[A, 3] potęga macierzy {{65, -294, 230, 28}, {138, -412, 188, 312}, {-38, -70, -289, 148}, {-40, -217, 188, -289}} (* Można zadziałać funkcją na całą macierz *) Sin[A] sinus {{Sin[1], 0, Sin[3], Sin[4]}, {Sin[2], Sin[4], -Sin[2], Sin[8]}, {Sin[1], 0, -Sin[4], Sin[6]}, {Sin[3], -Sin[7], Sin[9], Sin[1]}} (* Dla macierzy zespolonych mamy operację, która łączy w sobie transponowanie i sprzężenie zespolone. Jest to tzw. sprzężenie hermitowskie. Odpowiada jej komenda ConjugateTranspose. *) sprzężenie hermitowskie macierzy H = A + I * B (* to jest macierz o współczynnikach zespolonych! *) jedność urojona {{1-2 i, i, 3 + 8 i, 4}, {2 + 7 i, 4, -2-2 i, 8 + 2 i}, {1, i, -4 + 2 i, 6 + 3 i}, {3 + 2 i, -7 + i, 9-9 i, 1 + 3 i}}
26 NOF_3.nb MatrixForm[H] 1-2 i i 3 + 8 i 4 2 + 7 i 4-2 - 2 i 8 + 2 i 1 i -4 + 2 i 6 + 3 i 3 + 2 i -7 + i 9-9 i 1 + 3 i G = ConjugateTranspose[H] sprzężenie hermitowskie macie {{1 + 2 i, 2-7 i, 1, 3-2 i}, {-i, 4, -i, -7 - i}, {3-8 i, -2 + 2 i, -4-2 i, 9 + 9 i}, {4, 8-2 i, 6-3 i, 1-3 i}} MatrixForm[G] 1 + 2 i 2-7 i 1 3-2 i -i 4 -i -7 - i 3-8 i -2 + 2 i -4-2 i 9 + 9 i 4 8-2 i 6-3 i 1-3 i (* Na ćwiczeniach sprawdzimy na przykładach twierdzenie, że ConjugateTranspose[A.B]= ConjugateTranspose[B]. ConjugateTranspose[A] *) sprzężenie hermitowskie macierzy sprzężenie hermitowskie mac sprzężenie hermitowskie macierzy