Handmatig het magnetisch veld uitrekenen gaat niet lukken. Je zou wel Magpylib in python kunnen gebruiken. Ik heb samen met chatgpt eens een simulatie gedaan.
--------------
Simulatie van een batterijtrein met permanente magneten en een koperen spoel
Het doel van deze simulatie is het onderzoeken van de elektromagnetische werking van een eenvoudige batterijtrein. Een batterijtrein bestaat uit een batterij met permanente magneten die door een koperen spoel beweegt. Door de interactie tussen de elektrische stroom in de spoel en het magnetische veld van de magneten ontstaat een Lorentzkracht die de beweging veroorzaakt.
De centrale vraag in deze simulatie is:
Welke elektromagnetische kracht ontstaat op de spoel door de interactie tussen de permanente magneten en de elektrische stroom?
Opstelling
De simulatie bestaat uit drie hoofdonderdelen:
- Twee cilindervormige neodymiummagneten.
- Een koperen spoel rond de magneten.
- Een numerieke berekening van het magnetische veld en de Lorentzkracht.
De permanente magneten worden gemodelleerd als cilindervormige neodymiummagneten van het type NdFeB N42. De gebruikte parameters zijn:
- Remanentie: \(B_r=1,25\,\mathrm{T}\).
- Diameter: \(10\,\mathrm{mm}\).
- Hoogte: \(5\,\mathrm{mm}\).
- Afstand tussen de middelpunten: \(14\,\mathrm{mm}\).
De magneten worden zo georiënteerd dat de noordpolen naar elkaar gericht zijn:
\[
S \rightarrow N \qquad N \rightarrow S
\]
Deze configuratie zorgt voor een sterk magnetisch veld in de omgeving van de spoel.
De koperen spoel wordt numeriek voorgesteld als een spiraalvormige geleider. De gebruikte parameters zijn:
- Straal van de spoel: \(7\,\mathrm{mm}\).
- Lengte van de spoel: \(50\,\mathrm{mm}\).
- Aantal windingen: \(20\).
- Elektrische stroom: \(I=2\,\mathrm{A}\).
De spoel wordt opgesplitst in kleine draadsegmenten. Elk segment wordt beschreven door een richtingsvector \(d\vec{l}\).
Numerieke methode
De berekeningen werden uitgevoerd met Python en de bibliotheek Magpylib 5.2.3.
Voor elk punt van de spoel wordt het magnetische veld berekend. Het totale magnetische veld is de som van de bijdragen van beide permanente magneten:
\[
\vec{B}_{tot}=\vec{B}_1+\vec{B}_2
\]
waarbij \(\vec{B}_1\) en \(\vec{B}_2\) de magnetische velden van de afzonderlijke magneten voorstellen.
De kracht op een klein draadsegment wordt berekend met de Lorentzkracht:
\[
d\vec{F}=I\,d\vec{l}\times\vec{B}
\]
Hierbij is \(I\) de stroom door de geleider, \(d\vec{l}\) de richting en lengte van het draadsegment en \(\vec{B}\) het lokale magnetische veld.
De totale kracht op de spoel wordt gevonden door alle bijdragen van de afzonderlijke draadsegmenten op te tellen:
\[
\vec{F}_{tot}=\sum_i I\,d\vec{l}_i\times\vec{B}_i
\]
Resultaten
De simulatie gaf de volgende krachtcomponenten:
\[
F_x=6,93\times10^{-19}\,\mathrm{N}
\]
\[
F_y=-1,07\times10^{-4}\,\mathrm{N}
\]
\[
F_z=1,406\times10^{-3}\,\mathrm{N}
\]
De grootte van de totale Lorentzkracht wordt berekend met:
\[
|\vec{F}|=\sqrt{F_x^2+F_y^2+F_z^2}
\]
De berekende waarde is:
\[
|\vec{F}|=1,41\times10^{-3}\,\mathrm{N}
\]
ofwel:
\[
\boxed{|\vec{F}|\approx1,4\,\mathrm{mN}}
\]
Interpretatie
De kracht is hoofdzakelijk gericht volgens de z-richting omdat:
\[
F_z \gg F_x,F_y
\]
De simulatie voorspelt dus voornamelijk een voorwaartse stuwkracht. De zeer kleine waarde van \(F_x\) betekent dat er vrijwel geen kracht in de laterale richting aanwezig is.
De kleine \(F_y\)-component ontstaat door numerieke effecten en door het feit dat de spoel als een eindig aantal draadsegmenten wordt voorgesteld.
De berekende kracht is relatief klein omdat het model een vereenvoudigde situatie beschrijft. Er wordt geen rekening gehouden met:
- De massa en traagheid van de batterijtrein.
- De wrijving tussen magneten en spoel.
- De elektrische weerstand van de contacten.
- De warmteontwikkeling in de geleider.
- De verandering van het magnetische veld tijdens de beweging.
Conclusie
Met behulp van een numerieke simulatie in Magpylib werd de elektromagnetische kracht op een batterijtreinmodel berekend.
De interactie tussen de elektrische stroom in de spoel en het magnetische veld van de permanente magneten wordt beschreven door de Lorentzkracht:
\[
\vec{F}=I\vec{L}\times\vec{B}
\]
Voor de gekozen parameters werd een totale kracht gevonden van:
\[
\boxed{|\vec{F}|=1,41\times10^{-3}\,\mathrm{N}}
\]
De simulatie bevestigt hiermee het werkingsprincipe van de batterijtrein: een elektrische stroom in een magnetisch veld veroorzaakt een mechanische kracht die de beweging mogelijk maakt.
Code: Selecteer alles
"""
Batterijtrein simulatie
=======================
Magpylib 5.2.3
- NdFeB magneten
- koperen spoel
- magnetisch veld
- Lorentzkracht
- 3D visualisatie
"""
import numpy as np
import matplotlib.pyplot as plt
import magpylib as magpy
# ============================================================
# PARAMETERS
# ============================================================
# Neodymium N42
Br = 1.25 # Tesla
# Magneten
diameter = 10e-3 # 10 mm
height = 5e-3 # 5 mm
distance = 14e-3 # afstand tussen middelpunten
# Spoel
coil_radius = 7e-3
coil_length = 50e-3
turns = 20
current = 2.0 # Ampere
# ============================================================
# MAGNETEN
# ============================================================
#
# Configuratie batterijtrein:
#
# S ---> N N <--- S
#
# Noordpolen naar elkaar
#
mag1 = magpy.magnet.Cylinder(
polarization=(0,0,-Br),
dimension=(diameter,height),
position=(0,0,-distance/2)
)
mag2 = magpy.magnet.Cylinder(
polarization=(0,0,Br),
dimension=(diameter,height),
position=(0,0,distance/2)
)
magnets = magpy.Collection(
mag1,
mag2
)
# ============================================================
# SPOEL GENEREREN
# ============================================================
def create_coil(radius,length,turns):
points=[]
samples=300
for z in np.linspace(
-length/2,
length/2,
turns
):
for theta in np.linspace(
0,
2*np.pi,
samples
):
x = radius*np.cos(theta)
y = radius*np.sin(theta)
points.append(
[x,y,z]
)
return np.array(points)
wire=create_coil(
coil_radius,
coil_length,
turns
)
# ============================================================
# LORENTZKRACHT
# ============================================================
dl=np.diff(
wire,
axis=0
)
Bwire=magnets.getB(
wire[:-1]
)
dF=current*np.cross(
dl,
Bwire
)
Ftotal=np.sum(
dF,
axis=0
)
print("============================")
print("Lorentzkracht")
print("============================")
print("Fx =",Ftotal[0],"N")
print("Fy =",Ftotal[1],"N")
print("Fz =",Ftotal[2],"N")
print(
"|F| =",
np.linalg.norm(Ftotal),
"N"
)
# ============================================================
# MAGNETISCH VELD ROOSTER
# ============================================================
nfield=15
x=np.linspace(
-20e-3,
20e-3,
nfield
)
y=np.linspace(
-20e-3,
20e-3,
nfield
)
z=np.linspace(
-35e-3,
35e-3,
nfield
)
X,Y,Z=np.meshgrid(
x,
y,
z
)
field_points=np.column_stack(
(
X.ravel(),
Y.ravel(),
Z.ravel()
)
)
BF=magnets.getB(
field_points
)
Bnorm=np.linalg.norm(
BF,
axis=1
)
# normaliseren voor pijlen
BF_unit=BF/Bnorm[:,None]
# ============================================================
# 3D FIGUUR
# ============================================================
fig=plt.figure(
figsize=(12,10)
)
ax=fig.add_subplot(
111,
projection="3d"
)
# ------------------------------------------------------------
# SPOEL
# ------------------------------------------------------------
ax.plot(
wire[:,0]*1000,
wire[:,1]*1000,
wire[:,2]*1000,
linewidth=2,
label="koper"
)
# ------------------------------------------------------------
# MAGNETEN
# ------------------------------------------------------------
def draw_cylinder(ax,zcenter):
theta=np.linspace(
0,
2*np.pi,
50
)
zz=np.linspace(
zcenter-height/2,
zcenter+height/2,
20
)
theta,zz=np.meshgrid(
theta,
zz
)
xx=(diameter/2)*np.cos(theta)
yy=(diameter/2)*np.sin(theta)
ax.plot_surface(
xx*1000,
yy*1000,
zz*1000,
alpha=0.5
)
draw_cylinder(
ax,
-distance/2
)
draw_cylinder(
ax,
distance/2
)
# ------------------------------------------------------------
# MAGNETISCH VELD
# ------------------------------------------------------------
ax.quiver(
field_points[:,0]*1000,
field_points[:,1]*1000,
field_points[:,2]*1000,
BF_unit[:,0],
BF_unit[:,1],
BF_unit[:,2],
length=3,
normalize=True,
alpha=0.5
)
# ------------------------------------------------------------
# KRACHT OP SPOEL
# ------------------------------------------------------------
step=50
scale=5000
ax.quiver(
wire[:-1:step,0]*1000,
wire[:-1:step,1]*1000,
wire[:-1:step,2]*1000,
dF[::step,0]*scale,
dF[::step,1]*scale,
dF[::step,2]*scale,
color=None
)
# ------------------------------------------------------------
# ASSEN
# ------------------------------------------------------------
ax.set_xlabel(
"x (mm)"
)
ax.set_ylabel(
"y (mm)"
)
ax.set_zlabel(
"z (mm)"
)
ax.set_title(
"Batterijtrein: magneten + spoel + B-veld + kracht"
)
ax.set_box_aspect(
[1,1,3]
)
plt.show()
# ============================================================
# 2D DOORSNEDE VAN DE SPOEL
# ============================================================
plt.figure(
figsize=(8,5)
)
plt.plot(
wire[:,2]*1000,
np.sqrt(
wire[:,0]**2+
wire[:,1]**2
)*1000
)
plt.xlabel(
"z (mm)"
)
plt.ylabel(
"radius (mm)"
)
plt.title(
"Doorsnede koperen spoel"
)
plt.grid()
plt.show()