题设:有一颗卫星,在给定任意的速度与高度的条件下,绘制出卫星轨道。
绘制场景
将地球球心放在坐标系原点,然后自己设定卫星(不单独画出来,就当作点状)的相关参数如速度矢量、位置矢量。
%绘制地球
alpha=0:pi/40:2*pi;
earth_x=R*cos(alpha);
earth_y=R*sin(alpha);
设定参数:
%设定卫星位置矢量与速度矢量以及所受引力
i=1;
%以下为可修改区域
vx(i)=-50; %卫星速度在x轴上的分量m/s
vy(i)=6070; %卫星速度在y轴上的分量m/s
rx(i)=18164*1000; %卫星位置坐标x(单位m)
ry(i)=-8600*1000; %卫星位置坐标y(单位m)
%以上为可修改区域
Fx(i)=-z*m*rx(1)/((rx(1)^2+ry(1)^2)^1.5);
Fy(i)=-z*m*ry(1)/((rx(1)^2+ry(1)^2)^1.5);
原理介绍
已知卫星的初始位置矢量、速度矢量与所受的引力,那么在后,新的速度矢量为,进而求出新的位置矢量,然后再用求出新的位置所受的引力,以此类推迭代出下一步新的位置矢量与速度矢量。
迭代实现
%开始迭代
while i<130*3600 %可改卫星运行时间
%卫星开始运行至绕地球一周
vx(i+1)=vx(i)+Fx(i)/m*dt;
vy(i+1)=vy(i)+Fy(i)/m*dt;
rx(i+1)=rx(i)+vx(i)*dt;
ry(i+1)=ry(i)+vy(i)*dt;
Fx(i+1)=-z*m*rx(i+1)/((rx(i+1)^2+ry(i+1)^2)^1.5);
Fy(i+1)=-z*m*ry(i+1)/((rx(i+1)^2+ry(i+1)^2)^1.5);
i=i+1;
end
注意,因为用米做单位,程序内的数字基本上是非常大的数字,这些数字作大小比较就会出现非常大的误差,所以程序最大的bug就是卫星运行时间需要自己一步一步地手动输入数字去拟合。
额外数据设定
同样可以数据更新以实现可视化。
%计算数据
T=i;%运行时间(单位秒)
dx=diff(rx);
dy=diff(ry);
ds=sqrt(dx.^2+dy.^2); %弧微分
road=sum(ds); %轨迹长度
%开始绘图
figure();
plot(rx,ry,'r-',earth_x,earth_y,'b-');
axis equal;
axis([-15*R 15*R -15*R 15*R]);
grid on;
xlabel('轨迹长度是'+string(road)+'m');
ylabel('运动周期是'+string(T)+'s');
legend('卫星轨迹','地球外围');
title('卫星轨迹模拟');
%若出现轨迹与地球相交,则说明卫星在此模拟情形中会做向心运动直至撞向地球
运行结果展示
1.模拟地球同步卫星:
2.模拟大椭圆轨道:
3.模拟抛物线轨道中的一部分:
代码可能有误或亟需优化的地方,恳请各位大佬斧正指点。