Problem der "realen Welt".
Angenommen, wir wollen eine Rakete starten, die mit einem Motor ausgestattet ist, der nach Belieben gedrosselt werden kann. Nehmen Sie außerdem an, dass die pro Zeit verbrannte Kraftstoffmenge direkt proportional zur Aufwärtskraft ist, die der Motor ausübt. Wie sollten wir den Motor unter Berücksichtigung des Luftwiderstands drosseln, um die höchste Höhe zu erreichen?
Physikalische Formulierung.
Lassen sei die Gesamtmasse der Rakete, wo ist seine Trockenmasse und die Masse des verbleibenden Kraftstoffs zu der Zeit . Unser Motor liefert eine Kraft, die direkt proportional zur verbrannten Kraftstoffmenge ist; so die Kraft, die im Moment ausgeübt wird wird sein
Für die Widerstandskraft verwenden wir die strömungsdynamische Formulierung:
Nach Newtons Gesetz haben wir also
Das Problem hat sich daher zu folgendem entwickelt:
Finden Sie eine nicht negative Funktion (die Drosselklappe, dh ) so dass
Mathematische Formulierung und Zusammenfassung.
Gegeben eine abnehmende Funktion, let
Dies ist ein Optimalsteuerungsproblem , daher werde ich die Regeln der Optimalsteuerung verwenden. Zuerst stellen wir die Zustandsraumgleichungen dar. Außerdem nehmen wir die Gesamtmasse als Zustand und die verbrannte Kraftstoffmenge als Eingangskontrolle. Also haben wir:
Um die Lösung zu finden, definieren wir den Hamiltonoperator dieses Systems:
Unter Verwendung der Variationsrechnung werden die notwendigen Bedingungen für Optimalität gefunden:
Verwenden von Gleichungen wir können Zustände und Differenzialgleichungen ableiten:
Jetzt haben wir sieben unbekannte Funktionen mit sechs Differentialgleichungen in plus eine Nebenbedingungsgleichung in . Zur Lösung dieser Gleichung benötigen wir hinreichende Randbedingungen. Verwendung von vier Randbedingungen in Gleichung und zwei Endbedingungen in Gleichung alle benötigten Randbedingungen sind bekannt.
Wir haben keine Gleichung verwendet noch. Diese Gleichung wird verwendet, um die Endzeit zu finden .
Schließlich zur Lösung des Randwertproblems in und wegen der Nichtlinearität müssen wir numerische Methoden wie die Schießmethode verwenden .
Ich fand diese Frage interessant und wollte heute Nachmittag keine richtige Arbeit machen, also habe ich ein einfaches Modell gemacht, um herauszufinden, was passieren würde. Mein Matlab-Code ist am Ende der Frage.
Bisher habe ich drei Fälle getestet und überlegt, den Anfangsschub zu ändern und für jeden Fall eine lineare Erhöhung des Schubs hinzuzufügen. Der Schub wird als Bruchteil des gesamten pro Sekunde verbrannten Treibstoffs angegeben.
Offensichtlich sind die Zahlen, die ich verwendet habe, nicht unglaublich realistisch oder vernünftig, aber sie geben eine erste Vorstellung davon, was vor sich geht. Die Farbe in den Diagrammen stellt die Höhe dar, die mit diesem Schub erreicht wird.
Bisher habe ich nur konstante Luftwiderstandsbeiwerte betrachtet. Zuerst habe ich versucht k = 0 (kein Widerstand)
Wie erwartet ergibt dies die größte Höhe, wenn Sie Kraftstoff so schnell wie möglich verbrennen. Dies ist hauptsächlich nur ein Test, um zu überprüfen, ob ich nichts falsch gemacht habe.
Wenn wir k=1 wählen, erhalten wir
Interessanterweise sehen wir hier den gegenteiligen Effekt. Sie wollen den niedrigsten und längsten Schub, der Sie vom Boden abhebt, da der Luftwiderstand die dominierende Form des Luftwiderstands ist.
Schließlich ein Zwischenfall von k = 0,1
Hier herrscht ein Gleichgewicht zwischen Luftwiderstand und Schwerkraft und ein mittlerer Schubwert wird bevorzugt.
Interessanterweise (zumindest für mich) war es nicht vorteilhaft, nach dem Start Gas zu geben. Ich vermute, dass dies auftreten kann, wenn die Variable k berücksichtigt wird.
Hier ist mein Matlab-Code. Sollte auch in Oktave laufen.
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 Römer
David Hammen
fibonatisch
Brainstorming
dmckee --- Ex-Moderator-Kätzchen
Ross Millikan
Floris
Alan Römer
DJohnM
Mike Dunlavey
QMechaniker
nivag