当前位置: 首页 > 知识库问答 >
问题:

物理/矢量问题-太阳系运动、矢量和标量计算

锺离昂然
2023-03-14

我正在处理一个课堂问题,要求我在3D空间中模拟太阳系内行星/卫星/小行星的运动。学期初我们从矢量、质量和力开始,所以我仍在努力掌握它。

*我的问题在第4步和第5步中有详细说明。如果我一路上有什么错误,请告诉我。任何意见和指导将不胜感激。

  • 提供的信息

空间中的每个物体都具有以下特征:

  • 质量
  • 位置向量

我必须使用牛顿万有引力定律:

F = G * mass1 * mass2 / distance^2
  • 问题

给定时间t,更新空间中每个物体的位置和速度。那么,如果t是10秒,那么在给定时间,这些物体在空间中的位置是什么?

我被告知在整个t中把加速度视为常数。为了简单起见,不要担心物体碰撞,物体可能非常小。空间中给定的物体可能从1到100。

  • 我目前的进展

到目前为止,我不确定我做得对不对,但我目前正在采取以下步骤:

第二步:我在计算加速度:

a = Net Force / Mass

第3步:接下来我计算最终速度:

V=u a*tu=初速

第四步:计算物体的最终位置:

s = s0 + u*t + 1/2*a*t^2 

s0=初始位置,u=初始速度

步骤5:对其余对象重复该过程

我的问题在第4步和第5步。我的位置和速度是矢量。但是加速度是标量,所以我知道我不能把它加到矢量上。那么我在这里该怎么办?我是否对每个矢量分量进行计算,然后将所有分量放回新的最终速度和最终位置矢量中?我非常感谢您的帮助和任何输入。

共有2个答案

马博学
2023-03-14

如果教授告诉你在整个时间步骤中将加速度视为常数,那么就这样做,并将其视为不随时间变化的向量。

你的加速度可以是

vec3 acc = vec3( accVal, accVal, accVal );

这将给你一个在所有三个轴上都是恒定的加速度。

韩寒
2023-03-14

首先看这个QA:

  • 有可能在大小和质量方面进行真实的n体太阳系模拟吗

你的步骤对于动态n体轨道力学来说是完全错误的!!!

因为你的身体是沿着曲线运动的。你需要使用牛顿·达朗贝尔积分迭代积分,而不是随着方向和力的变化一次计算整个东西,否则你的轨道会扭曲,甚至旋转或偏离太阳,甚至及时逃脱。也有为此保存能量的积分方法...

此外,在任何计算更改身体的位置之前,您必须计算所有物体的所有力,否则您将实现错误的方向,因为一些已经计算的物体处于新位置,而其他物体尚未处于新位置。这通常会给近地天体(如卫星和/或飞越)带来问题。。。

我使用这种逻辑:

>

struct _body
 {
 double mass;
 dvec3 pos; // position
 dvec3 vel; // velocity
 dvec3 acc; // acceleration
 } body[n];

还要为此使用至少64位浮点数。如果您有更多,那就更好了,因为即使是64位浮点数也已达到此类计算的极限。

为每个物体计算加速度

简单地总结每个物体的所有加速度

for (i=0;i<n;i++) body[i].acc = dvec3(0,0,0);
for (i=0;i<n;i++)
 for (j=i+1;j<n;j++) 
  {
  dvec3 d = body[i].pos - body[j].pos;
  dvec3 F = G * body[i].mass * body[j].mass * d / pow(length(d),3);
  body[i].acc -= F/body[i].mass; // the same force is aplied to both bodies
  body[j].acc += F/body[j].mass; // just in reverse direction
  }

d/pow(长度(d),3)将为您提供方向为d的向量和大小为1/d^2的向量。其中,长度(d)=sqrt(d.x*d.x d.y*d.y d.z*d.z)该项将标量方程转换为向量方程。。。

您还可以为大小添加一些健全检查,以便在身体碰撞时避免除以太小或零值。。。

现在为每个实体应用更改

for (i=0;i<n;i++)
  {
  // Newton D'ALembert integration
  body[i].vel += body[i].acc*dt; // this is instead of V = u + a*t
  body[i].pos += body[i].vel*dt; // this is instead of s = s0 + u*t + 1/2*a*t^2
  }

其中,dt是您的迭代时间步长,例如0.1秒(或计时器间隔或经过的或模拟的时间步长),迭代时间步长极大地影响精度,因此如果您需要更高的精度,我建议使用上面链接答案中的精度增强技巧,它可以在不显著降低dt的情况下极大地改善情况。

另请注意,步骤#2和#3在单独的循环中是至关重要的,不要将它们合并在一起!!!

转到#2

因此,在模拟过程中,您可以使用计时器或带有一些睡眠(dt)的线程或模拟引擎用于计时的任何机制重复步骤#2、#3。

 类似资料:
  • 矢量或者说向量,可以通过2~4个分量表示一个向量,比如通过vec3(1,0,0)表示三维空间中一个沿着x轴正方向的三维方向向量,如果你有高中数学的基础,应该对向量有一定的了解,对于三维坐标的相关几何运算也有一定的概念。 关键字 数据类型 vec2 二维向量,具有xy两个分量,分量是浮点数 vec3 三维向量 ,具有xyz三个分量,分量是浮点数 vec4 四维向量 ,具有xyzw四个分量,分量是浮点

  • Vector是由连续整数索引的值的集合。 使用Clojure中的矢量方法创建矢量。 例子 (Example) 以下是在Clojure中创建矢量的示例。 (ns clojure.examples.example (:require [clojure.set :as set]) (:gen-class)) (defn example [] (println (vector 1 2 3

  • 结构体定义、常量和构造函数 定义: typedef struct cpVect{ cpFloat x, y; } cpVect 零向量常量: static const cpVect cpvzero = {0.0f,0.0f}; 创建新结构体所用的便捷的构造函数: cpVect cpv(const cpFloat x, const cpFloat y)

  • 高德POI抓取 功能介绍        POI全称为Point of Interest,即兴趣点。在LSV的扩展插件中可以使用“高德POI抓取”功能来提取所选或者所绘制区域内中的所有包含自定义关键词的POI信息。 具体操作        在下载菜单中找到“高德POI抓取”功能,点击进入。        在绘制或选择所需提取POI的面后开始对关键词、POI类型进行设置,并且输入使用的高德KEY(详细

  • 我试着用升压::变体 但我收到错误:错误:从'std::向量'转换为非标量类型'std::向量 编辑: 我在。h文件 现在我有以下错误: /softs/boost/1 . 53 . 0/64/gcc/4 . 5 . 1/include/boost/detail/reference _ content . HPP:在成员函数' void boost::detail::variant::assign

  • 矢量是由最基本的几何元素(例如直线和曲线)定义出的形状。与位图图像不同,基于矢量的图形格式例如PDF是非常灵活的,因为它们可以被缩放到任何大小,而不损失任何精确度。矢量图形是由一个点连接另一个点的直线和曲线组合而成的。一系列互相链接的直线和曲线组成一个单一的矢量路径。 矢量绘图 Sketch有三种方法可以添加一个矢量形状: 矢量(Vector)工具:从头开始,通过添加直线和曲线点来绘制矢量图; 铅