- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 3D 中进行刚体模拟。现在我在旋转方面遇到了精度问题。最终,物体(没有外力)的方向会收敛到围绕具有最小惯性矩的轴。降低 dt
有帮助,但不是太多。有没有办法最大限度地减少这种漂移?
这是我目前的算法:
给定:
L
I
dt
O
步骤:
W
。 L = I * W
=> W = Inverse(I) * L
。因为只有局部惯性矩已知,实际公式为 W = O * Inverse(I) * Inverse(O) * L
。dO
- 关于归一化的旋转矩阵W
带角度 Length(W) * dt
。为了防止正交性问题,方向用四元数表示,但算法在其他方面没有改变。
我的想法是可能有一种方法可以利用能量守恒。在分析我的一个测试示例时,我发现旋转能量随着 body 旋转而漂移(增加)。由于我使用动量守恒来计算角速度,使用能量守恒可以将所有数值误差插入其他“维度”。我想那是时间,我想看它不那么痛苦。但我什至不知道从哪里开始。
最佳答案
我可以分享我的算法。它是一种辛算法,基于将惯性矩阵拆分为两个惯性矩阵的和,每个惯性矩阵有两个相等的轴,这导致将角动量微分方程的原始系统(所谓的欧拉方程)拆分为两个系统具有两个相等惯性轴的物体的微分方程。每个系统都可以明确求解,然后将两个系统的相流以蛙跳方式组合。因此,该算法与原系统一样保持角动量,准能量守恒,即能量几乎守恒,能量不耗散,因此不存在角速度漂移。这是因为算法保留了角动量球面上所谓的辛结构,这在几何上意味着算法保留了所述球面上的面积。
import math
import numpy as np
def Rot_3(m):
cs = math.cos(m)
sn = math.sin(m)
return np.array([
[cs, -sn, 0],
[sn, cs, 0],
[ 0, 0, 1]])
def Rot_1(m):
cs = math.cos(m)
sn = math.sin(m)
return np.array([
[1, 0, 0],
[0, cs, -sn],
[0, sn, cs]])
def vector_to_matrix(Vector):
Matrix = np.array([ 0, - Vector[2], Vector[1]],
[ 0, 0, -Vector[0]],
[ 0, 0, 0 ])
return Matrix - Matrix.T
def Angular_Momentum_step(M_input, k_23, k_21, t_step):
M_step = Rot_3(t_step*k_23 * M_input[2]/2).dot(M_input)
M_step = Rot_1(t_step*k_21 * M_step[0]).dot(M_step)
M_step = Rot_3(t_step*k_23 * M_step[2]/2).dot(M_step)
return M_step
def Rotation_step(M, I_inv, t_step):
O = I_inv*M
angle = math.sqrt(O.dot(O))
O = O / angle
angle = t_step*angle
O = vector_to_matrix(O)
U = np.array([[1,0,0],[0,1,0],[0,0,1]])
U = U + math.sin(angle)*O + (1-math.cos(angle))*(O.dot(O))
return U
def Propagate_Angular_Momentum(M_initial, Inertia, n_iterations, t_step):
I_inv = np.array([1/Inertia[0], 1/Inertia[1], 1/Inertia[2]])
k_23 = I_inv[1]-I_inv[2]
k_21 = I_inv[1]-I_inv[0]
M_evolution = np.empty((3, n_iterations), dtype=float)
M_evolution[:,0] = M_initial.copy()
for i in range((n_iterations-1)):
M_evolution[:,i+1] = Angular_Momentum_step(M_evolution[:,i], k_23, k_21, t_step)
return M_evolution
def Propagate_Rotation(Body_initial, Moment_initial, Inertia, n_iterations, t_step):
I_inv = np.array([1/Inertia[0], 1/Inertia[1], 1/Inertia[2]])
k_23 = I_inv[1]-I_inv[2]
k_21 = I_inv[1]-I_inv[0]
Moment_evolution = np.empty((3, n_iterations), dtype=float)
Moment_evolution[:,0] = Moment_initial.copy()
Body_evolution = np.empty((3, n_iterations+1), dtype=float)
Body_evolution[:,0] = Body_initial.dopy()
for i in range((n_iterations-1)):
Moment_evolution[:,i+1] = Angular_Momentum_step(Moment_evolution[:,i], k_23, k_21, t_step)
Body_evolution[:,i+1] = Rotation_step(Moment_evolution[:,i], I_inv, t_step)
Body_evolution[:,i+1] = Body_evolution[:,i+1].dot(Body_evolution[:,i])
return Body_evolution, Moment_evolution
# a test example, set up the initial angular velocity and the
#
I1 = 2.35
I2 = 2.0
I3 = 1.0
I = np.array([I1, I2, I3])
O = np.array([0, 2, 0.95])
O = Rot_3(-math.pi*(30)/180).dot(O)
M = I*O
dt = 0.3
n_iter=500
# propagate the system
Momenta = Propagate_Angular_Momentum(M, I, n_iter, dt)
# plot
fig = plt.figure()
ax = fig.add_subplot(1,2,1,projection='3d')
ax.set_xlim((-4, 4))
ax.set_ylim((-4, 4))
ax.set_zlim((-4, 4))
ax.plot(Momenta[0,:], Momenta[1,:], Momenta[2,:], 'r-')
plt.show()
观察角动量总是穿过二维球体上的红色曲线。曲线看起来是封闭的,没有任何坐标轴向外螺旋,与 body 固定框架中的惯性轴对齐。
关于physics - 防止旋转漂移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66990693/
我有一个应用程序,其中许多对象都扩展了一个抽象类,该抽象类定义了诸如 create() edit() retrieve() 和 delete()。由于每个子类对这些函数使用相同的逻辑,抽象类定义了默认
我正在使用$anchorScroll滚动到页面顶部,其中 html 元素具有 ID #brand。 AngularJS 代码: $location.hash(
我想停用我的应用程序中的右键单击,该右键单击提供了在桌面上安装应用程序的选项。我该如何做这样的事情? 最佳答案 右键单击 Visual Studio 中的项目并选择属性。那里有一个复选框“启用浏览器运
我使用 jquery 定位 div,在我的 CSS 中我有一个 div.right-sm:hover{background-color: blue} 我想使用 jquery 停止悬停: $(this
所以,我正在尝试复制 html5“占位符”属性功能。 我目前坚持的一件事是,在获得元素焦点时,插入符号立即出现在输入的开头。 就目前情况而言,插入符号出现在用户单击的位置,然后当我使用 jQuery
当表单填写并发送时,如果您刷新页面,它表示表单将再次发送。 (再次提交表格)。 防止这种情况发生的好方法是什么?或者终止这个 session ? 这方面有什么指导吗? 谢谢 最佳答案 处理完POST信
我想阻止 @ 被输入到 input 中。但它不起作用,知道为什么吗? $(function() { $(document).on('keyup', '[placeholder="x"]', fun
我正在使用 PHP 创建一个应用程序并涉及 MySQL。如果在请求过程中发生错误,我将如何“将查询分组在一起”,检查它是否会成功,然后对真实表进行实际影响。如果对表的实际更新失败,则恢复到更新之前的状
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Best Java obfuscator ? 对于我的示例,我知道 eclipse 提供了一个反编译插件。而
这是一个演示我的问题的 fiddle :JSFiddle 我正在制作自定义下拉菜单(实际上我使用的是 icomoon 图标而不是 V)...它看起来不错,但是父元素的 ::after 是阻止选择:(
每当我编写需要大量条件的代码时,我都会这样做: if foo: if bar: if foobar: if barfoo: if foobarfoo:
我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制文件/程序集以绕过检查: 例如在源代码中。 bool verificationResult = verify(); if (verif
我正在寻找一种简单的方法来检查多个零件表,以确定给定零件号在添加到给定表之前是否已经存在。 我目前想到的最好的想法是一个辅助表,它简单地将所有表中的每个 PN 列在一个列中,并带有一个唯一的键;但是我
这个问题在这里已经有了答案: jquery stop child triggering parent event (7 个答案) 关闭 8 年前。 我不确定这是否真的冒泡,我会解释。 我有这个:
我有一个 Spring MVC web 应用程序(不确定该信息是否重要,但它可能是)使用 ModelAndView 将字符串值传递给 JSP 文件。 字符串值的形式是: d@.
我在这里尝试使用表单 key 方法进行 csrf 保护 http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/
htmlentities 是防止 PHP 中的 XSS 的最佳解决方案吗?我还想允许像 b、i、a 和 img 这样的简单标签。实现这一点的最佳解决方案是什么?我确实考虑过 bbcode,但发现如果没
我有一个非常基本的 JAX-RS 服务(下面的 BookService 类),它允许创建 Book 类型的实体(也在下面)。 POST负载 { "acquisitionDate": 14188
我正在使用 Polymer 1.5,我确实需要“this”变量不要映射到外部。我知道 typescript 会为某些人做这件事 valid reasons . declare var Polymer:
这个问题在这里已经有了答案: Class-level read-only properties in Python (3 个答案) 关闭 6 年前。 有没有一种方法可以通过重写实例变量的 __set
我是一名优秀的程序员,十分优秀!