NBodySimulation[law,{state1,…,staten},t]
对由 n 个物体组成的系统在时间 t 内的运动进行仿真,系统的初始状态为 statei,由指定的势或力学定律控制.
NBodySimulation[law,<|body1state1,…,bodynstaten|>,t]
对由 n 个名为 bodyi 的物体组成的系统的运动进行仿真.
NBodySimulation
NBodySimulation[law,{state1,…,staten},t]
对由 n 个物体组成的系统在时间 t 内的运动进行仿真,系统的初始状态为 statei,由指定的势或力学定律控制.
NBodySimulation[law,<|body1state1,…,bodynstaten|>,t]
对由 n 个名为 bodyi 的物体组成的系统的运动进行仿真.
更多信息和选项
- NBodySimulation 给出的结果为 NBodySimulationData 对象.
- NBodySimulation 默认情况下求解经典的非相对论运动方程.
- 以关联的形式给出状态 statei,其中含有以下元素:
-
"Mass" 质量 "Position" 位置 "Velocity" 速度 "Charge" 电荷(可选) "PositionVariable" 用于位置的变量(可选) "MomentumVariable" 用于动量的变量(可选) - 也可以包含特殊势或力学定律使用的其他元素.
- 可用以下形式给出势或力学定律:
-
"name" 已命名定律 <|"prop1"f1,…|> 具有指定属性的定律 fun 成对势函数 - 可能的已命名定律包括:
-
"InverseSquare" 无单位平方反比定律 "Harmonic" 无单位简谐势 {"Harmonic",params} 带有参数的无单位简谐势 "Newtonian" 有物理单位的牛顿引力 "Coulomb" 有单位的库仑定律 - 默认情况下,"Harmonic" 使用弹簧常数 1,平衡长度 1.
- {"Harmonic",<|"SpringConstant"->k,"EquilibriumLength"->len|>} 使用弹簧常数 k,平衡长度 len.
- 用关联给出定律时,可以使用以下键:
-
"PairwisePotential" 两个物体间的成对势函数 "PairwiseForce" 两个物体间的成对力函数 "ExternalPotential" 其他应用于每个物体的势函数 "ExternalForce" 其他应用于每个物体的力函数 "Region" 限制物体的区域 - 成对势函数或力函数 f 以形式 f[statei,statej] 应用于物体 i 和 j.
- 可用有单位的量给出为每个物体指定的初始状态的值.
范例
打开所有单元 关闭所有单元基本范例 (2)
data = NBodySimulation["Harmonic", {<|"Mass" -> 1, "Position" -> {-1 / 3}, "Velocity" -> {0}|>,
<|"Mass" -> 2, "Position" -> {1 / 3}, "Velocity" -> {0}|>}, 10]Plot[Evaluate[data[All, "Position", t]], {t, 0, 10}]data = NBodySimulation["InverseSquare", {<|"Mass" -> 1, "Position" -> {0, 0}, "Velocity" -> {0, .5}|>,
<|"Mass" -> 1, "Position" -> {1, 1}, "Velocity" -> {0, -.5}|>,
<|"Mass" -> 1, "Position" -> {0, 1}, "Velocity" -> {0, 0}|>}, 4]data[All, 4]ParametricPlot[Evaluate[data[All, "Position", t]], {t, 0, 4}]范围 (8)
data = NBodySimulation["InverseSquare", {<|"Mass" -> 1, "Position" -> {0, 0, 0}, "Velocity" -> {0, 0, 0}|>,
<|"Mass" -> 2, "Position" -> {1, 1, 1}, "Velocity" -> {0, 0, 0}|>,
<|"Mass" -> 3, "Position" -> {1, 1, 0}, "Velocity" -> {0, 0, 0}|>,
<|"Mass" -> 4, "Position" -> {0, 1, 1}, "Velocity" -> {0, 0, 0}|>}, 1]ParametricPlot3D[Evaluate[data[All, "Position", t]], {t, 0, 1}]Plot[Evaluate[Map[data[#, t]&, {"TotalKineticEnergy", "TotalPairwiseInteractionEnergy", "TotalEnergy"}]], {t, 0, 1}, PlotRange -> All]data["Equations"]data["HamiltonEquations"]data = NBodySimulation[{"Harmonic", "SpringConstant" -> .5, "EquilibriumLength" -> 1.5},
<|"bill" -> <|"Mass" -> .25, "Position" -> {0, 1}, "Velocity" -> {0, 0}|>,
"sam" -> <|"Mass" -> 1, "Position" -> {-1, 0}, "Velocity" -> {0, 0}|>, "george" -> <|"Mass" -> 1, "Position" -> {1, 0}, "Velocity" -> {0, 0}|>|>, 25]Plot[Last[data["bill", "Position", t]], {t, 0, 25}]显示 "sam" 和 "george" 的水平位置随时间如何变化:
Plot[{First[data["sam", "Position", t]], First[data["george", "Position", t]]}, {t, 0, 25}]names = {"bill", "sam", "george"};ListAnimate[Table[
Graphics[Map[Text[#, data[#, "Position", t]]&, names], PlotRange -> {{-1.5, 1.5}, {-.1, 1.6}}], {t, 0, 25, .25}]]data = NBodySimulation[Association["PairwisePotential" -> "InverseSquare", "Region" -> Disk[]], {<|"Mass" -> 1, "Position" -> {0, 0}, "Velocity" -> {0, 0}|>,
<|"Mass" -> 1, "Position" -> {0, -.9}, "Velocity" -> {1, 0}|>,
<|"Mass" -> 1, "Position" -> {0, .9}, "Velocity" -> {-2, 0}|>}, 5]Show[Region[Disk[]], ParametricPlot[Evaluate[data[All, "Position", t]], {t, 0, 5}], Axes -> True]data = NBodySimulation["Coulomb", {<|"Mass" -> Quantity[1, "Kilograms"], "Position" -> Quantity[{0, 0}, "Meters"], "Velocity" -> Quantity[{1, 0}, "Meters" / "Seconds"], "Charge" -> Quantity[10^-4, "Coulombs"]|>,
<|"Mass" -> Quantity[1, "Kilograms"], "Position" -> Quantity[{1, 1}, "Meters"], "Velocity" -> Quantity[{-1, 0}, "Meters" / "Seconds"], "Charge" -> Quantity[-10^-5, "Coulombs"]|>}, 1]ParametricPlot[Evaluate[data[All, "Position", t]], {t, 0, 1}]data = NBodySimulation["InverseSquare", {<|"Mass" -> 1, "Position" -> {0, 0}, "Velocity" -> {0, 0}|>,
<|"Mass" -> 1, "Position" -> {1, 1}, "Velocity" -> {0, 0}|>}, 2]ctime = data["SimulationTime"]ParametricPlot[Evaluate[data[All, "Position", t]], {t, 0, ctime}]n = 7;
data = NBodySimulation[<|"PairwisePotential" -> AssociationThread[Partition[Range[n], 2, 1, {1, 1}] -> ConstantArray[{"Harmonic", "EquilibriumLength" -> (2π/n)}, n]]|>,
MapThread[<|"Mass" -> #1, "Position" -> #2, "Velocity" -> {0, 0}|>&, {Range[n], CirclePoints[1.1, n]}], 47]ParametricPlot[Evaluate[data[All, "Position", t]], {t, 0, 47}]Plot[Evaluate[Table[Norm[data[i, "Position", t] - data[Mod[i + 1, n, 1], "Position", t]], {i, n}]], {t, 0, 47}, PlotRange -> All]使用 "PairwiseForce" 模拟两个半径为 1 的球体间的弹性碰撞:
force[r_, e_] := With[{delta = #1["Position"] - #2["Position"]}, Function[delta e Ramp[2 r - Norm[delta]] ^ (3 / 2) / (2 Norm[delta])]];data = NBodySimulation[<|"PairwiseForce" -> force[1., 2.]|>, {<|"Mass" -> 1, "Position" -> {0, 0, 0}, "Velocity" -> {0, 0, 0}|>, <|"Mass" -> 1, "Position" -> {.1, .1, 1}, "Velocity" -> {0, 0, -1}|>}, 2];ParametricPlot3D[Evaluate[data[All, "Position", t]], {t, 0, 2}]data = NBodySimulation["InverseSquare", {<|"Mass" -> 1, "Position" -> {0, 0}, "Velocity" -> {0, .5}, "PositionVariable" -> x1, "MomentumVariable" -> p1|>,
<|"Mass" -> 1, "Position" -> {1, 1}, "Velocity" -> {0, -.5}, "PositionVariable" -> x2, "MomentumVariable" -> p2|>,
<|"Mass" -> 1, "Position" -> {0, 1}, "Velocity" -> {0, 0}, "PositionVariable" -> x3, "MomentumVariable" -> p3|>}, 4]data["Equations"]data["HamiltonEquations"]应用 (1)
sun = Entity["Star", "Sun"];
earth = Entity["Planet", "Earth"];
moon = Entity["PlanetaryMoon", "Moon"];date = DateObject[{2018, 1, 1}, "Day", "Gregorian", -4.];sunPosition = Table[Quantity[0, "AstronomicalUnits"], 3];earthPosition = EntityValue[earth, EntityProperty["Planet", "HelioCoordinates", {"Date" -> date}]];
moonPosition = EntityValue[moon, EntityProperty["PlanetaryMoon", "HelioCoordinates", {"Date" -> date}]];day = Quantity[1, "Days"];sunVelocity = sunPosition / day;
earthVelocity = (EntityValue[earth, EntityProperty["Planet", "HelioCoordinates", {"Date" -> date + day}]] - earthPosition) / day;
moonVelocity = (EntityValue[moon, EntityProperty["PlanetaryMoon", "HelioCoordinates", {"Date" -> date + day}]] - moonPosition) / day;data = NBodySimulation["Newtonian", <|sun -> <|"Position" -> sunPosition, "Velocity" -> sunVelocity|>, earth -> <|"Position" -> earthPosition, "Velocity" -> earthVelocity|>, moon -> <|"Position" -> moonPosition, "Velocity" -> moonVelocity|>|>, Quantity[1, "Years"]]tend = data["SimulationTime"]ParametricPlot3D[Evaluate[data[earth, "Position", t]], {t, 0, tend}]ParametricPlot3D[Evaluate[data[moon, "Position", t] - data[earth, "Position", t]], {t, 0, tend}]Plot[Evaluate[Norm[data[moon, "Position", t] - data[earth, "Position", t]]], {t, 0, tend}]相关指南
-
▪
- 微分方程 ▪
- 天文计算与数据 ▪
- 分子结构与计算 ▪
- 科学模型 ▪
- 物理和化学:数据和计算
文本
Wolfram Research (2019),NBodySimulation,Wolfram 语言函数,https://reference.wolfram.com/language/ref/NBodySimulation.html.
CMS
Wolfram 语言. 2019. "NBodySimulation." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/NBodySimulation.html.
APA
Wolfram 语言. (2019). NBodySimulation. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/NBodySimulation.html 年
BibTeX
@misc{reference.wolfram_2026_nbodysimulation, author="Wolfram Research", title="{NBodySimulation}", year="2019", howpublished="\url{https://reference.wolfram.com/language/ref/NBodySimulation.html}", note=[Accessed: 30-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_nbodysimulation, organization={Wolfram Research}, title={NBodySimulation}, year={2019}, url={https://reference.wolfram.com/language/ref/NBodySimulation.html}, note=[Accessed: 30-October-2026]}