【问题标题】:C++ Program to Simulate Kepler's Equations模拟开普勒方程的 C++ 程序
【发布时间】:2015-01-19 21:11:26
【问题描述】:

所以我正在尝试制作一个基本的 C++ 程序来计算平均、偏心和真实异常以及行星的径向距离和速度。这是我参与的第一个程序之一,所以我知道它并不像它可能的那样简洁。我只是很难让它运行。我知道一些值可能需要转换以使单位匹配,我可以稍后再做。我只想知道是什么导致它无法运行。同样主要的是,我对每个星球都有 if 语句;我没有包括其余部分,因为它会占用太多空间。

最终,程序的目标是打印一张时间表,给出行星名称的异常值 r 和 v。如果您需要任何澄清,请告诉我。谢谢

提前致谢

const float G = 6.673E-11;
const float solar_m = 1.989E30;
const float mu = G*solar_m;

class Planet
{
  double a, ec, T;
public:
  void SetValues(float, float, float);
  float Calculations();
};

void Planet::SetValues(float m_a, float m_ec, float m_T)
{
  m_a = a;
  m_ec = ec;
  m_T = T;
}

float Planet::Calculations()
{
  //Set up values
  a = a*1.496E11; //AU to m
  T = T*365;   //Period converted to days

  float delta = 0.001;

  float M;
  float E;

  float E1;
  float E2, f_E2;
  float E3, f_E3;

  float f,r,v;

  for(int t; t<T; t++)
    {
      M= sqrt(mu/(a*a*a))*t;
      E1= M;

      E2 = (M-E1+ec*sin(E1))/(ec*cos(E1)-1);
      f_E2 = M-E2+ec*sin(E2);

      E3 = (M-E2+ec*sin(E2))/(ec*cos(E2)-1);
      f_E2 = M-E3+ec*sin(E3);

      if (f_E2<delta)
        E=E2;
      else if (f_E3<delta)
        E=E3;
      else
        cout<<"not enough iterations";

      f = 2*atan(sqrt((1+ec)/(1-ec))*tan(E/2));
      r = (a*(1-ec*ec))/(1+ec*cos(f));
      v = sqrt(mu*(2/r -1/a));

      cout<< t<<"     "<<M<<" "<<E<<" "<<f<<" "<<r<<" "<<v;
    }
};

int main()
{
  int i;
  float t;
  string pName;
  cout<<"What planet do you want to simulate?";
  cin>>pName;

  if (pName.compare("mercury") || pName.compare("Mercury"))
    {
      Planet me;
      me.SetValues(.387, .2056, .24);
      me.Calculations();
    };

【问题讨论】:

  • 你有什么问题?编译错误?
  • " 我只是想知道是什么导致它无法运行。" 那是相当广泛的。你能描述如何它失败了吗?
  • 查找如何使用构造函数而不是使用“setValues”函数可能是个好主意。
  • 您的代码有一些非常糟糕的语法错误。这肯定不会编译。这也是一个不完整的例子,所以几乎不可能说出发生了什么。请阅读“How to create a Minimal, Complete, and Verifiable example” 并相应地编辑您的问题。也许您还可以将代码总量减少到基本位。
  • 您的setValues 函数不正确。目前,您正在将对象的数据值分配给参数。语法应该是data_field = parameter;

标签: c++ simulation physics astronomy


【解决方案1】:

你真的没有解释你的问题,但我会提出一些批评。

您可以混合使用doublefloat。这引入了舍入误差。选择一个并坚持下去。

您有一些以};(括号-分号)结尾的方法。检查语法:方法不以分号结尾。您的 if 语句也以分号结尾。同样的问题。

但是,您的 main 函数并没有结束。

【讨论】:

  • 我切断了其余的主要功能以节省空间。我做了一些调整,现在我收到错误“运行时检查失败 #3 - 正在使用变量 't' 而没有被初始化。”我不确定这是为什么,因为我在循环中初始化了 t,然后又在 main() 中初始化了。
【解决方案2】:

你的一些计算让我很困扰。

  M= sqrt(mu/(a*a*a))*t;
  E1= M;

  E2 = (M-E1+ec*sin(E1))/(ec*cos(E1)-1);
  f_E2 = M-E2+ec*sin(E2);

E2 的等式中,ME1 具有相同的值,根据 E1=M 赋值的定义,因此得出:
E2 = (0+ec*sin(E1))/(ec*cos(E1)-1);

E2 = (ec * sin(E1)) / (ec * cos(E1) - 1);

分母中的“-1”是否正确?这会阻止分解ec

【讨论】:

【解决方案3】:

您的算法不起作用,因为SetValues 设置的是参数值而不是成员值。

试试这个:

void Planet::SetValues(float m_a, float m_ec, float m_T)
{
    a = m_a;
    ec = m_ec;
    T = m_T;
}

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多