W programie Mathematica istnieje wiele wbudowanych funkcji, które umożliwiają szybkie obliczenia. Mimo to, dla bardziej zaawansowanych zastosowań, często zachodzi potrzeba definiowania własnych funkcji. Możliwość tworzenia takich funkcji jest jednym z głównych atutów Mathematica, a umiejętność ich używania pozwala na bardziej efektywne modelowanie problemów matematycznych i fizycznych. Na przykład, gdy musimy obliczyć pozycję cząstki poruszającej się z przyspieszeniem, możemy użyć wzoru z fizyki:

x=x0+v0t+12at2x = x_0 + v_0 t + \frac{1}{2} a t^2

Gdzie x0x_0 to początkowa pozycja cząstki, v0v_0 to jej początkowa prędkość, a aa to przyspieszenie. Definiowanie funkcji w Mathematica umożliwia łatwe obliczanie wartości tej pozycji dla różnych parametrów.

W celu zdefiniowania funkcji w Mathematica, stosujemy następujący zapis:

mathematica
X[v0_, a_, t_] := v0 t + 1/2 a t^2

W powyższym przykładzie funkcja XX przyjmuje trzy argumenty: początkową prędkość v0v_0, przyspieszenie aa oraz czas tt. Zauważ, że użycie operatora := oznacza, że funkcja zostanie obliczona dopiero w momencie jej wywołania. Aby obliczyć wartość pozycji cząstki dla określonych parametrów, należy wywołać funkcję w następujący sposób:

mathematica
X[3, 2, 1] (* wynik: 4 *)

Kiedy chcemy obliczyć wartość funkcji dla różnych czasów, pomocne okazuje się wykorzystanie komendy Table, która pozwala na wykonanie obliczeń w pętli. Na przykład, aby obliczyć pozycję cząstki dla różnych czasów, możemy użyć:

mathematica
Table[X[3, 2, t], {t, 0, 3}]

Wynik obliczenia to lista wartości pozycji cząstki w czasie t=0,1,2,3t = 0, 1, 2, 3, czyli {0, 4, 10, 18}.

W bardziej zaawansowanych przypadkach możemy użyć pętli Do, która działa podobnie do Table, ale pozwala na bardziej skomplikowane operacje. Na przykład, chcąc obliczyć pozycję cząstki w czasie, ale tylko dla tych momentów, w których pozycja jest mniejsza od 10, możemy użyć poniższego kodu:

mathematica
xlist = {};
Do[ xpos = X[3, 2, t]; If[xpos < 10, AppendTo[xlist, xpos]],
{t, 0, 3}
]

Wynik tej operacji to lista pozycji cząstki {0, 4}, ponieważ wartości większe lub równe 10 nie zostały uwzględnione.

Podobnie jak funkcje, pętle mogą być używane do iterowania po danych w Mathematica. Jednym z najczęściej stosowanych typów danych są listy, które mogą zawierać różnorodne elementy, w tym inne listy, liczby, a nawet ciągi znaków. W przykładzie poniżej pokazujemy, jak można manipulować listami w Mathematica:

mathematica
a = {2, {1, 2, 3}, 3*I, {1, 4}, "Hello"};

Aby uzyskać dostęp do elementów listy, używamy operatora [[ ]]. Na przykład, aby uzyskać dostęp do drugiego elementu listy a[[2]]a[[2]], otrzymamy:

mathematica
a[[2]] (* wynik: {1, 2, 3} *)

Dzięki tej prostocie manipulacji listami, Mathematica pozwala na wygodne wykonywanie obliczeń i operacji na dużych zbiorach danych.

Oprócz podstawowych operacji na listach, Mathematica umożliwia również bardziej złożone operacje, takie jak dodawanie elementów do list, modyfikowanie ich wartości oraz wykonywanie na nich operacji matematycznych. Na przykład:

mathematica
a[[5]] + a[[4]]

Taki zapis dodaje pierwszy element z listy a[[5]]a[[5]] do elementu a[[4]]a[[4]]. Wynikiem tego będzie:

mathematica
{"Hello"} + {1, 4} (* wynik: {1 + Hello, 4 + Hello} *)

Jest to przykład tego, jak Mathematica może łączyć różne typy danych, co jest jedną z jej zalet.

W kontekście bardziej zaawansowanego przetwarzania danych w Mathematica warto zwrócić uwagę na możliwość operowania na wektorach i macierzach. W matematyce, a zwłaszcza w fizyce, wektory i macierze są podstawowymi narzędziami do modelowania i rozwiązywania problemów. W Mathematica, wektory i macierze przechowywane są jako listy, co ułatwia wykonywanie operacji na tych strukturach. Na przykład, aby obliczyć sumę dwóch wektorów r1\mathbf{r}_1 i r2\mathbf{r}_2, możemy użyć:

mathematica
r1 = {3, -2, 1}; r2 = {-1, 1, 4}; r1 + r2 (* wynik: {2, -1, 5} *)

Do obliczenia iloczynu skalarnego używamy operatora .:

mathematica
r1.r2 (* wynik: -1 *)

Podobnie, operacje na macierzach są realizowane w Mathematica za pomocą operatora . (iloczyn macierzy) i innych wbudowanych funkcji, takich jak MatrixForm do lepszego formatowania wyników.

Jeśli chcemy graficznie przedstawić funkcje matematyczne, Mathematica oferuje szereg narzędzi do tworzenia wykresów. Wśród najważniejszych funkcji rysujących są: Plot, ListPlot, ParametricPlot oraz Plot3D. Za pomocą tych funkcji możemy rysować zarówno funkcje jednowymiarowe, jak i wielowymiarowe, a także prezentować dane w postaci punktów. Na przykład, używając Plot do narysowania funkcji y(t)y(t), mamy:

mathematica
Plot[2 + 3t - 4.5t^2, {t, 0, 1}]

Dzięki tym narzędziom użytkownicy Mathematica mogą w prosty sposób wizualizować wyniki obliczeń i lepiej zrozumieć zachowanie badanych funkcji.

Wszystkie te techniki – definiowanie funkcji, manipulowanie listami, operacje na wektorach i macierzach, a także generowanie wykresów – są fundamentem pracy w Mathematica i stanowią solidną podstawę do rozwiązywania bardziej zaawansowanych problemów w matematyce i fizyce.

Jak obliczać iloczyny skalarne i wektorowe?

Iloczyn skalarny dwóch wektorów A\mathbf{A} i B\mathbf{B} to operacja, która daje skalar, a nie wektor. Jest on matematycznie wyrażony jako:

AB=ABcosθ\mathbf{A} \cdot \mathbf{B} = |\mathbf{A}| |\mathbf{B}| \cos \theta

gdzie A|\mathbf{A}| i B|\mathbf{B}| to długości wektorów A\mathbf{A} i B\mathbf{B}, a θ\theta to kąt między nimi. Wzór ten daje nam miarę „projekcji” jednego wektora na drugi. Jeśli kąt między wektorami wynosi 9090^\circ, czyli są one prostopadłe, iloczyn skalarny wynosi zero, co oznacza, że wektory są ortogonalne.

Kilka podstawowych własności iloczynu skalarnego to:

  1. Przemienność:

    AB=BA\mathbf{A} \cdot \mathbf{B} = \mathbf{B} \cdot \mathbf{A}
  2. Rozdzielność względem dodawania:

    A(B+C)=AB+AC\mathbf{A} \cdot (\mathbf{B} + \mathbf{C}) = \mathbf{A} \cdot \mathbf{B} + \mathbf{A} \cdot \mathbf{C}
  3. Rozdzielność względem mnożenia przez skalar:

    A(cB)=c(AB)\mathbf{A} \cdot (c \mathbf{B}) = c (\mathbf{A} \cdot \mathbf{B})
  4. Ortogonalność: Dwa wektory A\mathbf{A} i B\mathbf{B} są ortogonalne, jeśli i tylko jeśli:

    AB=0\mathbf{A} \cdot \mathbf{B} = 0
  5. Reguła różniczkowania:

    ddt(AB)=dAdtB+AdBdt\frac{d}{dt}(\mathbf{A} \cdot \mathbf{B}) = \frac{d \mathbf{A}}{dt} \cdot \mathbf{B} + \mathbf{A} \cdot \frac{d \mathbf{B}}{dt}

Przykład obliczenia iloczynu skalarnego

Załóżmy, że mamy wektory A=3i^+4j^k^\mathbf{A} = 3\hat{i} + 4\hat{j} - \hat{k} i B=i^j^k^\mathbf{B} = \hat{i} - \hat{j} - \hat{k}. Iloczyn skalarny tych wektorów możemy obliczyć, mnożąc współczynniki jednostkowych wektorów:

AB=(3)(1)+(4)(1)+(1)(1)=34+1=0\mathbf{A} \cdot \mathbf{B} = (3)(1) + (4)(-1) + (-1)(-1) = 3 - 4 + 1 = 0

Zatem wynik tego iloczynu to zero, co oznacza, że wektory są ortogonalne.

Możemy także obliczyć iloczyn skalarny z pomocą programów komputerowych. W Pythonie, przy użyciu biblioteki sympy, możemy wykonać następujący kod:

python
from sympy.vector import CoordSys3D
print('-'*28, 'CODE OUTPUT', '-'*29, '\n') N = CoordSys3D('N') # Define the coordinate system N A = 3*N.i + 4*N.j - 1*N.k # Define vectors A, B in N B = 1*N.i - 1*N.j - 1*N.k dotprod = A.dot(B) print('The dot product A.B = ', dotprod)

Wynik w tym przypadku również wyniesie 00, co potwierdza, że wektory są ortogonalne.

Iloczyn wektorowy, zwany także produktem wektorowym, różni się od iloczynu skalarnego tym, że jego wynikiem jest wektor, a nie skalar. Produkt wektorowy dwóch wektorów A\mathbf{A} i B\mathbf{B} jest wektorem, który jest prostopadły do obu tych wektorów. Jego kierunek określany jest regułą prawej ręki, a jego długość odpowiada polu równoległoboku utworzonego przez wektory A\mathbf{A} i B\mathbf{B}.

Maksymalną wartość iloczyn wektorowy osiąga, gdy wektory są prostopadłe do siebie (kąt między nimi wynosi 9090^\circ), a jego długość wówczas równa się AB|\mathbf{A}| |\mathbf{B}|. Wzór na iloczyn wektorowy dwóch wektorów A\mathbf{A} i B\mathbf{B} jest następujący:

A×B=ABsinθn^\mathbf{A} \times \mathbf{B} = |\mathbf{A}| |\mathbf{B}| \sin \theta \, \hat{n}

gdzie n^\hat{n} to jednostkowy wektor prostopadły do płaszczyzny zawierającej wektory A\mathbf{A} i B\mathbf{B}, a θ\theta to kąt między nimi. Jeśli wektory są równoległe (kąt θ=0\theta = 0^\circ lub 180180^\circ), wynikowy iloczyn wektorowy będzie równy wektorowi zerowemu.

Przykład obliczenia iloczynu wektorowego

Dla wektorów A=3i^+4j^k^\mathbf{A} = 3\hat{i} + 4\hat{j} - \hat{k} i B=i^j^k^\mathbf{B} = \hat{i} - \hat{j} - \hat{k}, możemy obliczyć iloczyn wektorowy używając wyznacznika macierzy:

A×B=i^j^k^341111\mathbf{A} \times \mathbf{B} = \left| \begin{matrix} \hat{i} & \hat{j} & \hat{k} \\ 3 & 4 & -1 \\ 1 & -1 & -1 \end{matrix} \right|

Po obliczeniu wyznacznika, wynikowy wektor będzie:

A×B=5i^+2j^7k^\mathbf{A} \times \mathbf{B} = -5 \hat{i} + 2 \hat{j} - 7 \hat{k}

W Pythonie możemy użyć poniższego kodu:

python
from sympy.vector import CoordSys3D
print('-'*28, 'CODE OUTPUT', '-'*29, '\n') N = CoordSys3D('N') # Define the coordinate system N A = 3*N.i + 4*N.j - 1*N.k # Define vectors A, B in N B = 1*N.i - 1*N.j - 1*N.k crossprod = A.cross(B) print('The cross product A.B = ', crossprod)

Otrzymamy wynik:

markdown
The cross product A.B = -5*i + 2*j - 7*k

Iloczyn wektorowy ma kilka ważnych właściwości algebraicznych:

  1. Rozdzielność względem dodawania:

    A×(B+C)=A×B+A×C\mathbf{A} \times (\mathbf{B} + \mathbf{C}) = \mathbf{A} \times \mathbf{B} + \mathbf{A} \times \mathbf{C}
  2. Rozdzielność względem mnożenia przez skalar:

    (cA)×B=A×(cB)=c(A×B)(c \mathbf{A}) \times \mathbf{B} = \mathbf{A} \times (c \mathbf{B}) = c (\mathbf{A} \times \mathbf{B})
  3. Antyprzemienność:

    B×A=(A×B)\mathbf{B} \times \mathbf{A} = -(\mathbf{A} \times \mathbf{B})
  4. Reguła różniczkowania:

    ddt(A×B)=dAdt×B+A×dBdt\frac{d}{dt} (\mathbf{A} \times \mathbf{B}) = \frac{d \mathbf{A}}{dt} \times \mathbf{B} + \mathbf{A} \times \frac{d \mathbf{B}}{dt}