function [xopt] = startferry(xopt)
% Loesung eines Optimalsteuerungsproblems
% am Beispiel des Zermelo Problems (Ferryman)
% Dies ist die Startdatei fuer das Optimalsteuerungsproblem "ferry".
% Startdaten aus faehr.dat einladen:
% load faehr.dat
% startferry(faehr)

%if nargin<1 error('keine Startdaten, Anfang von startferry.m lesen');end;

% Stoppuhr
tic;

% Vorgaben festlegen
%n = 16;     % Anzahl der Diskretisierungsintervalle, bei xopt aus faehr.dat.
n = 2;     % Anzahl der Diskretisierungsintervalle
n1 = n+1;   % Anzahl der Diskretisierungspunkte
nx  = 2;    % Anzahl der Zustandsgroessen

% Diskretisierung festlegen;            
knoten = [0:1/n:1]';

% Variablen fuer die  Minimierungsroutine initialisieren
% (u besteht aus Anfangszustaenden und diskreter Steuerung)
% (nur wenn keine Anfangsschaetzungen vorgegeben wurden)
if (nargin < 1) 
   nxopt = 1+n;
   xopt = zeros(nxopt,1);
   xopt(1) = 1;
else
   nxopt = size(xopt,1);
end;

% Die festen Anfangszustaende bestimmen 
ya = zeros(2,1);
ya(1) = -1; ya(2) = 0;

% Optionen fuer das SQP-Verfahren in "constr" festlegen
%options(2) = 1e-6;   %options(2-4) Genauigkeit der Abbruchbedingung
%options(3) = 1e-6;
%options(4) = 1e-6;
options(13) = 2;  % Die ersten "options(13)" Nebenbedingungen sind 
                  % Gleichungsnebenbedingungen,
                  % die restlichen sind Ungleichungsnebenbedingungen 
                  % der Form g <= 0.

% Vorgaben fuer das Ferryman Problem:
W = 2; % Eigengeschwindigkeit des Bootes

% Minimierungsroutine aufrufen
[xopt] = constr('ferry',xopt,options,[],[],[],knoten,ya,W);

% Die optimale Steuerung aus xopt explizit benennen.
u = xopt(nxopt-n+1:nxopt);

% ===========================================================================
% Ausgabe der Resultate
% ===========================================================================
toc

% Loesungstrajektorie integrieren
options = odeset;
[t,xdgl] = getyplot('dglferry',options,knoten,ya,u,10,[xopt(1);W]);

xwerte=xdgl(:,1);	%	Es soll u ueber x und nicht ueber t(aus [0,1])
tthilfe=[];             %       aufgetragen werden. Es muss x(knoten) bestimmt
for i=1:n1              %       werden. 
  k=find(t==knoten(i));
  tthilfe=[tthilfe,xwerte(k(1))'];
end;

% Damit Steuerung sturckweise konstant dargestellt wird. 
tt = cat(1,tthilfe([1:n]),tthilfe([2:n1]));
% Zum zeichnen wird u in einer anderen Form dargestellt. 
uu = cat(1,u',u');
% Darstellung der Steuerung
plot(tt,uu,'r-');

% Darstellung des Zustandes in einem anderen Fenster
figure;
plot(xdgl(:,1),xdgl(:,2),'b-');
xopt








