C++ 模拟开普勒方程的程序
C++ Program to Simulate Kepler's Equations
所以我正在尝试制作一个基本的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();
};
你真的没有解释你的问题,但我会提供一些批评。
您混合搭配使用double
和float
。 这会导致舍入误差。 选择一个并坚持下去。
您有一些以 };
(括号分号)结尾的方法。 检查语法:方法不以分号结尾。 此外,您的 if 语句以分号结尾。 同样的问题。
但是,您的main
功能不会结束。
你的一些计算困扰着我。
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
的方程中,根据E1=M
赋值的定义,M
和 E1
具有相同的值,因此得到:E2 = (0+ec*sin(E1))/(ec*cos(E1)-1);
或
E2 = (ec * sin(E1)) / (ec * cos(E1) - 1);
分母中的"-1"是否正确? 这是防止分解ec
。
您的算法不起作用,因为SetValues
设置的是参数值而不是成员值。
试试这个:
void Planet::SetValues(float m_a, float m_ec, float m_T)
{
a = m_a;
ec = m_ec;
T = m_T;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- C++四元数方程程序
- 编写 c++ 程序以求解 e^(x/2)=2sin(x) 从 0<X<2 的方程
- C++程序已停止工作-求解常微分方程
- C++ 模拟开普勒方程的程序
- c++使用dev - c++编译器,我写了一个程序,从摄氏转换到华氏,但我一直得到错误的方程
- 我在编写控制台应用程序以创建一个简单的程序来解决养老金的数学方程时遇到问题
- 用c++编写一个程序来计算所有可能的方程