Неизвестная ошибка в коде для определения угла, необходимого для посадки ракеты на Луну - PullRequest
1 голос
/ 18 апреля 2020

Мне нужно найти угол ракеты, учитывая условия в коде, который позволяет ей приземлиться на Луну. Луна считается стационарной по заданным координатам. Я предположил, что единственный способ попробовать это просто вычислить различные компоненты скорости и затем ввести их для каждого угла от минимума до максимума, что я и пытался сделать.

Не уверен, почему это не так не работает - он работает вечно и ничего не выводит.

Спасибо.

У меня есть

v = 0.0066;

for angle = 0:.5:180

init_vel = [v*cosd(angle), v*sind(angle)];
init_pos = [3.7,0];
t = 10;
moon_pos = [0,222];
%simulate rocket
[tout, pos] = simulaterocketmovement(init_pos, init_vel, moon_pos, t);

    if(length(tout)<99999)
        break;
    end
 end

 disp(angle);

 plot(pos(:,1),pos(:,2));

где

function [ tout , pos ] = simulaterocketmovement ( init_pos , init_vel , moon_pos , t)

%Defining initial variables for later use
G = 9.63*10^-7;
Me = 83.3;

%Defining the two vectors we will use
x = init_pos(1);
y = init_pos(2);
vx = init_vel(1);
vy = init_vel(2);


%Need to create a seperate function that integrates to find the
%acceleration using Euler's second order method.
function a = acc(x,y)
    ax = -(G*Me*x)/((x^2 + y^2)^1.5) - (G*(x-moon_pos(1)))/(((moon_pos(1)-x)^2 + (moon_pos(2)-y)^2)^1.5);
    ay = -(G*Me*y)/((x^2 + y^2)^1.5) - (G*(y-moon_pos(2)))/(((moon_pos(1)-x)^2 + (moon_pos(2)-y)^2)^1.5);
    %After finding the vector components, we put them in an acceleration vector.
    a = [ax,ay];
end  


%Now we find the values which result in the rocket landing on the moon. The
%range of values lie between xmin and xmax, and ymin and ymax. The +/-
%represents that the rocket can land anywhere on the moon's surface.
xmax = moon_pos(1) + 1;
xmin = moon_pos(1) - 1;
ymax = moon_pos(2) + 1;
ymin = moon_pos(2) - 1;


%For each time taken, to find the x and y values we need to use a while
%loop which works until the rocket is in the range of values for it to
%land on the moon.
while((x(end) > xmax) || (x(end) < xmin) || (y(end) < ymin) || (y(end) > ymax) )

%We assign temporary new values of x and y.
x(end+1) = x(end) + t*vx;
y(end+1) = y(end) + t*vy;

%Then we find the values of acceleration for both the old and new x and y 
aold = acc(x(end-1), y(end-1));
anew = acc(x(end), y(end));

%Using this to find the new velocities
vxnew = vx + t*(aold(1)+anew(1))/2;
vynew = vy + t*(aold(2)+anew(2))/2;

%Final, more accurate values for x and y
x(end) = x(end-1) + t*(vxnew + vx)/2;
y(end) = y(end-1) + t*(vynew + vy)/2;

%And updating these as the new velocities
vx = vxnew;
vy = vynew;

end    

%Then we construct a vector for the time steps, for the entire journey.
tout = 0:t:((length(x)-1)*t);

 %And then create a position vector which includes the x and y positions.
pos = zeros(length(x),2);
pos(:,1) = x;
pos(:,2) = y;

end
...