Проблема «реального мира».
Предположим, мы хотим запустить ракету, оснащенную двигателем, который можно дросселировать по своему усмотрению. Предположим также, что количество топлива, сжигаемого за единицу времени, прямо пропорционально восходящей силе двигателя. Как мы должны дросселировать двигатель, чтобы достичь наибольшей высоты, принимая во внимание атмосферное сопротивление?
Физическая формулировка.
Позволять — полная масса ракеты, где его сухая масса и масса оставшегося топлива в момент . Наш двигатель обеспечивает силу, прямо пропорциональную количеству сожженного топлива; поэтому сила, действующая в данный момент будет
Для силы сопротивления мы используем формулу гидродинамики:
Итак, по закону Ньютона имеем
Таким образом, проблема стала следующей:
Найдите неотрицательную функцию (дроссель, т. ) такой, что
Математическая формулировка и резюме.
Данный убывающая функция, пусть
Это задача оптимального управления , поэтому я буду использовать правила оптимального управления. Во-первых, мы представляем уравнения пространства состояний. Также мы берем общую массу как состояние и количество сожженного топлива как входное управление. Итак, у нас есть:
Для нахождения решения определим гамильтониан этой системы:
Используя вариационное исчисление, найдем необходимые условия оптимальности:
Использование уравнений мы можем вывести дифференциальные уравнения состояний и костатов:
Теперь у нас есть семь неизвестных функций с шестью дифференциальными уравнениями в плюс одно уравнение связи в . Для решения этих уравнений нужны достаточные граничные условия. Использование четырех граничных условий в уравнении и два конечных условия в уравнении все необходимые граничные условия будут известны.
Мы не использовали уравнение еще. Это уравнение будет использоваться для нахождения терминального времени .
Наконец, для решения краевой задачи в и из-за нелинейности мы должны использовать численные методы, такие как метод стрельбы .
Я подумал, что этот вопрос интересен, и я не хотел делать какую-либо работу сегодня днем, поэтому я сделал простую модель, чтобы узнать, что произойдет. Мой код Matlab находится в конце вопроса.
До сих пор я тестировал три случая и рассматривал возможность изменения начальной тяги и добавления линейного увеличения тяги для каждого случая. Тяга дается как доля от общего количества сжигаемого топлива в секунду.
Очевидно, что цифры, которые я использовал, не являются невероятно реалистичными или разумными, но они дают первоначальное представление о том, что происходит. Цвет на графиках представляет высоту, полученную с помощью этой тяги.
До сих пор я рассматривал только постоянные коэффициенты лобового сопротивления. Сначала я попробовал k=0 (без перетаскивания)
Как и ожидалось, это дает наибольшую высоту, когда вы сжигаете топливо так быстро, как только можете. Это в основном просто тест, чтобы убедиться, что я не сделал ничего плохого.
Если мы выберем k=1, мы получим
Интересно, что здесь мы видим обратный эффект. Вам нужна самая низкая и самая длинная тяга, которая оторвет вас от земли, поскольку сопротивление воздуха является доминирующей формой сопротивления.
Наконец, промежуточный случай k=0,1
Здесь существует баланс между сопротивлением воздуха и гравитацией, и предпочтение отдается промежуточному значению тяги.
Интересно (по крайней мере, для меня), что было невыгодно сбрасывать газ после запуска. Я подозреваю, что это может произойти, если рассматривается переменная k.
Вот мой код матлаба. Должен работать и в октаве.
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
Алан Роминджер
Дэвид Хаммен
фибонатический
Мозговой штурм
dmckee --- котенок экс-модератор
Росс Милликен
Флорис
Алан Роминджер
ДДжонМ
Майк Данлави
Qмеханик
ниваг