Diese Datei stammt aus Wikimedia Commons und kann von anderen Projekten verwendet werden. Die Beschreibung von deren Dateibeschreibungsseite wird unten angezeigt.
English: Pointings of magnetic compasses around a cylindrical ringmagnet. The direction of each compass needle is computed with the exact formula, given in the source code. The magnet consists of a flat cylinder of R/L=2 with a cylindrical hole of radius r/R=1/2 and is homogeneously magnetized along the cylinder axis. The north-half of the magnet is painted red, whereas the south-half is green.
#!/usr/bin/python3# -*- coding: utf8 -*-try:importsvgwriteexceptImportError:print('requires svgwrite library: https://pypi.org/project/svgwrite/')# documentation at https://svgwrite.readthedocs.io/exit(1)importnumpyasnpfromscipy.integrateimportsolve_ivpfromscipy.optimizeimportminimizefrommathimport*name='Ringmagnet_compasses'size=600,600R1=100R2=200-1e-6L=100needles_d=40.needle_w=6.needle_l=16.needle_c=2.5defcel(kc,p,a,b):""" Bulirsch complete elliptic integral """ifkc==0.:returnnantol=1e-9# actual relative error will be tol**2k=kc=fabs(kc)m=1.ifp>0.:p=sqrt(p)b/=pelse:f=kc*kcg=1.-pq=(1.-f)*(b-a*p)f-=pp=sqrt(f/g)a=(a-b)/gb=a*p-q/(g*g*p)foriinrange(11):f=aa+=b/pg=k/pb=2.*(b+f*g)p+=gg=mm+=kciffabs(g-kc)<=g*tol:breakkc=2.*sqrt(k)k=kc*mreturnpi*.5*(a*m+b)/(m*(m+p))defBfield_barmagnet(xy,R,L,M):# www.doi.org/10.1119/1.3256157rho,z=xyrho0=1.ifrho<0.:rho=-rhorho0=-1.Rm,Rp=R-rho,R+rhozm,zp=z-L/2,z+L/2Rmzm=hypot(Rm,zm)Rmzp=hypot(Rm,zp)Rpzm=hypot(Rp,zm)Rpzp=hypot(Rp,zp)g=Rm/Rpkm=Rmzm/Rpzmkp=Rmzp/RpzpFrhom=cel(km,1.,1.,-1.)/RpzmFrhop=cel(kp,1.,1.,-1.)/RpzpFzm=cel(km,g*g,1.,g)*zm/RpzmFzp=cel(kp,g*g,1.,g)*zp/RpzpreturnM*R/pi*np.array((rho0*(Frhop-Frhom),(Fzp-Fzm)/Rp))defBfield(xy):returnBfield_barmagnet(xy,R2,L,1.)-Bfield_barmagnet(xy,R1,L,1.)# draw the magnetdoc=svgwrite.Drawing(name+'.svg',profile='full',size=size)doc.set_desc(name,'https://commons.wikimedia.org/wiki/File:'+name+'.svg\nrights: Creative Commons Attribution ShareAlike license')clip=doc.defs.add(doc.clipPath(id='image_clip'))clip.add(doc.rect(insert=(-size[0]/2.,-size[1]/2.),size=size))doc.add(doc.rect(id='background',insert=(0,0),size=size,fill='#ffffff',stroke='none'))g=doc.add(doc.g(id='image',clip_path='url(#image_clip)',transform='translate({:.0f}, {:.0f}) scale(1,-1)'.format(size[0]/2.,size[1]/2.)))needle=doc.defs.add(doc.g(id='needle'))needle.add(doc.path(d='M {:.3f},{:.3f} L {:.3f},{:.3f} L {:.3f},{:.3f} L {:.3f},{:.3f} Z'.format(-needle_w,0,0,needle_l,needle_w,0,0,-needle_l),fill='#00cc00',stroke='none'))needle.add(doc.path(d='M {:.3f},{:.3f} L {:.3f},{:.3f} L {:.3f},{:.3f} Z'.format(-needle_w,0,0,needle_l,needle_w,0),fill='#ff0000',stroke='none'))needle.add(doc.path(d='M {:.3f},{:.3f} L {:.3f},{:.3f} L {:.3f},{:.3f} L {:.3f},{:.3f} Z'.format(-needle_w,0,0,needle_l,needle_w,0,0,-needle_l),fill='none',stroke='#000000',stroke_width=2,stroke_linejoin='miter',stroke_miterlimit=10))needle.add(doc.circle(center=(0,0),r='{:.3f}'.format(needle_c),fill='#ffffff',stroke='#000000',stroke_width=2))magnet_back=g.add(doc.g(id='magnet_back'))needles=g.add(doc.g(id='needles'))magnet_front=g.add(doc.g(id='magnet_front'))mgrad=doc.defs.add(doc.linearGradient(id="magnetGrad",start=(0,0),end=(1,0),gradientUnits="objectBoundingBox"))forc,of,opin[['#000000','0','0.33'],['#ffffff','0.4','0.2'],['#ffffff','0.75','0.5'],['#ffffff','0.93','0.125'],['#000000','1','0.125']]:mgrad.add_stop_color(of,c,op)forx0,x1,isbgin[[-R2,-R1,False],[-R1,R1,True],[R1,R2,False]]:ifisbg:magnet=magnet_backfill='url(#magnetGrad)'colors=['#00cc00','#ff0000']else:magnet=magnet_frontfill='none'colors=['#49da49','#ff4949']foriin[0,1]:magnet.add(doc.rect(insert=(x0,[-L/2,0][i]),size=(x1-x0,[L,L/2][i]),fill=colors[i],stroke='none'))magnet.add(doc.rect(insert=(x0,-L/2),size=(x1-x0,L),fill=fill,stroke='#000000',stroke_width=4,stroke_linejoin='miter'))needles_nx=round(size[0]/needles_d)needles_ny=round(size[1]/needles_d)needles_x=(np.arange(needles_nx)+0.5)*needles_d-size[0]/2.needles_y=(np.arange(needles_ny)+0.5)*needles_d-size[1]/2.foryinneedles_y:forxinneedles_x:B=Bfield([x,y])direction=atan2(B[1],B[0])needles.add(doc.use(href='#needle',insert=(0,0),transform='translate({:.3f},{:.3f}) rotate({:.2f})'.format(x,y,degrees(direction-pi/2))))doc.save(pretty=True)
Lizenz
Ich, der Urheber dieses Werkes, veröffentliche es unter der folgenden Lizenz:
verbreitet werden – vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden
neu zusammengestellt werden – abgewandelt und bearbeitet werden
Zu den folgenden Bedingungen:
Namensnennung – Du musst angemessene Urheber- und Rechteangaben machen, einen Link zur Lizenz beifügen und angeben, ob Änderungen vorgenommen wurden. Diese Angaben dürfen in jeder angemessenen Art und Weise gemacht werden, allerdings nicht so, dass der Eindruck entsteht, der Lizenzgeber unterstütze gerade dich oder deine Nutzung besonders.
Diese Datei enthält weitere Informationen, die in der Regel von der Digitalkamera oder dem verwendeten Scanner stammen. Durch nachträgliche Bearbeitung der Originaldatei können einige Details verändert worden sein.