一、最终画面
二、程序代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace wx
{ public partial class Form1 : Form
{ public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{ //计算半长轴a:
double a_sqrt;
a_sqrt = double.Parse(textBoxa.Text);//输入半长轴的平方根
double a = a_sqrt * a_sqrt;
String Sa = "" + a;
textBoxa_1.Text = Sa.ToString();
//计算运动的平均角速度n:
double ln;
ln = double.Parse(textBoxln.Text);//输入摄动改正数
double u = double.Parse(textBoxu.Text);//输入椭球引力常数
double n0 = Math.Pow(u / Math.Pow(a, 3), 0.5);//二次根号下u比三次根号下a
double n = n0 + ln;//n=n0+ln
String Sn = "" + n;
textBoxn.Text = Sn.ToString();
//计算归划时间
double toe = double.Parse(textBoxtoe.Text);//星历基准时间
double toc = double.Parse(textBoxtoc.Text);//秒数据
double t1 = double.Parse(textBoxt1.Text);//观测时间t1
double a0 = double.Parse(textBoxa0.Text);//卫星中飘参数
double a1 = double.Parse(textBoxa1.Text);
double a2 = double.Parse(textBoxa2.Text);
// 计算卫星钟差,a0+a1*(t1-toc)+a2*((t1-toc)*(t1-toc))
double lt = a0 + a1 * (t1 - toc) + a2 * ((t1 - toc) * (t1 - toc));
double t = t1 - lt;
double tk = t - toe;
String Stk = "" + tk;
textBoxtk.Text = Stk.ToString();
//计算真近点角Vk
double M0 = double.Parse(textBoxM0.Text);//平近点角M0
double e1 =double.Parse(textBoxe1.Text);//轨道离心率e1
double Mk = M0 + n * tk;//观测时刻平近点角Mk
String SMk = "" + Mk;
textBoxMk.Text = SMk.ToString();
double Ek_old = Mk;
double Ek_new = Mk + e1 * Math.Sin(Ek_old);//Ek=Mk+e1*SinEk
int i = 1;
//迭代求解E
while (Math.Abs(Ek_new - Ek_old) > 10e-8)
{
Ek_old = Ek_new;
Ek_new = Mk + e1 * Math.Sin(Ek_old);
i += 1;
if (i > 10)
break;
}
double Ek = Ek_new;//Ek_new为最终解,即偏近点角
String SEk = "" + Ek;
textBoxEk.Text = SEk.ToString();
//计算真近点角Vk
double Vk1 = (Math.Pow(1 - e1 * e1, 0.5) * Math.Sin(Ek)) / (1 - e1 * Math.Cos(Ek));
double Vk2 = (Math.Cos(Ek) - e1) / (1 - e1 * Math.Cos(Ek));
double Vk;
if (Vk2 == 0)
{
if (Vk1 > e1)
Vk = Math.PI / 2;
else
Vk = -Math.PI / 2;
} else
{
Vk = Math.Atan(Vk1/Vk2);
if (Vk2<0)
{ if (Vk1 >= 0)
{ Vk += Math.PI; }
else
{ Vk -= Math.PI; }
}
}
String SVk = "" + Vk;
textBoxVk.Text = SVk.ToString();
//计算升交距角u0
double w = double.Parse(textBoxw.Text);//近地点角距w
double u0 = Vk + w;
String Su0 = "" + u0;
textBoxu0.Text = Su0.ToString();
//计算经过摄动改正的升交距角uk,卫星的地心距离rk,轨道倾角ik
double Crs = double.Parse(textBoxCrs.Text);//六个摄动改正参数
double Crc = double.Parse(textBoxCrc.Text);
double Cuc = double.Parse(textBoxCuc.Text);
double Cus = double.Parse(textBoxCus.Text);
double Cic = double.Parse(textBoxCic.Text);
double Cis = double.Parse(textBoxCis.Text);
double i0 = double.Parse(textBoxi0.Text);//参考时刻toe的轨道倾角
double I = double.Parse(textBoxI.Text);//I为轨道倾角i的变化率
//计算摄动改正项
double u_k = Cus * Math.Sin(2 * u0) + Cuc * Math.Cos(2 * u0);
double r_k = Crs * Math.Sin(2 * u0) + Crc * Math.Cos(2 * u0);
double i_k = Cis * Math.Sin(2 * u0) + Cic * Math.Cos(2 * u0);
String Su_k = "" + u_k;
textBoxu_k.Text = Su_k.ToString();
String Sr_k = "" + r_k;
textBoxr_k.Text = Sr_k.ToString();
String Si_k = "" + i_k;
textBoxi_k.Text = Si_k.ToString();
double uk = u0 + u_k;//摄动改正后的升交距角
double rk = a * (1 - e1 * Math.Cos(Ek)) + r_k;//摄动改正后的卫星矢径
double ik = i0 + i_k + I * tk;//摄动改正后的轨道倾角
String Suk = "" + uk;
textBoxuk.Text = Suk.ToString();
String Srk = "" + rk;
textBoxrk.Text = Srk.ToString();
String Sik = "" + ik;
textBoxik.Text = Sik.ToString();
//卫星的轨道平面直角坐标
double xk = rk * Math.Cos(uk);
double yk = rk * Math.Sin(uk);
String Sxk = "" + xk;
textBoxxk.Text = Sxk.ToString();
String Syk = "" + yk;
textBoxyk.Text = Syk.ToString();
//坐标转换
double omega = double.Parse(textBoxomega.Text);//参考时刻toe时的升交点赤经
double omega0 = double.Parse(textBoxomega0.Text);//升交点经度的变化率
double we = double.Parse(textBoxwe.Text);//we地球自转角速度
double L = omega0 + omega * (t - toe) - we * t;
String SL = "" + L;
textBoxL.Text = SL.ToString();
//计算卫星在地固系下坐标
double xk1 = xk * Math.Cos(omegak) - yk * Math.Cos(ik) * Math.Sin(omegak);
double yk1 = xk * Math.Sin(omegak) + yk * Math.Cos(ik) * Math.Cos(omegak);
double zk1 = yk * Math.Sin(ik);
String Sxk1 = "" + xk1;
textBoxxk1.Text = Sxk1.ToString();
String Syk1 = "" + yk1;
textBoxyk1.Text = Syk1.ToString();
String Szk1 = "" + zk1;
textBoxzk1.Text=Szk1.ToString();
}
private void Form1_Load(object sender, EventArgs e) {}
private void button2_Click(object sender, EventArgs e)
{
double a_sqrt;
a_sqrt= 5153.7127704599998;
String Sa_sqrt = "" + a_sqrt;
textBoxa.Text = Sa_sqrt.ToString();
double ln;
ln = 4.1115998360700002e-009;
String Sln = "" + ln;
textBoxln.Text = Sln.ToString();
double u;
u = 3.986005e14;
String Su = "" + u;
textBoxu.Text = Su.ToString();
double a0, a1, a2;
a0 = 0.00028600683435800001;
a1 = 1.7053025658199999e-012;
a2 = 0;
String Sa0 = "" + a0;
String Sa1 = "" + a1;
String Sa2 = "" + a2;
textBoxa0.Text = Sa0.ToString();
textBoxa1.Text = Sa1.ToString();
textBoxa2.Text = Sa2.ToString();
double toc;
double toe;
toc = 0.00000000000000000;
toe = 0.00000000000000000;
String Stoc = "" + toc;
String Stoe = "" + toe;
textBoxtoc.Text = Stoc.ToString();
textBoxtoe.Text = Stoe.ToString();
double t1;
t1 = 4800.0;
String St1 = "" + t1;
textBoxt1.Text = St1.ToString();
double M0;
M0 = 1.2263973009600000;
String SM0 = "" + M0;
textBoxM0.Text = SM0.ToString();
double e1;
e1 = 0.0053100715158500003;
String Se1 = "" + e1;
textBoxe1.Text = Se1.ToString();
double w;
w = -1.6819446292500000;
String Sw = "" + w;
textBoxw.Text = Sw.ToString();
double Crs, Crc, Cuc, Cus, Cic, Cis;
Crs = -105.43750000000000;
Crc = 175.34375000000000;
Cuc = -5.5264681577700003e-006;
Cus = 1.1192634701700000e-005;
Cic = -9.6857547759999998e-008;
Cis = -7.8231096267699997e-008;
String SCrs = "" + Crs;
String SCrc = "" + Crc;
String SCuc = "" + Cuc;
String SCus = "" + Cus;
String SCic = "" + Cic;
String SCis = "" + Cis;
textBoxCrs.Text = SCrs.ToString();
textBoxCrc.Text = SCrc.ToString();
textBoxCuc.Text = SCuc.ToString();
textBoxCus.Text = SCus.ToString();
textBoxCic.Text = SCic.ToString();
textBoxCis.Text = SCis.ToString();
double i0, I;
i0 = 0.97432927738800001;
I = 1.8643633724999999e-010;
String Si0 = "" + i0;
String SI = "" + I;
textBoxi0.Text = Si0.ToString();
textBoxI.Text = SI.ToString();
double omega, omega0,we;
omega = -7.7124641122299999e-009;
omega0 = -2.9080127721900002;
we = 7.2921151467e-5;
String Swe = "" + we;
String Somega = "" + omega;
String Somega0= "" + omega0;
textBoxomega.Text = Somega.ToString();
textBoxomega0.Text = Somega0.ToString();
textBoxwe.Text = Swe.ToString();
}
}
}
卫星位置计算(C#版1.0).exe文件及源码下载连接:https://download.youkuaiyun.com/download/weixin_47062907/19390603
卫星位置计算(C#版2.0).exe文件及源码下载连接:https://download.youkuaiyun.com/download/weixin_47062907/19390650