【发布时间】: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