Я работаю над линеаризованной моделью для простого анализа и оптимизации траектории в Ampl.Основная предпосылка состоит в том, чтобы оптимизировать 2D траекторию полета для электрического самолета, проходящего 500 км, в зависимости от его основных параметров.
Упрощенная диаграмма сил, используемая для этой задачи, может быть замечена здесь .Уравнения для этой задачи могут быть упрощены для устойчивого полета в каждой точке и, следовательно, могут быть решены с помощью ньютоновского решателя, как показано здесь .
Я пытаюсь смоделировать эту проблему с использованием Ampl вместоOpenMDAO, однако, борется с тем фактом, что альфа должна решаться неявно.Чтобы еще больше упростить задачу, я установил скорость на минимальную скорость сопротивления (в зависимости от плотности воздуха).
Однако мой код Ampl генерирует синтаксис и другие ошибки, когда я пытаюсь его скомпилировать,код:
#UNIVERSAL PARAMETERS
param P_s := 101300; # Ref pressure [Pa]
param R := 287; # Gas constannt
param T_0 :=250; # Ref temp for troposphere [K]
param g := 9.81; #Acc due to gravity
param H := R*T_0/g; # Scale height
#AIRCRAFT PARAMETERS
param c1 := -3.85; param c2 := 4.8923; param c3 :=0.6865; #Drag perameters
param c0 := 0.034;
param k := 0.069622;
param A;
param S := 90; #wing area
param m := 16000; #Mass of acc [kg]
param W := m*g; #Weight of acc
#AIRCRAFT CONSTRAINTS
param gamma_min := -0.52; param gamma_max := 0.52; #Gamma constraints =/- 30degrees
param alpha_min := -0.17; param alpha_max := 0.17; #Alpha constraints =/- 10degrees
#FLIGHT PARAMETERS
param h_0 := 100; #Coords of starting point
param r_0 := 0;
param h_n := 100; #Coords of end point
param r_n := 516000;
param n := 50; #Number of time points
var T >= 0; #Total time for flight
var h{0..n}; #coords of flightpath
# Control variables
var gamma {i in 1..n-1} >= gamma_min, <= gamma_max;
var rho {i in 1..n-1} = ((P_s)/(R*T_0))*exp(-h[i]/H); #Density as a function of height
var va {i in 1..n-1} = ((2*W)/(rho[i]*S)^0.5)*(k/(c0))^0.25; #Velocity FULLY DEFINED for every point
var alpha {i in 1..n-1} >= alpha_min, <= alpha_max; #Alpha that can only be solved implicitly
var cL {i in 1..n-1} = c1*alpha[i]^2+c2*alpha[i]+c3; #Lift Coeff APHA DEP
var cD {i in 1..n-1} = c0+k*cL[i]^2; #Drag Coefficient
var D {i in 1..n-1} = .5*cD[i]*rho[i]*S*va[i]^2; #Drag
var FT {i in 1..n-1} = ((W*sin(gamma[i])+D))/cos(alpha[i]); #Thrust equation
var L {i in 1..n-1} = .5*cL[i]*rho[i]*S*va[i]^2; #Lift EQ General ALPHA DEP
var L2 {i in 1..n-1} = W*cos(gamma[i])-FT*sin(alpha[i]); #Lift Balance EQ GAMMA and ALPHA DEP
var r{0..n} = (r[i+1] - r[i]) / (1/n) = va[i] cos (gamma[i]); #RANGE;
minimize P: sum {i in 1..n-1} FT[i]*r[i];
s.t. h_initial: h[0] = h_0;
s.t. r_initial: r[0] = r_0;
s.t. h_final: h[n] = h_n;
s.t. r_final: r[n] = r_n;
s.t. newtonian: L[i]-L2[i] <= 0.001 #my attempt at a basic newtonian solver for the implicit determination of alpha
solve;
Буду признателен за любые отзывы о методологии, лежащей в основе этого или общего подхода.