目录

1. 前言

NeoAtlantis应用科学和神秘学实验室根据一次神秘学研究,得知使用磁铁构成的莫比乌斯环可能具有 某些特殊的力学特性[*]。 根据提示,这种莫比乌斯环可以使用强力的永久磁铁构成,其中两个环分别安装在轮状的支撑结构上。 现在试图研究其中一个环对另一个环施加的力,尤其是对轮轴的力矩。

[*] 关于这一点,本文不会详细描述,如果您看完本文有何猜想,或者想进一步了解,请和作者联系

2. 研究方法

2.1 莫比乌斯环的数学模型

将一张纸条的一端扭转180度,然后与纸条的另一端粘贴在一起,可以构成一个莫比乌斯环。 这样的莫比乌斯环只有一个平面,也只有一条边。

但作为数学模型,有一种更为“干净”的办法定义:考虑在 X-Y 平面上有一条半径 R,它绕着轴 Z 旋转(蓝色)。 在半径R的另一端有一条线段 r(红色),位于 R 和 Z 轴所构成的平面内,并绕 R 的端点旋转,其转速,是R的一半。

Mobius-band

这样,α的角度(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两种。 因为使用了点状的简化模型,在工程计算上比较方便,其磁感线也很接近实际情况(至少在磁铁外面是这样的)。

Gilbert Model

(上图:安培电流模型,下图:吉尔伯特磁荷模型)

为了简化计算,我们忽略公式中的常数,假设两个磁荷的相互作用力遵从平方反比定律:

\[ 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处。

Magnets

使用 VPython,可以根据如上描述展示这样构成的两个圆环(红色为N磁荷,蓝色为S磁荷)。

3.2 莫比乌斯环之间的相互作用力

我们假设左侧的莫比乌斯环固定不动,现在需要研究它对右侧圆环的作用力。

为了研究作用力,我们将右侧圆环从0度旋转360度,然后将左侧圆环中的48个磁荷与右侧圆环中的48个磁荷分别进行相互作用计算,得到48x48个作用力。

将这些作用力对右侧圆环的圆心求出力矩,提取在Z轴上的分量,求和,得到合力矩。对这一力矩积分,就可以得到右侧圆环旋转一周受左侧环中磁铁影响所接受的功。

M

注意到,即使左侧莫比乌斯环不动,右侧环旋转一圈所受到的力矩,总是具有相同的符号,并且旋转一周所得积分不为零。 因此,这是否是真实情况下可以实现的结果,有待进一步研究。 然而需要指出,虽然磁铁的吉尔伯特模型有诸多不足——因为自然界实际上不存在磁单极子——但如果将上述结果应用于电荷,则是没有模型问题的。如果计算没有出现错误,这意味着什么呢?

附录 - 计算程序

本文所用的计算程序包括两个文件:simplified_magnet.pymodel.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)