【问题标题】:How to simulate pendulum movement with high amplitude in C#如何在 C# 中模拟高振幅的钟摆运动
【发布时间】:2015-07-02 11:00:21
【问题描述】:

我需要为一个简单的钟摆制作一个 C# 模拟器。 我已经在网上搜索了 3 天,但我被卡住了。

问题是我发现了许多方程可以将角度位置作为时间的函数,这非常适合我进行视觉模拟的需要,但问题是这些函数仅适用于小于 10 的角度,但我应该可以从任何角度进行模拟。 仅适用于小角度的方程示例:

来源:http://hyperphysics.phy-astr.gsu.edu/hbase/pend.html#c2

适用于任何角度(幅度)的方程太复杂了,因为它涉及微分方程和导数。我不知道如何在 C# 中实现这些。 我认为可行但我不知道如何使用的方程式示例:

来源:http://www.sbfisica.org.br/rbef/pdf/070707.pdf (方程编号 32)

最后一个方程的问题是“sn”,即 Jacobi 椭圆函数 sn(u;m) u,我不知道如何在 C# 中使用

有人可以帮忙吗?也许还有另一个我可以以编程方式使用的方程,或者帮助我理解如果它真的有效,我如何使用最后一个方程。

【问题讨论】:

标签: c# math physics computational-geometry differential-equations


【解决方案1】:

如果你想模拟钟摆,你不需要精确的解决方案。您唯一需要的是在模拟的每个步骤中都有足够好的近似值,并结合足够的步骤。这类似于用足够多的线段来近似一个圆,每个线段都与理想圆相切。

现在,假设您的钟摆与垂直方向的偏差为theta 度(或弧度),如下图所示:

质量m 的重量为m * g,其中g 是重力加速度。现在,让我们估算一下钟摆在接下来的dt 秒内移动的角度alphadt 是一步的持续时间,所以dt 只是几分之一秒)。

由于切线方向上的加速度为g * cos(theta),我们可以近似计算摆在dt 秒内移动的切线距离,就好像在这段时间内加速度是恒定的一样:

d = v * dt + g * sin(theta) (dt)^2 / 2

其中v是摆在角度位置theta.处的切线速度现在我们可以计算alpha

alpha = arcsin(d / r)

其中r 是半径。因此,唯一剩下的就是更新v 的值,以便我们可以在下一步中重复相同的操作。方法如下

v := v + g * sin(theta) * dt

当然,当钟摆启动时,你可以初始化v = 0

我自己没有尝试过,所以请告诉我这种“模拟”方法是否适合您。祝你好运!

【讨论】:

  • 这正是他的“仅适用于小角度的方法”链接中给出的方法。
  • 是的,但有所不同。在我的(它不是“我的”但是..)中,总角度theta 不一定要小,它可以是任何东西。只有差分alpha 必须小,这就要求dt 足够小。其效果是将运动离散化为小步骤,其中数学方程简单且易于求解。
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多