{"id":21916172,"url":"https://github.com/youngermaster/coulomb-superposition-principle","last_synced_at":"2026-05-18T04:32:58.858Z","repository":{"id":260856946,"uuid":"882541845","full_name":"Youngermaster/Coulomb-Superposition-Principle","owner":"Youngermaster","description":"Principio de Superposición de Coulomb y Ley de Biot-Savart","archived":false,"fork":false,"pushed_at":"2024-11-06T14:36:11.000Z","size":601,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-27T09:28:00.819Z","etag":null,"topics":["coulomb-law","matplotlib","numpy","simulation"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Youngermaster.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-03T03:50:11.000Z","updated_at":"2024-11-06T14:36:14.000Z","dependencies_parsed_at":"2024-11-03T05:17:30.295Z","dependency_job_id":"3c5e5750-dee4-44ee-98e6-53b87980f657","html_url":"https://github.com/Youngermaster/Coulomb-Superposition-Principle","commit_stats":null,"previous_names":["youngermaster/coulomb-superposition-principle"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Youngermaster%2FCoulomb-Superposition-Principle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Youngermaster%2FCoulomb-Superposition-Principle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Youngermaster%2FCoulomb-Superposition-Principle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Youngermaster%2FCoulomb-Superposition-Principle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Youngermaster","download_url":"https://codeload.github.com/Youngermaster/Coulomb-Superposition-Principle/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244937224,"owners_count":20535120,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["coulomb-law","matplotlib","numpy","simulation"],"created_at":"2024-11-28T19:16:48.451Z","updated_at":"2025-10-05T18:01:58.906Z","avatar_url":"https://github.com/Youngermaster.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Principio de Superposición de Coulomb y Ley de Biot-Savart\n\nEste proyecto calcula y visualiza los campos eléctrico y magnético generados por una espira cuadrada situada en el plano YZ. Se consideran cargas puntuales distribuidas uniformemente a lo largo de la espira y una corriente eléctrica que fluye por ella. Los campos se calculan en puntos de una cuadrícula situada en el plano XZ, que atraviesa la mitad de la espira.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"600px\" src=\"assets/1.png\" alt=\"Espira cuadrada y plano XZ con cuadrícula\" /\u003e\n\u003c/p\u003e\n\n## Contenido\n\n- Instalación\n- Ejecución\n- Generación de archivos de datos\n- Visualización de los campos\n- Explicación detallada del código\n- main.py\n- graficar.py\n- Resultados esperados\n- Notas adicionales\n\n## Instalación\n\nPara ejecutar este proyecto, necesitas tener instalado Python 3 y las librerías listadas en requirements.txt.\n\n1.\tCrear un entorno virtual:\n```bash\npython3 -m venv venv\n```\n\n2.\tActivar el entorno virtual:\n\n```bash\n# En Unix o MacOS:\nsource ./venv/bin/activate\n\n# En Windows:\nvenv\\Scripts\\activate\n```\n\n3.\tInstalar las dependencias:\n\n```bash\npip install -r requirements.txt\n```\n\n## Ejecución\n\n### Generación de archivos de datos\n\nEjecuta main.py para calcular los campos eléctrico y magnético y guardar los resultados en archivos de texto:\n\n```bash\npython main.py\n```\n\nEste script generará dos archivos:\n\n- campo_electrico.txt: Contiene los valores del campo eléctrico en cada punto de la cuadrícula.\n- campo_magnetico.txt: Contiene los valores del campo magnético en cada punto de la cuadrícula.\n\n### Visualización de los campos\n\nEjecuta graficar.py para visualizar la espira, la cuadrícula y los campos:\n```bash\npython graficar.py\n```\n\nEsto abrirá una ventana con una gráfica interactiva que muestra:\n\n- La espira cuadrada en el plano YZ.\n- Los puntos de la cuadrícula en el plano XZ.\n- Los vectores del campo eléctrico (en negro).\n- Los vectores del campo magnético (en azul).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"400px\" src=\"assets/2.png\" alt=\"Visualización de los campos\" /\u003e\n  \u003cimg width=\"400px\" src=\"assets/3.png\" alt=\"Detalle de los vectores de campo\" /\u003e\n\u003c/p\u003e\n\n\n## Explicación detallada del código\n\nA continuación, se presenta una explicación detallada de los scripts main.py y graficar.py para facilitar su comprensión.\n\n### main.py\n\nEste script calcula los campos eléctrico y magnético en los puntos de una cuadrícula situada en el plano XZ, generados por una espira cuadrada situada en el plano YZ.\n\n#### Importación de librerías y definición de constantes\n\n```python\nimport numpy as np\n\n# Constantes físicas\n\nk = 8.988e9  # Constante de Coulomb (N·m²/C²)\nmu0 = 4 * np.pi * 1e-7  # Permeabilidad magnética del vacío (T·m/A)\n```\n\n- NumPy se utiliza para operaciones matemáticas y manejo de arrays.\n- k es la constante de Coulomb utilizada en el cálculo del campo eléctrico.\n- mu0 es la permeabilidad magnética del vacío, necesaria para calcular el campo magnético.\n\n#### Parámetros de la espira y de discretización\n\n```python\n# Parámetros de la espira y cargas\nq = 12e-9  # Carga de cada punto en la espira (12 nC)\nI = 4  # Corriente que circula por la espira (4 A)\nN_cargas_por_lado = 10  # Número de cargas puntuales por lado de la espira\nN_segmentos_por_lado = 10  # Número de segmentos por lado para calcular el campo magnético\nlado = 0.4  # Longitud de cada lado de la espira (metros)\nhalf_lado = lado / 2  # Mitad de la longitud del lado\n```\n\n- Se divide cada lado de la espira en cargas puntuales y segmentos para aproximar los campos.\n\n#### Generación de las posiciones de las cargas en la espira\n```python\n# Inicializamos la lista de posiciones de las cargas\ncargas_posiciones = []\n\n# Lado inferior (de (-0.2, -0.2) a (0.2, -0.2)) en el plano YZ\n# Se varia la coordenada Y y se mantiene Z constante\ny_inf = np.linspace(-half_lado, half_lado, N_cargas_por_lado, endpoint=False)\nz_inf = np.full(N_cargas_por_lado, -half_lado)\nfor y, z in zip(y_inf, z_inf):\n    cargas_posiciones.append([0, y, z])\n```\n\n- Se genera una lista de posiciones para las cargas en cada lado de la espira.\n- Las cargas se distribuyen uniformemente a lo largo de los lados.\n- La coordenada X es cero, ya que la espira está en el plano YZ.\n\nEl mismo procedimiento se repite para los otros tres lados (derecho, superior e izquierdo) de la espira.\n\n#### Conversión de la lista de cargas a un array NumPy\n\n```python\ncargas_posiciones = np.array(cargas_posiciones)\n```\n\n- Facilita las operaciones matemáticas posteriores.\n\n#### Generación de los segmentos de corriente para el cálculo del campo magnético\n\n```python\nsegmentos_posiciones = []\n\n# Lado inferior\ny_inf_seg = np.linspace(-half_lado, half_lado, N_segmentos_por_lado + 1)\nz_inf_seg = np.full(N_segmentos_por_lado + 1, -half_lado)\nfor i in range(N_segmentos_por_lado):\n    inicio = np.array([0, y_inf_seg[i], z_inf_seg[i]])\n    fin = np.array([0, y_inf_seg[i+1], z_inf_seg[i+1]])\n    segmentos_posiciones.append((inicio, fin))\n```\n\n- Se crean segmentos entre puntos consecutivos para aproximar la espira continua.\n- Cada segmento se define por su punto inicial y final.\n\nEste proceso se repite para los otros tres lados de la espira.\n\n#### Generación de la cuadrícula de puntos en el plano XZ\n\n```python\ngrid_size = 11  # Número de puntos en cada eje de la cuadrícula\nx_grid = np.linspace(-1, 1, grid_size)\nz_grid = np.linspace(-1, 1, grid_size)\nX, Z = np.meshgrid(x_grid, z_grid)\nY = np.zeros_like(X)  # Coordenada Y es cero para el plano XZ\n```\n\n- Se crea una malla de puntos en el plano XZ donde se calcularán los campos.\n\n#### Cálculo y almacenamiento del campo eléctrico\n\n```python\nwith open('campo_electrico.txt', 'w') as file_e:\n    for i in range(grid_size):\n        for j in range(grid_size):\n            punto = np.array([X[i, j], Y[i, j], Z[i, j]])\n            campo_total = np.zeros(3)\n            for carga_pos in cargas_posiciones:\n                r_vector = punto - carga_pos\n                r_mag = np.linalg.norm(r_vector)\n                if r_mag == 0:\n                    continue  # Evitamos división por cero\n                r_hat = r_vector / r_mag\n                campo = (k * q / r_mag**2) * r_hat\n                campo_total += campo\n            file_e.write(f\"Punto ({X[i,j]:.2f}, {Y[i,j]:.2f}, {Z[i,j]:.2f}): \"\n                         f\"Campo Eléctrico = ({campo_total[0]:.2e}, {campo_total[1]:.2e}, {campo_total[2]:.2e})\\n\")\n```\n\n- Para cada punto de la cuadrícula, se calcula el campo eléctrico total sumando las contribuciones de cada carga puntual utilizando la ley de Coulomb.\n- Los resultados se guardan en campo_electrico.txt.\n\n#### Cálculo y almacenamiento del campo magnético\n\n```python\nwith open('campo_magnetico.txt', 'w') as file_b:\n    for i in range(grid_size):\n        for j in range(grid_size):\n            punto = np.array([X[i, j], Y[i, j], Z[i, j]])\n            campo_total = np.zeros(3)\n            for segmento in segmentos_posiciones:\n                r0 = segmento[0]\n                r1 = segmento[1]\n                dl = r1 - r0\n                r = punto - r0\n                r_mag = np.linalg.norm(r)\n                if r_mag == 0:\n                    continue\n                dB = (mu0 * I / (4 * np.pi)) * np.cross(dl, r) / r_mag**3\n                campo_total += dB\n            file_b.write(f\"Punto ({X[i,j]:.2f}, {Y[i,j]:.2f}, {Z[i,j]:.2f}): \"\n                         f\"Campo Magnético = ({campo_total[0]:.2e}, {campo_total[1]:.2e}, {campo_total[2]:.2e})\\n\")\n```\n\n- Se utiliza la ley de Biot-Savart para calcular el campo magnético en cada punto de la cuadrícula.\n- Las contribuciones de cada segmento de corriente se suman para obtener el campo total.\n- Los resultados se guardan en campo_magnetico.txt.\n\n#### Mensajes informativos\n\n```python\nprint(\"El cálculo del campo eléctrico ha finalizado y los resultados se han guardado en 'campo_electrico.txt'.\")\nprint(\"El cálculo del campo magnético ha finalizado y los resultados se han guardado en 'campo_magnetico.txt'.\")\n```\n\n- Indican que los cálculos han concluido y dónde se encuentran los resultados.\n\n### graficar.py\n\nEste script visualiza la espira cuadrada, los puntos de la cuadrícula y los campos eléctrico y magnético.\n\n### Importación de librerías y definición de constantes\n\n```python\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom mpl_toolkits.mplot3d import Axes3D\nfrom matplotlib.lines import Line2D\n\n# Constantes físicas (idénticas a las de main.py)\nk = 8.988e9\nmu0 = 4 * np.pi * 1e-7\n```\n\nParámetros y generación de la espira y la cuadrícula\n\n- Los parámetros y la generación de la espira y la cuadrícula son idénticos a los de main.py, asegurando coherencia entre los cálculos y la visualización.\n\n#### Visualización de la espira y la cuadrícula\n\n```python\nfig = plt.figure(figsize=(10, 8))\nax = fig.add_subplot(111, projection='3d')\n\n# Graficamos las cargas en la espira cuadrada\nax.scatter(cargas_x, cargas_z, cargas_y, color='red', label='Cargas en la espira')\n\n# Graficamos los segmentos de la espira\nfor segmento in segmentos_posiciones:\n    xs = [inicio[0], fin[0]]\n    zs = [inicio[2], fin[2]]  # Intercambio para ajustar ejes\n    ys = [inicio[1], fin[1]]\n    ax.plot(xs, zs, ys, color='blue')\n\n# Graficamos la cuadrícula en el plano XZ\nax.scatter(X, Z, Y, color='green', s=20, alpha=0.5, label='Puntos de la cuadrícula')\n```\n\n- Se intercambian las coordenadas Y y Z al graficar para que el eje vertical sea Y.\n- La espira se representa con líneas azules y las cargas con puntos rojos.\n- Los puntos de la cuadrícula se muestran en verde.\n\n#### Configuración de la gráfica\n\n```python\nax.set_xlabel('X (m)')\nax.set_ylabel('Z (m)')\nax.set_zlabel('Y (m)')\nax.set_xlim([-1, 1])\nax.set_ylim([-1, 1])\nax.set_zlim([-1, 1])\nax.view_init(elev=0, azim=-90)\n```\n\n- Se ajustan las etiquetas y límites de los ejes para una mejor visualización.\n- ax.view_init ajusta el ángulo de la cámara.\n\n#### Cálculo y visualización del campo eléctrico\n\n```python\n# Cálculo del campo eléctrico (idéntico al de main.py)\n...\n\n# Normalización y graficación de los vectores del campo eléctrico\nE_magnitude = np.linalg.norm(E_total, axis=2)\nE_magnitude[E_magnitude == 0] = 1e-20\nE_normalized = E_total / E_magnitude[:, :, np.newaxis]\n\n# Graficamos los vectores del campo eléctrico\nE_quiver = ax.quiver(X[skip], Z[skip], Y[skip],\n                     E_normalized[skip][:, :, 0], E_normalized[skip][:, :, 2], E_normalized[skip][:, :, 1],\n                     length=0.1, color='black', normalize=True)\n```\n\n- Se calcula el campo eléctrico en los puntos de la cuadrícula.\n- Los vectores se normalizan para una visualización consistente.\n- Se utiliza ax.quiver para graficar los vectores.\n\n#### Cálculo y visualización del campo magnético\n\n```python\n# Cálculo del campo magnético (idéntico al de main.py)\n# ...\n\n# Normalización y graficación de los vectores del campo magnético\nB_magnitude = np.linalg.norm(B_total, axis=2)\nB_magnitude[B_magnitude == 0] = 1e-20\nB_normalized = B_total / B_magnitude[:, :, np.newaxis]\n\n# Graficamos los vectores del campo magnético\nB_quiver = ax.quiver(X[skip], Z[skip], Y[skip],\n                     B_normalized[skip][:, :, 0], B_normalized[skip][:, :, 2], B_normalized[skip][:, :, 1],\n                     length=0.1, color='blue', normalize=True)\n```\n\n- Se calcula y grafica el campo magnético de manera similar al campo eléctrico.\n- Los vectores del campo magnético se muestran en azul.\n\n#### Añadir leyenda y mostrar la gráfica\n\n```python\n# Definición de los elementos de la leyenda\nlegend_elements = [\n    Line2D([0], [0], marker='o', color='w', label='Cargas en la espira',\n           markerfacecolor='red', markersize=5),\n    Line2D([0], [0], color='blue', lw=2, label='Espira cuadrada'),\n    Line2D([0], [0], marker='o', color='w', label='Puntos de la cuadrícula',\n           markerfacecolor='green', markersize=5),\n    Line2D([0], [0], color='black', lw=0, marker='^', markersize=10, markerfacecolor='black', label='Campo Eléctrico'),\n    Line2D([0], [0], color='blue', lw=0, marker='^', markersize=10, markerfacecolor='blue', label='Campo Magnético')\n]\nax.legend(handles=legend_elements)\n\nax.set_title('Espira cuadrada en YZ y plano XZ con cuadrícula')\n\nplt.show()\n```\n\n- Se crea una leyenda personalizada para identificar cada elemento en la gráfica.\n- Se muestra la gráfica interactiva al usuario.\n\nResultados esperados\n\nAl ejecutar los scripts, se obtendrán:\n\n\t1.\tArchivos de texto con los campos calculados:\n- campo_electrico.txt: Contiene el campo eléctrico en cada punto de la cuadrícula.\n- campo_magnetico.txt: Contiene el campo magnético en cada punto de la cuadrícula.\n\t2.\tGráfica interactiva:\n- Muestra la espira cuadrada en el plano YZ.\n- Los puntos de la cuadrícula en el plano XZ.\n- Vectores del campo eléctrico (negro) y magnético (azul) en los puntos de la cuadrícula.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg width=\"600px\" src=\"assets/2.png\" alt=\"Visualización completa de los campos\" /\u003e\n\u003c/p\u003e\n\n## Notas adicionales\n\n### Personalización:\n\n- Puedes ajustar los parámetros N_cargas_por_lado y N_segmentos_por_lado para cambiar la precisión de los cálculos. Ten en cuenta que aumentarlos incrementará el tiempo de ejecución.\n- Los límites de los ejes y el ángulo de visualización (ax.view_init) pueden modificarse para mejorar la visualización según tus necesidades.\n\n### Interpretación de los campos:\n\n- Observa cómo los vectores del campo eléctrico y magnético se orientan en relación con la posición de la espira y la dirección de la corriente.\n- Esto puede ser útil para entender conceptos de electromagnetismo como la ley de Biot-Savart y el principio de superposición.\n\n### Extensiones posibles:\n\n- Implementar animaciones para visualizar cómo cambian los campos al modificar parámetros.\n- Añadir opciones para cambiar el sentido de la corriente o la distribución de cargas.\n\n### Requisitos del sistema:\n\n- Asegúrate de tener suficiente memoria y potencia de procesamiento si decides aumentar significativamente el número de puntos en la cuadrícula o la discretización de la espira.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungermaster%2Fcoulomb-superposition-principle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoungermaster%2Fcoulomb-superposition-principle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungermaster%2Fcoulomb-superposition-principle/lists"}