智障。 - 电磁场
type: channel
link: http://www.dmcxe.com/index.php/tag/电磁场/
items: 单粒子在场中的运动（一）：一种粗糙的计算

单粒子在场中的运动（一）：一种粗糙的计算
type: item
date: 2022-08-27T13:38:00+00:00
description: 项目源起在亚布力的时候，偶然的一次滑水，在GitHub上找到了某个描述在某个感兴趣装置中的粒子运动模拟。欣喜之余仔细阅读了源码与作者的项目介绍，不免大失所望，不仅缺乏很多必要的头文件，且作者直言并没有足够的知识去解决这个问题。因此处于好奇，不免想要尝试一下。（虽然经过短暂的构思，发现确实存在很多问题）。初期尝试由于先前想要计算的问题十分复杂，而且发生的过程极快，因此难以在现有知识水平下进行程序的搭建。突然想到了某些圣遗物和某个被封了很多年知识科普团队，于是定下了第一步计划：在不考虑粒子间相互作用、不考虑相对论效应、不考虑Maxwell方程的前提下，单粒子或多粒子在常电磁场中的三维运动可视化。且求解过程基于物理方程描述。（即忘记粒子是如何在场中运动的结论）目录{timeline}{timeline-item color="#19be6b"}物理过程的数学表达{/timeline-item}{timeline-item color="#19be6b"}程序化准备{/timeline-item}{timeline-item color="#19be6b"}Codeing{/timeline-item}{timeline-item color="#19be6b"}运行结果{/timeline-item}{timeline-item color="#ed4014"}缺点分析及展望{/timeline-item}{timeline-item color="#ed4014"}结束语{/timeline-item}{/timeline}物理过程的数学表达“当听者以为自己已有所得时，真正的内行会觉得连皮毛也不是。” ――克莱因，《数学在19 世纪的发展》 我想，单粒子轨道这个看似简单的问题可能也深邃到我们尚只理解其皮毛 。 ——《计算等离子体物理导论》单粒子在场中运动，从入门角度而言，任何上过高中的理科生都可以回答这个问题：磁场改变运动方向，电场改变粒子速度。通过高中的大量训练，我们知道如何联立洛伦兹力与向心力求解平面中的粒子运动，复杂一点的情况下，小球受轨道电场力平抛等等。再最开始，我也想直接进行一番物理计算，把运动模式给出来，即给出闭式方程。但这显然是不科学的。场在空间的复杂分布会超出我们的计算能力，且并不是所有物理过程的数学描述都有通解。在电磁场中，带电粒子所受的洛伦兹力为：运动轨迹由Newton‘s Law给出：通过以上方程组，理论上可以求解出空间中粒子在常电磁场作用下的任意运动。程序化准备接下来我们简要的分析一下，为程序化做准备（离散化方程）。在笛卡尔坐标下，任何物理量都可以由三维分量表示，比如：电场E = [E_x,E_y,E_z]，磁场B =[B_x,B_y,B_z]，场力F = [F_x,F_y,F_z]粒子速度V= [v_x,v_y,v_z]，粒子位置Position= [X,Y,Z]对于任意时刻t，都可以计算出时刻t下的F，由：采用向后差分（方程的解可由初始条件确定），可离散化为：整理为：得到当前时刻下的速度，进一步可以得到当前时刻的位置，由整理为：最后，我们能够得到代求解的方程组为：当然，用前朝的剑斩本朝的官，肯定存在大问题。后文会总结，未来会改进。在程序（Python）中，这段表示为：F = p.q * (E + np.cross(p.v,B)) p.v = p.v + F * (timestep/p.m) p.pos = p.pos + p.v * timestep如果采用比如数学功能较强的软件，只需要给出最开始的数学描述微分方程即可。Codeing剩下的工作就是Coding，让它能够在符合语法规范的情况下运行。总的来看，主要包含以下几个模块：class Particle #粒子 class Field #场 class ParticleSimulator #粒子运动 def visualize(simulator) #可视化 def test_visualize() #运行粒子粒子是粒子仿真的重点，具有质量与电荷，需要定义初始位置与初始速度。定义粒子类：class Particle: def __init__(self,start_pos,v,mass,Quantity): #start_pos , v is 3 dim self.pos = start_pos self.m = mass self.q = Quantity self.v = v self.sum = np.zeros([1,3]) #储存粒子的历史位置场场是粒子在场中运动的重点，目前虽然是单一指向的常场，但长远考虑，需要建立一个场类：class Field: def __init__(self): ''' self.B = np.array([20…