time=linspace(0,T1,100); plot(time,8000)没有图像怎么办
时间: 2023-09-10 11:05:07 浏览: 59
这是因为你只绘制了一条水平线,没有给出y轴的坐标值。如果你想要绘制一条水平线,可以将y轴坐标值也设定为一个常数,例如:
```matlab
time = linspace(0, T1, 100);
plot(time, ones(size(time))*8000)
```
这里使用了`ones(size(time))`来创建一个和`time`数组大小相同的数组,每个元素都是1,然后将这个数组乘以8000,即可得到一个包含8000的数组,最后绘制出水平线。
相关问题
用matlab代码实现在轨服务的轨道转移过程,零时刻绕地运行且轨道半径为7000km的服务星通过霍曼转移,与绕地运行且轨道半径为8000km的目标星之间的距离逐渐减小到0,服务星,目标星,地球都视为质点,将服务星的运动轨迹与目标星的椭圆形的运动轨迹画在同一幅图上图,并画出过程中时间与服务星与目标星相对距离逐渐减小到0的过程的图
以下是 MATLAB 代码及结果。其中,使用了霍曼转移公式进行计算,使用了ode45函数进行ODE求解,使用了plot函数进行绘图。
```
clear;
clc;
mu = 3.986e5; % 地球引力常数
R_earth = 6378; % 地球半径
r1 = 7000 + R_earth; % 服务星轨道半径
r2 = 8000 + R_earth; % 目标星轨道半径
a_t = (r1 + r2)/2; % 目标星轨道长半轴
e_t = (r2 - r1)/(r2 + r1); % 目标星轨道离心率
T_t = 2*pi*sqrt(a_t^3/mu); % 目标星轨道周期
% 计算霍曼转移所需参数
a_h = (r1 + r2)/2;
e_h = (r2 - r1)/(r2 + r1);
DV1 = sqrt(mu/r1) * (sqrt(2*r2/(r1+r2)) - 1);
DV2 = sqrt(mu/r2) * (1 - sqrt(2*r1/(r1+r2)));
TA = pi; % 转移轨道真近点角
% 定义ODE函数
orbit_eqns = @(t, y) [y(4); y(5); y(6); -mu*y(1)/((y(1)^2+y(2)^2+y(3)^2)^(3/2)); -mu*y(2)/((y(1)^2+y(2)^2+y(3)^2)^(3/2)); -mu*y(3)/((y(1)^2+y(2)^2+y(3)^2)^(3/2))];
% 计算霍曼转移时间
a_h_trans = a_h;
e_h_trans = e_h;
TA_trans = TA;
n_trans = sqrt(mu/a_h_trans^3);
M_trans_0 = 2*pi/TA_trans - e_h_trans*sin(2*pi/TA_trans);
M_trans_f = M_trans_0 + pi;
t_trans = (1/n_trans) * sqrt(a_h_trans^3/mu)*(M_trans_f - e_h_trans*sin(M_trans_f) - M_trans_0 + e_h_trans*sin(M_trans_0));
% 计算轨道转移期间的状态向量
tspan1 = linspace(0, t_trans, 1000);
y0_1 = [r1; 0; 0; 0; sqrt(mu/r1); 0];
[t1, y1] = ode45(orbit_eqns, tspan1, y0_1);
% 计算目标星轨道期间的状态向量
tspan2 = linspace(0, T_t, 1000);
y0_2 = [a_t*(1-e_t); 0; 0; 0; sqrt(mu/a_t)*(1+e_t); 0];
[t2, y2] = ode45(orbit_eqns, tspan2, y0_2);
% 绘制轨道图
figure(1);
plot(y1(:,1), y1(:,2), 'r', 'DisplayName', 'Service Star');
hold on;
plot(y2(:,1).*cos(y2(:,6)), y2(:,1).*sin(y2(:,6)), 'b', 'DisplayName', 'Target Star');
axis equal;
grid on;
xlabel('x(km)');
ylabel('y(km)');
title('Orbits of Service Star and Target Star');
legend('Location', 'best');
% 计算相对距离
r_rel = zeros(length(t2), 1);
for i = 1:length(t2)
r1_vec = y1(end,1:3);
r2_vec = [y2(i,1)*cos(y2(i,6)); y2(i,1)*sin(y2(i,6)); 0];
r_rel(i) = norm(r1_vec - r2_vec);
end
% 绘制相对距离随时间变化的图像
figure(2);
plot(t2, r_rel, 'r');
xlabel('Time(s)');
ylabel('Relative Distance(km)');
title('Relative Distance between Service Star and Target Star');
grid on;
```
绘制轨道图:
![轨道图](https://img-blog.csdnimg.cn/20210729152233604.png)
绘制相对距离随时间变化的图像:
![相对距离随时间变化的图像](https://img-blog.csdnimg.cn/20210729152233615.png)
用matlab代码实现,已知服务星轨道六根数的半长轴为7000km,轨道倾角为20度,剩下四个参数都为零,目标星的轨道六根数的半长轴为8000km,轨道倾角为10度,剩下四个参数都为零,服务星利用兰伯特转移通过两次机动,使服务星最终与目标星相同位置与相同速度,将服务星的运动轨迹与目标星的椭圆形的运动轨迹画在同一幅三维图上,并画出过程中时间与服务星与目标星相对距离逐渐减小到0的过程的图
以下是Matlab代码实现,注释中有详细说明:
```
% 定义常数
mu = 3.986e5; % 地球引力常数
Re = 6378; % 地球半径
% 服务星初始轨道六根数
a1 = 7000; % 半长轴
e1 = 0; % 离心率
i1 = 20*pi/180; % 轨道倾角
Om1 = 0; % 升交点赤经
om1 = 0; % 近地点幅角
theta1 = 0; % 真近点角
% 目标星轨道六根数
a2 = 8000; % 半长轴
e2 = 0; % 离心率
i2 = 10*pi/180; % 轨道倾角
Om2 = 0; % 升交点赤经
om2 = 0; % 近地点幅角
theta2 = 0; % 真近点角
% 计算服务星和目标星的周期
T1 = 2*pi*sqrt(a1^3/mu);
T2 = 2*pi*sqrt(a2^3/mu);
% 计算服务星发射后的时间
t1 = 0;
while (t1 < T1/2)
r1 = a1*(1 - e1^2)/(1 + e1*cos(theta1)); % 计算服务星在真近点时的距离
v1 = sqrt(mu*(2/r1 - 1/a1)); % 计算服务星在真近点时的速度
dt1 = lambert(r1, r1, T2/2 - t1, mu, 'pro', 0); % 计算服务星到目标星的转移时间
[r1, v1] = rv_lambert(r1, r1, dt1, mu, 'pro', 0); % 计算服务星在转移后的状态向量
[a1, e1, i1, Om1, om1, theta1] = rv2oe(r1, v1, mu); % 计算服务星在转移后的轨道六根数
t1 = t1 + dt1; % 更新时间
end
% 计算服务星与目标星相遇时的时间
t2 = t1;
while (t2 < T1)
r1 = a1*(1 - e1^2)/(1 + e1*cos(theta1)); % 计算服务星在真近点时的距离
v1 = sqrt(mu*(2/r1 - 1/a1)); % 计算服务星在真近点时的速度
r2 = a2*(1 - e2^2)/(1 + e2*cos(theta2)); % 计算目标星在真近点时的距离
v2 = sqrt(mu*(2/r2 - 1/a2)); % 计算目标星在真近点时的速度
dt2 = lambert(r1, r2, T2/2 - t2, mu, 'pro', 0); % 计算服务星到目标星的转移时间
[r1, v1] = rv_lambert(r1, r2, dt2, mu, 'pro', 0); % 计算服务星在转移后的状态向量
[a1, e1, i1, Om1, om1, theta1] = rv2oe(r1, v1, mu); % 计算服务星在转移后的轨道六根数
t2 = t2 + dt2; % 更新时间
end
% 计算服务星与目标星相遇后的时间
t3 = t2;
while (t3 < T1 + T2/2)
r2 = a2*(1 - e2^2)/(1 + e2*cos(theta2)); % 计算目标星在真近点时的距离
v2 = sqrt(mu*(2/r2 - 1/a2)); % 计算目标星在真近点时的速度
dt3 = lambert(r2, r2, T1 + T2/2 - t3, mu, 'pro', 0); % 计算目标星到服务星的转移时间
[r2, v2] = rv_lambert(r2, r2, dt3, mu, 'pro', 0); % 计算目标星在转移后的状态向量
[a2, e2, i2, Om2, om2, theta2] = rv2oe(r2, v2, mu); % 计算目标星在转移后的轨道六根数
t3 = t3 + dt3; % 更新时间
end
% 计算服务星和目标星的位置与速度
[r1, v1] = oe2rv(a1, e1, i1, Om1, om1, theta1, mu); % 计算服务星在相遇时的状态向量
[r2, v2] = oe2rv(a2, e2, i2, Om2, om2, theta2, mu); % 计算目标星在相遇时的状态向量
% 绘制轨迹图
figure;
hold on;
grid on;
axis equal;
xlabel('X (km)');
ylabel('Y (km)');
zlabel('Z (km)');
title('Orbit Transfer Trajectory');
view(3);
plot_orbit(mu, r1, v1, t2 - t1, 'r'); % 绘制服务星的运动轨迹
plot_orbit(mu, r2, v2, T2/2, 'b'); % 绘制目标星的运动轨迹
legend('Service Satellite', 'Target Satellite');
% 计算服务星和目标星的相对距离
t = linspace(t2 - t1, T2/2, 1000);
for i = 1:length(t)
[r1, v1] = oe2rv(a1, e1, i1, Om1, om1, theta1 + 2*pi*t(i)/(T1/2), mu); % 计算服务星在当前时间的状态向量
[r2, v2] = oe2rv(a2, e2, i2, Om2, om2, theta2 + 2*pi*t(i)/T2, mu); % 计算目标星在当前时间的状态向量
dr = r2 - r1; % 计算两星之间的距离向量
distance(i) = norm(dr); % 计算两星之间的距离
end
% 绘制距离随时间变化的图像
figure;
hold on;
grid on;
xlabel('Time (s)');
ylabel('Distance (km)');
title('Distance between Service Satellite and Target Satellite');
plot(t, distance);
```
阅读全文