目录
1. 前言
NeoAtlantis应用科学和神秘学实验室根据一次神秘学研究,得知使用磁铁构成的莫比乌斯环可能具有 某些特殊的力学特性[*]。 根据提示,这种莫比乌斯环可以使用强力的永久磁铁构成,其中两个环分别安装在轮状的支撑结构上。 现在试图研究其中一个环对另一个环施加的力,尤其是对轮轴的力矩。
[*] 关于这一点,本文不会详细描述,如果您看完本文有何猜想,或者想进一步了解,请和作者联系。
2. 研究方法
2.1 莫比乌斯环的数学模型
将一张纸条的一端扭转180度,然后与纸条的另一端粘贴在一起,可以构成一个莫比乌斯环。 这样的莫比乌斯环只有一个平面,也只有一条边。
但作为数学模型,有一种更为“干净”的办法定义:考虑在 X-Y 平面上有一条半径 R,它绕着轴 Z 旋转(蓝色)。 在半径R的另一端有一条线段 r(红色),位于 R 和 Z 轴所构成的平面内,并绕 R 的端点旋转,其转速,是R的一半。
这样,α的角度(R所旋转的角度)就始终是β(r所旋转的角度)的二倍。 R旋转一周360度,r旋转180度,返回初始位置,就构成了一个莫比乌斯环。
数学描述上,首先是Z的坐标:
\[ Z = R + r \textrm{sin}(\beta) = R + r \textrm{sin}(\frac{1}{2}\alpha) \]
X 和 Y 的坐标,可以由 R 与 r在XY平面上的投影 两部分之和分解得到:
\[ X = [R + r \textrm{cos}(\beta)]\textrm{cos}(\alpha) = [R + r \textrm{cos}(\frac{1}{2}\alpha)]\textrm{cos}(\alpha) \] \[ Y = [R + r \textrm{cos}(\beta)]\textrm{sin}(\alpha) = [R + r \textrm{cos}(\frac{1}{2}\alpha)]\textrm{sin}(\alpha) \]
2.2 磁铁相互作用的模型
空间中两个磁铁的相互作用力很复杂,关于这个话题有一个专门的维基百科进行介绍。
本研究中使用吉尔伯特模型简化磁铁的磁感线。这种模型假设磁铁由成对的“磁单极子”构成,类似电荷那样,有N和S两种。 因为使用了点状的简化模型,在工程计算上比较方便,其磁感线也很接近实际情况(至少在磁铁外面是这样的)。
(上图:安培电流模型,下图:吉尔伯特磁荷模型)
为了简化计算,我们忽略公式中的常数,假设两个磁荷的相互作用力遵从平方反比定律:
\[ F = \frac{q_1q_2}{r^2} \]
当\(q_1\)和\(q_2\)为同号时,相互排斥,反之相互吸引。
3 编程计算
3.1 安装了磁铁的莫比乌斯环
我们使用如下假设生成一个安装了磁铁的莫比乌斯环:
- 环的几何形状由上一章的公式指定
- 我们在一个圆周360度内,选取N=24个角度,将圆周均分,并根据公式得出莫比乌斯环的一个端点
- 在上述模型中,将 r 反向(180度),可以得到莫比乌斯环在每个截面上的另一个端点
- 这样的两个端点,分别是磁铁的N和S极,具有磁荷1和-1
计算中,假设两个莫比乌斯环的基础半径 R=25cm,磁铁长度 2r=10cm,其中左侧环位于(0,0,0)点,右侧环位于(0.7,0,0)点,即在右侧70cm处。
使用 VPython,可以根据如上描述展示这样构成的两个圆环(红色为N磁荷,蓝色为S磁荷)。
3.2 莫比乌斯环之间的相互作用力
我们假设左侧的莫比乌斯环固定不动,现在需要研究它对右侧圆环的作用力。
为了研究作用力,我们将右侧圆环从0度旋转360度,然后将左侧圆环中的48个磁荷与右侧圆环中的48个磁荷分别进行相互作用计算,得到48x48个作用力。
将这些作用力对右侧圆环的圆心求出力矩,提取在Z轴上的分量,求和,得到合力矩。对这一力矩积分,就可以得到右侧圆环旋转一周受左侧环中磁铁影响所接受的功。
注意到,即使左侧莫比乌斯环不动,右侧环旋转一圈所受到的力矩,总是具有相同的符号,并且旋转一周所得积分不为零。 因此,这是否是真实情况下可以实现的结果,有待进一步研究。 然而需要指出,虽然磁铁的吉尔伯特模型有诸多不足——因为自然界实际上不存在磁单极子——但如果将上述结果应用于电荷,则是没有模型问题的。如果计算没有出现错误,这意味着什么呢?
附录 - 计算程序
本文所用的计算程序包括两个文件:simplified_magnet.py
和 model.py
,运行后者可以开始计算。
simplified_magnet.py
#!/usr/bin/env python3
#from vpython import * # 如果想用下面class的visualize()方法,请启用
from math import *
from numpy import linspace, array
class SimpleMagnetMobiusStrip:
def __init__(self, center, radius, magnetRadius, offsetAngle=0, strength=1, rightHand=False):
self.center = center
self.centerX, self.centerY, self.centerZ = center
self.radius = radius
self.magnetRadius = magnetRadius
self.offsetAngle = offsetAngle
self.strength = 1
self.rightHand = rightHand
def __iter__(self):
N = 24
for angle in linspace(0, 2*pi, N):
theta = (angle + self.offsetAngle) / 2.0
if self.rightHand: theta = -theta
z1 = self.centerZ + sin(theta) * self.magnetRadius
z2 = self.centerZ - sin(theta) * self.magnetRadius
deltaR = cos(theta) * self.magnetRadius
R1 = self.radius + deltaR
R2 = self.radius - deltaR
x1 = self.centerX + cos(angle) * R1
y1 = self.centerY + sin(angle) * R1
x2 = self.centerX + cos(angle) * R2
y2 = self.centerY + sin(angle) * R2
yield (
array([x1, y1, z1, self.strength]),
array([x2, y2, z2, -self.strength])
)
def visualize(self):
iterator = self.__iter__()
a0, b0 = None, None
for a1, b1 in iterator:
sphere(pos=vector(*a1[:3]), radius=0.01, color=vector(0.5, 0, 0))
sphere(pos=vector(*b1[:3]), radius=0.01, color=vector(0, 0, 0.5))
curve(vector(*a1[:3]), vector(*b1[:3]))
model.py
#!/usr/bin/env python3
from math import pi
from simplified_magnet import *
from numpy.linalg import norm
from numpy import cross, array
s1 = SimpleMagnetMobiusStrip(
center=array([0, 0, 0]),
radius = 0.25,
magnetRadius=0.05,
offsetAngle=0,
strength=1
)
def force(point1, point2, s1, s2):
d = norm(point1-point2)
return s1 * s2 * (point2-point1) / (d**3)
def momentum(force, forcePoint, center):
r = forcePoint - center
return cross(r, force)
c = 0
intMZ = 0
N = 30
for offset in linspace(0, 2*pi, N):
s2 = SimpleMagnetMobiusStrip(
center=array([0.7, 0, 0]),
radius = 0.25,
magnetRadius=0.05,
offsetAngle=offset,
strength=1
)
M = array([0.0, 0.0, 0.0])
for a1, b1 in s1:
for a2, b2 in s2:
f1 = force(a1[:3], a2[:3], a1[3], a2[3])
f2 = force(a1[:3], b2[:3], a1[3], b2[3])
f3 = force(b1[:3], a2[:3], b1[3], a2[3])
f4 = force(b1[:3], b2[:3], b1[3], b2[3])
m1 = momentum(f1, a2[:3], s2.center)
m2 = momentum(f2, b2[:3], s2.center)
m3 = momentum(f3, a2[:3], s2.center)
m4 = momentum(f4, b2[:3], s2.center)
M += sum([m1, m2, m3, m4])
intMZ += M[2] * (2 * pi / N)
print("%3d" % (offset / pi * 180.0), " ", "%E" % M[2])
print(intMZ)