Cálculo del rotacional de una fuerza y de la proyección de vectores:
import numpy as np
import matplotlib.pyplot as plt
from sympy import symbols, sympify, lambdify, diff, pprint
from sympy.vector import CoordSys3D
# ======= Funciones vectoriales =======
def producto_cruz(v1, v2):
return np.cross(v1, v2)
def proyeccion(v1, v2):
if np.linalg.norm(v2) == 0:
raise ValueError("El vector v2 no puede ser el vector nulo.")
v2_unit = v2 / np.linalg.norm(v2)
return np.dot(v1, v2_unit) * v2_unit
def calcular_rotacional_simb(Fx_expr, Fy_expr, Fz_expr):
x, y, z = symbols('x y z')
try:
Fx = sympify(Fx_expr)
Fy = sympify(Fy_expr)
Fz = sympify(Fz_expr)
except Exception as e:
print("❌ Error al interpretar las funciones:", e)
return None, None
try:
# Derivadas parciales para el rotacional
rot_x = diff(Fz, y) - diff(Fy, z)
rot_y = -(diff(Fz, x) - diff(Fx, z))
rot_z = diff(Fy, x) - diff(Fx, y)
# Sistema coordenadas para mostrar resultado vectorial
N = CoordSys3D('N')
rot = rot_x * N.i + rot_y * N.j + rot_z * N.k
F = Fx * N.i + Fy * N.j + Fz * N.k
return rot, F
except Exception as e:
print("❌ Error al calcular el rotacional:", e)
return None, None
# ======= Visualización =======
def graficar_vectores(v1, v2, proy, cruz, guardar=False):
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
def dibujar(v, color, label):
ax.quiver(0, 0, 0, v[0], v[1], v[2], color=color, label=label)
dibujar(v1, 'blue', 'v1')
dibujar(v2, 'green', 'v2')
dibujar(proy, 'orange', 'Proyección')
dibujar(cruz, 'red', 'Producto cruz')
ax.set_xlim([-5, 5])
ax.set_ylim([-5, 5])
ax.set_zlim([-5, 5])
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
ax.legend()
plt.title("Vectores en 3D")
if guardar:
plt.savefig("vectores_3d.png")
print("→ Gráfico de vectores guardado como vectores_3d.png")
plt.show()
def graficar_rotacional(rot, guardar=False, dominio=None):
if rot is None:
print("❌ No se puede graficar el rotacional porque no fue calculado correctamente.")
return
if dominio is None:
dominio = np.linspace(-2, 2, 8)
N = CoordSys3D('N')
fx = lambdify((symbols('x'), symbols('y'), symbols('z')), rot.dot(N.i), 'numpy')
fy = lambdify((symbols('x'), symbols('y'), symbols('z')), rot.dot(N.j), 'numpy')
fz = lambdify((symbols('x'), symbols('y'), symbols('z')), rot.dot(N.k), 'numpy')
X, Y, Z = np.meshgrid(dominio, dominio, dominio)
U = fx(X, Y, Z)
V = fy(X, Y, Z)
W = fz(X, Y, Z)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.quiver(X, Y, Z, U, V, W, length=0.3)
ax.set_title("Campo del rotacional")
if guardar:
plt.savefig("rotacional_3d.png")
print("→ Gráfico del rotacional guardado como rotacional_3d.png")
plt.show()
# ======= Entrada de usuario =======
def leer_vector(nombre):
entrada = input(f"Ingrese las componentes del vector {nombre} separadas por comas (ejemplo: 1,2,3): ")
return np.array([float(num) for num in entrada.strip().split(',')])
def leer_campo_vectorial():
print("\nIngrese las funciones del campo vectorial F(x, y, z):")
Fx = input("F_x(x, y, z) = ")
Fy = input("F_y(x, y, z) = ")
Fz = input("F_z(x, y, z) = ")
return Fx, Fy, Fz
# ======= Guardar resultados =======
def guardar_resultados_txt(v1, v2, cruz, proy, Fx, Fy, Fz, rotacional):
with open("resultados_vectoriales.txt", "w", encoding="utf-8") as f:
f.write("===== Resultados Vectoriales =====\n\n")
f.write(f"Vector v1: {v1.tolist()}\n")
f.write(f"Vector v2: {v2.tolist()}\n\n")
f.write(f"Producto cruz v1 x v2: {cruz.tolist()}\n")
f.write(f"Proyección de v1 sobre v2: {proy.tolist()}\n\n")
f.write(f"Campo vectorial F(x,y,z) = <{Fx}, {Fy}, {Fz}>\n")
f.write(f"Rotacional simbólico: {rotacional}\n")
print("→ Resultados guardados en resultados_vectoriales.txt")
# ========== MAIN ==========
if __name__ == "__main__":
try:
print("===== Cálculo de vectores en 3D =====")
v1 = leer_vector("v1")
v2 = leer_vector("v2")
cruz = producto_cruz(v1, v2)
proy = proyeccion(v1, v2)
print("\nProducto cruz v1 x v2:", cruz)
print("Proyección de v1 sobre v2:", proy)
Fx_expr, Fy_expr, Fz_expr = leer_campo_vectorial()
rotacional, campo = calcular_rotacional_simb(Fx_expr, Fy_expr, Fz_expr)
if rotacional is not None:
print("\nRotacional del campo F:")
pprint(rotacional)
guardar_resultados_txt(v1, v2, cruz, proy, Fx_expr, Fy_expr, Fz_expr, rotacional)
graficar_vectores(v1, v2, proy, cruz, guardar=True)
graficar_rotacional(rotacional, guardar=True)
else:
print("❌ El rotacional no pudo ser calculado. Verifica las funciones ingresadas.")
except Exception as e:
import traceback
with open("error_log.txt", "w", encoding="utf-8") as f:
f.write(traceback.format_exc())
input(f"\n❌ Ocurrió un error inesperado: {e}\nRevisa 'error_log.txt'. Pulsa Enter para salir.")