Analiza pola wektorowego¶
import sympy as sp
from IPython.display import Markdown, display
# Zmienne
x, y, z = sp.symbols('x y z')
# Definicja pola wektorowego
w = sp.Matrix([x**2-2*y, 3*x**2*y-5*z, 5*z**2+3*y*x+y**2-1])
m0=sp.Matrix([0, 0, 0])
# Oblicz rotację (curl)
curl_w = sp.Matrix([
sp.Derivative(w[2], y) - sp.Derivative(w[1], z),
sp.Derivative(w[0], z) - sp.Derivative(w[2], x),
sp.Derivative(w[1], x) - sp.Derivative(w[0], y)
])
curl_w_v = curl_w.doit()
# prezentacja wyników
if curl_w_v == m0:
podsumowanie = sp.latex(sp.Eq(curl_w_v, m0)) + '\\implies \\text{Pole potencjalne}'
else:
podsumowanie = sp.latex(sp.Ne(curl_w_v, m0)) + '\\implies \\text{Pole nie potencjalne}'
latex_code = fr"""
\begin{{align*}}
& \Large \vec{{W}}={sp.latex(w)} \\ \\
& \Large \text{{Wyznaczenie rotacji}} \\ \\
& \Large \nabla \times \vec{{W}} = {sp.latex(curl_w)} = {sp.latex(curl_w_v)} \\ \\
& \Large {{{podsumowanie}}} \\ \\
\end{{align*}}
"""
display(Markdown(latex_code))
\begin{align*} & \Large \vec{W}=\left[\begin{matrix}x^{2} - 2 y\\3 x^{2} y - 5 z\\3 x y + y^{2} + 5 z^{2} - 1\end{matrix}\right] \\ \\ & \Large \text{Wyznaczenie rotacji} \\ \\ & \Large \nabla \times \vec{W} = \left[\begin{matrix}- \frac{\partial}{\partial z} \left(3 x^{2} y - 5 z\right) + \frac{\partial}{\partial y} \left(3 x y + y^{2} + 5 z^{2} - 1\right)\\\frac{\partial}{\partial z} \left(x^{2} - 2 y\right) - \frac{\partial}{\partial x} \left(3 x y + y^{2} + 5 z^{2} - 1\right)\\- \frac{\partial}{\partial y} \left(x^{2} - 2 y\right) + \frac{\partial}{\partial x} \left(3 x^{2} y - 5 z\right)\end{matrix}\right] = \left[\begin{matrix}3 x + 2 y + 5\\- 3 y\\6 x y + 2\end{matrix}\right] \\ \\ & \Large {\left[\begin{matrix}3 x + 2 y + 5\\- 3 y\\6 x y + 2\end{matrix}\right] \neq \left[\begin{matrix}0\\0\\0\end{matrix}\right]\implies \text{Pole nie potencjalne}} \\ \\ \end{align*}
import sympy as sp
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
pio.renderers.default = "notebook_connected" #musi być aby zadziałał export do html przez nbcovert
# Przekształcenie do funkcji numerycznych (lambdify konwertuje symboliczną funkcję do NumPy)
F_func = sp.lambdify((x, y, z), w, modules='numpy')
# Siatka 3D (rzadka, by było czytelne)
x_vals = np.linspace(-2, 2, 6)
y_vals = np.linspace(-2, 2, 6)
z_vals = np.linspace(-2, 2, 6)
X, Y, Z = np.meshgrid(x_vals, y_vals, z_vals)
# Obliczamy numerycznie wartości pola wektorowego
U, V, W = F_func(X, Y, Z)
# Tworzymy wykres stożków
fig = go.Figure(data=go.Cone(
x=X.flatten(), y=Y.flatten(), z=Z.flatten(),
u=U.flatten(), v=V.flatten(), w=W.flatten(),
colorscale='Plasma', sizemode='absolute', sizeref=40, anchor="tail"
))
fig.update_layout(
scene=dict(
xaxis=dict(range=[-2.5, 2.5]),
yaxis=dict(range=[-2.5, 2.5]),
zaxis=dict(range=[-2.5, 2.5]),
aspectmode='cube'
),
title="Graficzna interaktywna prezentacja analizowanego pola wektorowego"
)
fig.show()