# ampl: ZERMELO
# Ricki Rosendahl, 29.08.2005
#---------------------------------------------------------
# der letzte Punkt von u wird nicht veraendert.
# das liegt daran, dass diese Variable nicht in dem Optimierungsproblem
# beruecksichtigt wird.
#---------------------------------------------------------
# Allgemein:
param m;			# Diskretisierungen
param nx; param nu;		# Dimension Zustand / Steuerung
param t0; param tf;		# Anfangs- / Endzeitpunkt
param ht := (tf-t0)/m; 		# Abstand
param t{i in 0..m} = t0+i*ht;	# Zeit (aequidistant!!!)
var x{(i,j) in {0..m,1..nx}};	# Zustand
var u{(i,j) in {0..m,1..nu}};	# Steuerung

#----------------------------------------------------------
#------ BEISPIEL-Beschreibung (Anfang) --------------------
param w; param v0;		# Parameter fuer Zermelo

var ziel = x[m,3];		# Zielfunktion

var f{(i,j) in {0..m,1..nx}} =	# rechte Seite
if      (j==1) then         x[i,3]*w*cos(u[i,1])
else if (j==2) then         x[i,3]*(w*sin(u[i,1])+v0*(1-x[i,1]^2))
else if (j==3) then         x[i,3]*0;

#------ BEISPIEL-Beschreibung (Ende) ----------------------
#----------------------------------------------------------

param n0; param nf;		# Anzahl fester Anfangs-/Endwerte
param x0{i in 1..n0}; 
param xf{i in 1..nf};

minimize zielfunktion: ziel;

# Differentialgleichung mit EULER geloest
subject to dgln {(i,j) in {0..m-1,1..nx}}: x[i+1,j]-x[i,j] = ht * f[i,j];
subject to anfa {i in 1..n0}:              x[0,i] = x0[i];
subject to ende {i in 1..nf}:              x[m,i] = xf[i];
