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

太阳系模拟项目(velocity verlet help)

夏侯渊
2023-03-14

对于我的建模和模拟类项目,我想模拟一个太阳系。我只是从一个恒星(太阳)和一个行星(地球)开始,但我已经遇到了一些问题。我花了一些时间来回顾和学习不同的公式和方法来模拟行星的轨道将如何受到恒星和周围物体的影响。我想用velocity verlet来研究N体问题。我的velocity verlet函数有很多问题。有时它的行为就好像它在正常地绕地球轨道运行,然后它把地球“扭曲”到某个随机的位置。我也注意到我从来没有得到一个“负”加速度,所以我的x和y协调。所以我看不出地球是怎么绕着太阳转的。非常感谢任何帮助。我有AGK::打印,这样我就可以看到不同的变量是如何变化的。

double velocityVerlet(float positionCalc, double position2, 
                      float &velocity, double massCalc, double mass2)
//positionCalc is the position being updated, position 2 is position of 
// other object, same with mass
{
    float force = forceFunc(positionCalc, position2, massCalc, mass2);
    agk::PrintC("Force is: ");
    agk::Print(force);
    float acceleration = accelerationFunc(force,massCalc);
    agk::PrintC("Accel is: ");
    agk::Print(acceleration);`;

    double newAccel = 0;

    positionCalc = positionCalc + velocity*dt + 
                   (.5*acceleration)*pow(dt,2); //calculates new position
    agk::PrintC("New Position is: ");
    agk::Print(positionCalc);
    force = forceFunc(positionCalc,position2,massCalc,mass2);
    newAccel = accelerationFunc(force, massCalc);

    velocity = velocity + .5*(acceleration + newAccel)*dt; //new velocity
    agk::PrintC("Velocity is: ");
    agk::Print(velocity);

    return positionCalc;
}

共有1个答案

凤自珍
2023-03-14

您的积分器接受标量以及您的问题是关于二维系统的事实使我认为您调用了两次积分器,每个组件一次。这是行不通的,因为你的系统会在相空间中采取不切实际的动作。积分器处理矢量量:

X(t+dt)=X(t)+V(t)dt+(1/2)A(t)dt2

V(t+dt)=V(t)+(1/2)(A(t)+A(t+dt))dt

Vector forces[num_particles];

// Compute initial forces
forces = computeForces(positions);

for (int ts = 0; ts < num_timesteps; ts++)
{
   // Update positions and half-update velocities
   for (int i = 0; i < num_particles; i++)
   {
      positions[i] += velocities[i]*dt + 0.5*(forces[i] / m[i]) * dt*dt;
      velocities[i] += 0.5*(forces[i] / m[i]) * dt;
   }

   // Compute new forces and half-update velocities
   forces = computeForces(positions);

   for (int i = 0; i < num_particles; i++)
   {
      velocities[i] += 0.5*(forces[i] / m[i]) * dt;
   }
}

时间步长的正确选择非常重要。太小的时间步长会显著减慢模拟速度。太大的时间步长将导致不可能的物理,例如跳跃的行星。

 类似资料:
  • 现在,当我把速度*timedelta(在这一点上,大概是10,000,000,000,000,000,000,000)加到23500的位置时,它基本上不会加。位置仍然是(0,0,23500)而不是类似于(0,0, 如果我将地球的初始位置设置为0,0,0并且仍然,将加速度设置为0.0000000000000000000000009以确保它的位置是(0,0,23500),然后“加”速度*TimeDel

  • 本文向大家介绍Java太阳系小游戏分析和源码详解,包括了Java太阳系小游戏分析和源码详解的使用技巧和注意事项,需要的朋友参考一下 最近看了面向对象的一些知识,然后跟着老师的讲解做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下最近学的知识: 用到知识点:类的继承、方法的重载与重写、多态、封装等 分析: 1.需要加载图片、画图 2.建一个面板,主页面 3.行星类 效果图: 先看一下源码结构图:

  • 我需要使用com。太阳工具。javac类是私有的,在编译或运行时都不可见。 我使用: JDK 11.0.15 我目前的状态是,我的导入是红色的,编译失败。 我的类我想在里面使用sun工具(很抱歉图片而不是代码,我的类是2000行长,现在我只关心我的类中工具的可用性): pom。xml: 我需要能够在期间和运行时将这些类作为我的“type”可用。 提前谢谢!

  • 我正试图将类从版本更新到更新的版本,以便与兼容,因为以下消息: JAVAlang.LinkageError:您正在尝试运行JAXB 2.0运行时(从jar:file:/opt/tomcat/appName/WEB-INF/lib/JAXB-runtime-2.3.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class),但在类路径的前面有旧

  • 本文向大家介绍详解python项目实战:模拟登陆CSDN,包括了详解python项目实战:模拟登陆CSDN的使用技巧和注意事项,需要的朋友参考一下 前言 今天为大家介绍一个利用Python模拟登陆CSDN的案例,虽然看起来很鸡肋,有时候确会有大用处,在这里就当做是一个案例练习吧,提高自己的代码水平,也了解Python如何做到模拟登陆的, 下面来看代码 导入库 获取头部信息 解析网页 返回登录过后的

  • 我开始在我的项目中实践TDD,作为背景,它也包含遗留代码。我们使用Mockito作为一个模拟框架,并遵循Spring MVC方法。 有时,类用许多不同的对象作为属性实现。这些服务中有一些简单的方法,例如。 将使用许多对象来完成其职责 更新并保存事务 推进业务流程 关闭其他挂起的操作 但是,在执行这些操作时,该方法需要调用不同的来获取和更新事务、获取业务流程ID、获取挂起的事务(并保存其更新)。这意