gpt4 book ai didi

wolfram-mathematica - 如何在 Mathematica 中模拟多个点电荷(滚珠轴承)之间的排斥力?

转载 作者:行者123 更新时间:2023-12-04 07:27:13 29 4
gpt4 key购买 nike

我正在尝试在 Mathematica 中编写一个程序,该程序将模拟带电滚珠轴承在带电时展开的方式(它们相互排斥)。到目前为止,我的程序防止滚珠轴承从屏幕上移开,并计算它们撞击盒子侧面的次数。到目前为止,我让滚珠轴承在盒子周围随机移动,但我需要知道如何让它们相互排斥。

到目前为止,这是我的代码:

Manipulate[
(*If the number of points has been reduced, discard points*)
If[ballcount < Length[contents],
contents = Take[contents, ballcount]];

(*If the number of points has been increased, generate some random points*)
If[ballcount > Length[contents],
contents =
Join[contents,
Table[{RandomReal[{-size, size}, {2}], {Cos[#], Sin[#]} &[
RandomReal[{0, 2 \[Pi]}]]}, {ballcount - Length[contents]}]]];

Grid[{{Graphics[{PointSize[0.02],

(*Draw the container*)
Line[size {{-1, -1}, {1, -1}, {1, 1}, {-1, 1}, {-1, -1}}],
Blend[{Blue, Red}, charge/0.3],
Point[

(*Start the main dynamic actions*)
Dynamic[

(*Reset the collision counter*)
collision = 0;

(*Check for mouse interaction and add points if there has been one*)
Refresh[
If[pt =!= lastpt, If[ballcount =!= 50, ballcount++];
AppendTo[
contents, {pt, {Cos[#], Sin[#]} &[
RandomReal[{0, 2 \[Pi]}]]}]; lastpt = pt],
TrackedSymbols -> {pt}];

(*Update the position of the points using their velocity values*)
contents = Map[{#[[1]] + #[[2]] charge, #[[2]]} &, contents];

(*Check for and fix points that have exceeded the box in Y
direction, incrementing the collision counter for each one*)
contents = Map[
If[Abs[#[[1, 2]]] > size,
collision++; {{#[[1, 1]],
2 size Sign[#[[1, 2]]] - #[[1, 2]]}, {1, -1} #[[
2]]}, #] &,
contents];


(*Check for and fix points that have exceeded the box in X
direction, incrementing the collision counter for each one*)
contents = Map[
If[Abs[#[[1, 1]]] > size,
collision++; {{2 size Sign[#[[1, 1]]] - #[[1, 1]], #[[1,
2]]}, {-1, 1} #[[2]]}, #] &,
contents];

hits = Take[PadLeft[Append[hits, collision/size], 200], 200];
Map[First, contents]]]},
PlotRange -> {{-1.01, 1.01}, {-1.01, 1.01}},
ImageSize -> {250, 250}],

(*Show the hits*)
Dynamic@Show
[
ListPlot
[
Take[MovingAverage[hits, smooth], -100
]
,
Joined -> True, ImageSize -> {250, 250}, AspectRatio -> 1,
PlotLabel -> "number of hits", AxesLabel -> {"time", "hits"},
PlotRange -> {0, Max[Max[hits], 1]}], Graphics[]
]
}}
]
,
{{pt, {0, 1}}, {-1, -1}, {1, 1}, Locator, Appearance -> None},
{{ballcount, 5, "number of ball bearings"}, 1, 50, 1},
{{charge, 0.05, "charge"}, 0.002, 0.3},
{smooth, 1, ControlType -> None, Appearance -> None},
{size, 1, ControlType -> None, Appearance -> None},
{hits, {{}}, ControlType -> None},
{contents, {{}}, ControlType -> None},
{lastpt, {{0, 0}}, ControlType -> None}
]

Mathematica graphics

最佳答案

您的模拟需要的是“碰撞检测算法”。这些算法的领域很广泛,因为它与计算机游戏 (Pong) 一样古老,在这里不可能给出完整的答案。

您现在的模拟非常基础,因为您在每个时间步长中都使带电的球前进,这使它们从一个位置“跳”到另一个位置。如果运动像恒速和零加速度一样简单,您就知道运动的确切方程,并且可以通过简单地将时间代入方程来计算所有位置。当球从墙上弹开时,它会得到一个新的方程式。

有了这个,你可以预测两个球什么时候会碰撞。您只需求解两个球,无论它们是否同时具有相同的位置。这称为先验检测。当您按照现在的方式进行模拟时,您必须在每个时间步长检查两个球是否靠得太近,以至于它们可能会发生碰撞。

问题是,你的模拟速度不是无限高,你的球越快,你的模拟跳跃就越大。那么这不是不可能的,两个球相互过度跳跃而你错过了一次碰撞。

考虑到这一点,您可以从阅读 Wikipedia article 开始。到该主题,以获得概述。接下来,您可以阅读一些关于它的科学文章或查看裂缝是如何做到的。 Chipmunk physics engine例如是一个惊人的二维物理引擎。确保such stuff工作,我很确定他们必须在他们的碰撞检测中投入很多想法。

关于wolfram-mathematica - 如何在 Mathematica 中模拟多个点电荷(滚珠轴承)之间的排斥力?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675637/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com