Problema del "mundo real".
Supongamos que queremos lanzar un cohete equipado con un motor que podemos estrangular como prefiramos. Suponga también que la cantidad de combustible quemado por tiempo es directamente proporcional a la fuerza hacia arriba que ejerce el motor. ¿Cómo deberíamos acelerar el motor para alcanzar la mayor altitud, teniendo en cuenta la resistencia atmosférica?
formulación física.
Dejar Sea la masa total del cohete, donde es su masa seca y la masa del combustible restante en el tiempo . Nuestro motor proporciona una fuerza directamente proporcional a la cantidad de combustible quemado; por lo que la fuerza ejercida en el momento será
Para la fuerza de arrastre usamos la formulación de dinámica de fluidos:
Entonces por la ley de Newton tenemos
Por lo tanto, el problema se ha convertido en el siguiente:
Encuentre una función no negativa (el acelerador, es decir ) tal que
Formulación matemática y recapitulación.
Dado una función decreciente, sea
Este es un problema de control óptimo , así que usaré las reglas de control óptimo. Primero, representamos las ecuaciones del espacio de estado. También tomamos la masa total como estado y la cantidad de combustible quemado como control de entrada. Entonces tenemos:
Para encontrar la solución, definimos el hamiltoniano de este sistema:
Utilizando el cálculo de variaciones, se encontrarán las condiciones necesarias para la optimalidad:
Usando ecuaciones podemos derivar ecuaciones diferenciales de estados y costas:
Ahora, tenemos siete funciones desconocidas. con seis ecuaciones diferenciales en más una ecuación de restricción en . Para resolver estas ecuaciones necesitamos suficientes condiciones de contorno. Usando cuatro condiciones de contorno en la ecuación y dos condiciones finales en la ecuación se conocerán todas las condiciones de contorno necesarias.
No usamos la ecuación todavía. Esta ecuación se utilizará para encontrar el tiempo terminal .
Finalmente, para resolver el problema de valores en la frontera en y debido a la no linealidad, debemos usar métodos numéricos como el método de disparo .
Pensé que esta pregunta era interesante y no quería hacer ningún trabajo adecuado esta tarde, así que hice un modelo simple para averiguar qué sucedería. Mi código de matlab está al final de la pregunta.
Hasta ahora, probé tres casos y consideré cambiar el empuje inicial y agregar un aumento lineal en el empuje para cada caso. El empuje se da como una fracción del combustible total quemado por segundo.
Obviamente, los números que he usado no son increíblemente realistas ni sensatos, pero dan una idea inicial de lo que está pasando. El color de los gráficos representa la altura obtenida con ese empuje.
Hasta ahora solo he considerado coeficientes de arrastre constantes. Primero probé k = 0 (sin arrastre)
Como era de esperar, esto da la mayor altura cuando quema combustible lo más rápido que puede. Esto es principalmente solo una prueba para comprobar que no he hecho nada demasiado malo.
Si elegimos k=1 obtenemos
Curiosamente aquí vemos el efecto contrario. Desea el empuje más bajo y más largo que lo hará despegar, ya que la resistencia del aire es la forma dominante de arrastre.
Finalmente un caso intermedio de k=0.1
Aquí hay un equilibrio entre la resistencia del aire y la gravedad y se favorece un valor intermedio de empuje.
Curiosamente (al menos para mí), no fue ventajoso acelerar después del lanzamiento. Sospecho que esto puede ocurrir si se considera la variable k.
Aquí está mi código de matlab. Debería funcionar en octava también.
function[x]=rocket_test(thrustparam)
g=9.81;
md=1000;
mf=1000;
k=0.1;
nu=1000;
dt=0.001;
v=0;
x=0;
t=0;
c=thrustparam(1)*mf;
p_1=thrustparam(2)*mf;
count=1;
while v>=0 %want to find max height keep going until you start descending.
throttle=throttle_set(t, c, p_1);
if mf-throttle*dt<0 %if you would burn more fuel than left burn all the fuel left;
throttle=mf/dt;
end
m=md+mf;
Fd=k*v^2+m*g;
Ft=nu*throttle;
F=Ft-Fd;
a=F/m;
x=x+v*dt+0.5*a*dt^2;
v=v+a*dt;
mf=mf-throttle*dt;
t=t+dt;
%store(count, :)=[t, x, v, a, throttle, Fd, Ft, F, m];
%count=count+1;
end
end
function [throttle]=throttle_set(t, c, p_1)
throttle=c+p_1*t;
if throttle<0
throttle=0;
end
end
Alan Romero
david hamen
fibonático
Lluvia de ideas
dmckee --- gatito ex-moderador
ross milikan
floris
Alan Romero
djohnm
mike dunlavey
qmecanico
nivag