È possibile utilizzare sympy.curl()
per calcolare l'arricciatura di un campo vettoriale.
Esempio:
Supponiamo di avere:
F = (y z, -xy, z) = y z x - xy y + z z, quindi y
sarebbe R[1]
, x
è R[0]
e z
è R[2]
mentre i vettori dei 3 assi sarebbero R.x
, R.y
, R.z
e il codice per calcolare il campo vettoriale arricciatura è:
from sympy.physics.vector import ReferenceFrame
from sympy.physics.vector import curl
R = ReferenceFrame('R')
F = R[1]**2 * R[2] * R.x - R[0]*R[1] * R.y + R[2]**2 * R.z
G = curl(F, R)
In tal caso G sarebbe pari a R_y**2*R.y + (-2*R_y*R_z - R_y)*R.z
o, in altre parole,
G = (0, y , -2yz-y).
Per tracciarlo è necessario convertire il risultato sopra in 3 funzioni separate; u, v, w.
(esempio di seguito adattato dal matplotlib example on this link):
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
x, y, z = np.meshgrid(np.arange(-0.8, 1, 0.2),
np.arange(-0.8, 1, 0.2),
np.arange(-0.8, 1, 0.8))
u = 0
v = y**2
w = -2*y*z - y
ax.quiver(x, y, z, u, v, w, length=0.1)
plt.show()
E il risultato finale è questo:

Non sembra esserci una funzione incorporata in numpy o scipy per calcolare l'arricciatura. Se è così, dovrai scriverlo; in 3D il risultato sarà anche un campo vettoriale, in modo che matplotlib lo riproduca esattamente come nell'esempio. [Domanda simile sulla divergenza] (http://stackoverflow.com/questions/11435809/compute-divergence-of-vector-field-using-python) – cphlewis
Grazie per la risposta. Ok, ho capito come tracciare. Hai qualche suggerimento su un buon modo di scrivere la funzione curl? – gustavogrds
Forse usare Sympy (http://docs.sympy.org/dev/modules/physics/vector/fields.html) potrebbe essere utile. Ha alcune funzionalità integrate per i campi vettoriali. – Dietrich