Vielleich gibt es ja irgendwann einmal für Python einen Compiler der Maschinencode erzeugt. Dann wäre das Problem weg.
Zur Visualisierung der beteiligten Vektoren müssen eigentlich nur noch die Grafikausgaben in die Iterationsschleifen eingefügt werden. In Python besonders einfach, weil die Grafikelemente von Haus aus schon über Verktoren beschrieben werden. Allerdings stellt VPython nur Pfeile mit eckigem Schaft zur Verfügung. Eine Klasse für Ausgabe von Pfeilen mit rundem Schaft lässt sich aber leicht realiieren.
Code: Alles auswählen
#g_2s_rot_vpy.py
from vpython import *
import time
muo = 4.0*pi*1.0e-7
steps = 40 # integration steps Rotor
stepsR = 8 # integration steps Shleife
r1=0.021 # outer radius rotor #1
r2=0.030 # outer radius rotor #2
Spalt=0.004 # gap between rotors
phi0=-5 # angle shift between rotors
I1=880 # current in loop #1
I2=880 # current in loop #2 (3)
R1=0.005 # radius loop #1
R2=0.005 # radius loop #2 muo = 4.0*pi*1.0e-7
scene = canvas()
scene.width = 1100
scene.height = 500
scene.background = color.gray(0.7)
kposx=0.0194786
kposy=-0.07*4
kposz=0.0265079
scene.autoscale = False
scene.camera.pos=vector(kposx,kposy,kposz);
scene.camera.axis=vector(kposx/100,-kposy,-kposz);
scene.range=r1+r2
beleuchtung=distant_light(direction=scene.camera.pos,color=color.gray(0.8))
Mphi1=[ 0 for x in range(steps) ]
Mphi2=[ 0 for x in range(steps) ]
Mphi=[ 0 for x in range(steps) ]
IMphi=[ 0 for x in range(steps) ]
def DummyFun(c):
return
reset=False
def ResetFun(c):
global reset
reset=True
return
stop=True
def StopFun(c):
global stop
if stop:
stop=False
c.text='Stop'
else:
stop=True
c.text='Start'
return
grate=5
def setspeed(s):
global grate
grate = s.value
#scene.caption('\n')
scene.append_to_caption('\n')
scene.append_to_caption('\n')
sp=button(bind=ResetFun, text=' Reset ')
scene.append_to_caption(' ')
st=button(bind=StopFun, text='Start')
scene.append_to_caption('\n')
scene.append_to_caption('\n')
scene.append_to_caption("Speed:")
slider(min=1, max=50, value=grate, length=350, bind=setspeed)
scene.append_to_caption('\n')
bt_Pdl2 = radio(bind=DummyFun, checked=True, text='Pdl2 ')
scene.append_to_caption('\t\t')
bt_Pdl1 = radio(bind=DummyFun, checked=True, text='Pdl1 ')
scene.append_to_caption('\n')
bt_dl2 = radio(bind=DummyFun, checked=True, text=' dl2 ')
scene.append_to_caption('\t\t')
bt_dl1 = radio(bind=DummyFun, checked=True, text=' dl1 ')
scene.append_to_caption('\n')
bt_rd2 = radio(bind=DummyFun, checked=True, text=' rd2 ')
scene.append_to_caption('\t\t')
bt_rd1 = radio(bind=DummyFun, checked=True, text=' rd1 ')
scene.append_to_caption('\n')
vradius=0.0002
"""
def rotateY(v, a):
return rotate(v,angle=-a,axis=vector(0,1,0))
"""
def Skalarmultiplikation(v,f):
return vector(v.x*f,v.y*f,v.z*f)
def Flussdichte_B1(Pb1,phi2): #Biot Savart Flussdichte B1 verursacht durch S2
gPdl2=None
gdl2=None
grd1=None
gdl2_list = []
H=vector(0,0,0)
dphidl2=2.0*pi/stepsR
Pdl2=vector(r2,R2,0) #(1) S2 linke Schleife
Pdl2=rotate(Pdl2,-phi2,vector(0,1,0))
n=1
while n <= stepsR and not reset:#bis einschl Pdlp_nplus1 == 2*pi
while stop and not reset: continue
gPdl2=gdraw(gPdl2,vector(0,0,0),Pdl2,color.red,vradius,bt_Pdl2.checked)
phidl2=n*dphidl2 # links herum
Pdl2_nplus1=vector(r2,R2*cos(phidl2),R2*sin(phidl2)) #(1) S2 linke Schleife
Pdl2_nplus1=rotate(Pdl2_nplus1,-phi2,vector(0,1,0))
dl2=Pdl2_nplus1-Pdl2 #(2)
gdl2 =gadd(gdl2,gdl2_list,Pdl2,dl2,color.red,vradius,bt_dl2.checked)
rd1=Pdl2-Pb1 #(12)
grd1 = gdraw(grd1,Pb1,rd1,color.blue,vradius,bt_rd1.checked)
abst=rd1.mag
dH=Skalarmultiplikation(cross(dl2,rd1),1.0/(abst*abst*abst))#()
H=H+dH
Pdl2=Pdl2_nplus1
rate(grate)
n+=1
gdel(gPdl2)
glist_del(gdl2_list)
gdel(grd1)
return Skalarmultiplikation(H,I2*muo/(4.0*pi)) #(5)
def dphi_rotieren_S1(phi2,phi1,n_): # Rotor-Teildrehung dphi
gPdl1=None
gdl1=None
grd2=None
gdl1_list = []
Mphi1[n_]=0 #(14)
Fs=vector(0,0,0)
dphidl1=2.0*pi/stepsR
Pdl1=vector(-r1,R1,0) # (3) S1 rechte Schleife
Pdl1=rotate(Pdl1,-phi1,vector(0,1,0)) # ()
n=1
while n <= stepsR and not reset: #bis einschl Pdls_nplus1 == 2*pi
while stop and not reset: continue
gPdl1=gdraw(gPdl1,vector(r1+r2+Spalt,0,0),Pdl1,color.red,vradius,bt_Pdl1.checked)
phidl1=n*dphidl1 # links herum
Pdl1_nplus1=vector(-r1,R1*cos(phidl1),R1*sin(phidl1)) #(3) S1 rechte Schleife
Pdl1_nplus1=rotate(Pdl1_nplus1,-phi1,vector(0,1,0)) #um Phi rotieren
dl1=Pdl1_nplus1-Pdl1 #()
gdl1 =gadd(gdl1,gdl1_list,vector(r1+r2+Spalt,0,0)+Pdl1,dl1,color.red,vradius,bt_dl1.checked)
Pb1=vector(r1+r2+Spalt,0,0)+Pdl1 # (12)
B1=Flussdichte_B1(Pb1,phi2) # (11)
dFs1=Skalarmultiplikation(cross(dl1,B1),I1) #(13)
Fs=Fs+dFs1
Mphi1[n_]+=cross(Pdl1,dFs1).y #(14)
Pdl1=Pdl1_nplus1
rate(grate)
n+=1
gdel(gPdl1)
glist_del(gdl1_list)
return Fs
def Flussdichte_B2(Pb2,phi1): #Biot Savart Flussdichte B2 verursacht durch S1
gPdl1=None
gdl1=None
grd2=None
gdl1_list = []
H=vector(0,0,0)
dphidl1=2.0*pi/stepsR
Pdl1=vector(-r1,R1,0) # (3) S1 rechte Schleife
Pdl1=rotate(Pdl1,-phi1,vector(0,1,0))
n=1
while n <= stepsR and not reset:#bis einschl Pdlp_nplus1 == 2*pi
while stop and not reset: continue
gPdl1=gdraw(gPdl1,vector(r1+r2+Spalt,0,0),Pdl1,color.red,vradius,bt_Pdl1.checked)
phidl1=n*dphidl1 # links herum
Pdl1_nplus1=vector(-r1,R1*cos(phidl1),R1*sin(phidl1)) #(3) S1 rechte Schleife
Pdl1_nplus1=rotate(Pdl1_nplus1,-phi1,vector(0,1,0))
dl1=Pdl1_nplus1-Pdl1 #(4)
gdl1 =gadd(gdl1,gdl1_list,vector(r1+r2+Spalt,0,0)+Pdl1,dl1,color.red,vradius,bt_dl1.checked)
rd2=Pb2+Pdl1 #(6)
grd2 = gdraw(grd2,vector(r1+r2+Spalt,0,0)-Pb2,rd2,color.blue,vradius,bt_rd2.checked)
abst=rd2.mag
dH=Skalarmultiplikation(cross(dl1,rd2),1.0/(abst*abst*abst))#(5)
H=H+dH
Pdl1=Pdl1=Pdl1_nplus1
rate(grate)
n+=1
gdel(gPdl1)
glist_del(gdl1_list)
gdel(grd2)
return Skalarmultiplikation(H,I1*muo/(4.0*pi)) #(5)
def dphi_rotieren_S2(phi2,phi1,n_): # Rotor-Teildrehung dphi
gFs=None
gPdl2=None
gdl2=None
gdl2_list = []
Mphi2[n_]=0 #(14)
Fs=vector(0,0,0)
dphidl2=2.0*pi/stepsR
Pdl2=vector(r2,R2,0) # (1) S2 linke Schleife
Pdl2=rotate(Pdl2,-phi2,vector(0,1,0))
n=1
while n <= stepsR and not reset: #bis einschl Pdlp_nplus1 == 2*pi
while stop and not reset: continue
gPdl2=gdraw(gPdl2,vector(0,0,0),Pdl2,color.red,vradius,bt_Pdl2.checked)
phidl2=n*dphidl2 # links herum
Pdl2_nplus1=vector(r2,R2*cos(phidl2),R2*sin(phidl2)) #(1) S2 linke Schleife
Pdl2_nplus1=rotate(Pdl2_nplus1,-phi2,vector(0,1,0)) #um Phi rotieren
dl2=Pdl2_nplus1-Pdl2
gdl2 =gadd(gdl2,gdl2_list,Pdl2,dl2,color.red,vradius,bt_dl2.checked)
Pb2=vector(r1+r2+Spalt,0,0)-Pdl2 # (6)
B2=Flussdichte_B2(Pb2,phi1) # (5)
dFs2=Skalarmultiplikation(cross(dl2,B2),I2)#(9)
Fs=Fs+dFs2
Mphi2[n_]+=cross(Pdl2,dFs2).y#(10)
Pdl2=Pdl2_nplus1
rate(grate)
n+=1
gdel(gPdl2)
glist_del(gdl2_list)
return Fs
def glist_del(lst):
for element in lst:
gdel(element)
class r_arrow:
co=None
cy=None
slen=1;
radius=1
def __init__(self,p,ax,c,r):
slen=10*r;
l=ax.mag-slen;
if l > 0:
self.cy = cylinder(pos=p,axis=ax,color=c,radius=r)
self.cy.length=self.cy.length-slen
self.co=cone(pos=p+self.cy.axis,axis=ax,color=c,radius=2*r)
self.co.length=slen
else:
self.co=None
self.co=cone(pos=p,axis=ax,color=c,radius=2*r)
self.co.length=slen
self.radius=r
def set_rc(self,r,c):
self.cy.radius=r
self.co.radius=2*r
self.cy.color=c
self.co.color=c
def __del__(self):
self.cy.visible = False
del self.cy
self.co.visible = False
del self.co
def gadd(old,lst,p,ax,c,sw,on):
if on:
if old !=None:
old.set_rc(old.radius/2,color.gray(0.4))
old.color=color.gray(0.5)
gobj = r_arrow(p,ax,c,sw)
lst.append(gobj)
return gobj
def gdraw(gobj,p,ax,c,sw,on):
if gobj !=None:
gdel(gobj)
if on:
gobj = r_arrow(p,ax,c,sw)
return gobj
def gdel(gobj):
if gobj !=None:
gobj.visible = False
del gobj
return None
xyz=r1/2
rko=0.0005
x_achse = r_arrow(vector(0,0,0),vector(xyz,0,0),color.yellow,rko)
y_achse = r_arrow(vector(0,0,0),vector(0,xyz,0),color.green,rko)
z_achse = r_arrow(vector(0,0,0),vector(0,0,xyz),color.blue,rko)
camax=None;
campos=None;
dphi=2.0*pi/steps
n=0
while True:
rate(grate)
if reset:
n=0
reset=False
phi2=n*dphi
phi1=-n*dphi+phi0/360.0*2.0*pi
if phi2 < pi/2:
scene.camera.axis=vector(kposx/100,-kposy,-kposz);
scene.camera.pos=vector(kposx+0.01,kposy,kposz+0.013)
scene.range=r1*0.9
elif phi2 < 2*pi-pi/2:
scene.camera.axis=vector(kposx/100,-kposy,-kposz);
scene.camera.pos=vector(kposx,kposy,kposz)
scene.range=r1*1.7
else:
scene.camera.axis=vector(kposx/100,-kposy,-kposz);
scene.camera.pos=vector(kposx,kposy,kposz-0.013)
scene.range=r1*0.9
if not reset:
dphi_rotieren_S2(phi2,phi1,n)
if not reset:
dphi_rotieren_S1(phi2,phi1,n)
scene.autoscale = False
n+=1
if n >= steps: n=0
Bei der Gelegenheit habe ich mich noch umgeschaut wo man seine Videos noch so ablegen kann. Bei YouTube hatte ich schon zweimal Datentotalverlust, weil die mir ohne sinnvolle Begründung und ohne jegliche nachvollziehare Gründe die
haben. Nur meine Daten haben sie behalten. Einschließlich der
. Bei
kann man auch über eine e-mail Adresse eine uploadfähige Kennung bekommen. Ohne Telefonnummer. Da ist eigentlich ziemlich optimal für Videos die in ein Forum eingebettet werden sollen. Das habe ich dann auch gleich ausprobiert.