function koeff = lsq();
% function koeff=lsq();
% Zeichnet ein Ausgleichspolynom durch Punkte. In koeff werden die 
% Koeffizienten des Ausgleichspolynoms retourgegeben. Mit '-' und
% '+' kann man die Ordnung des Polynoms veraendern, mit 'e' kann man
% das Programm beenden. Mit der linken Maustaste kann man Punkte
% setzen, mit der rechten loeschen.
%
% M. Lattmann, August 1999


% Initialisierung der Variablen
x=[]; y=[];
ordnung=1;         % Per default lineare Approximation

running = 1;      
while running,

  clf;
  if length(y) > ordnung,
    % Matrix A zusammensetzen
    A=ones(length(x),1+ordnung);
    for o = 1:ordnung,
      A(:,o+1)=x.^o;
    end;
    
    % Koeffizienten des Ausgleichpolynoms berechnen
    koeff=A\y;

    % Auslgeichspolynom zeichnen
    x1 = linspace(-10,10,1000);
    y1 = ones(size(x1))*koeff(1);
    for o = 1:ordnung,
      y1 = y1+koeff(o+1)*x1.^o;
    end
    plot(x1,y1,'k');
    hold on;
    % Residuen zeichnen
    y2 = ones(size(x))*koeff(1);
    for o = 1:ordnung,
      y2 = y2+koeff(o+1)*x.^o;
    end
    for i =1:length(y2),
      plot([x(i);x(i)],[y(i);y2(i)],'b');
    end;
  end;   % if Anzahl Punkte > Ordnung

  plot(x,y,'ro'), grid;
  str=['Ordnung: ',num2str(ordnung)];
  if (ordnung == 1) & exist('koeff'),
     str=[str,' x0: ',num2str(koeff(1)),' Steigung: ',num2str(koeff(2))];
  end;
  text(-9,-9,str); 
  hold off;
  axis([-10,10,-10,10]);
  
  % Auf Reaktion des Users warten
  [xn,yn,button] = ginput(1);
    if button ==1,
      % Neuen Punkt einfuegen
      if (abs(xn) < 10) & (abs(yn) < 10),
        x = [x;xn];
        y = [y;yn];
      end
    elseif button == 2,
      % Bestehenden Punkt loeschen
      x2=[]; y2=[];
      i =1; j=1;
      while i <=length(x),
	if (abs(x(i)-xn) <0.2) & (abs(y(i)-yn) <0.2),
	  i=i+1;
	else
	  x2(j)=x(i); y2(j)=y(i);
	  i=i+1; j=j+1;
	end;
      end;
      x=x2'; y=y2';
    elseif (button == '+') & (ordnung < 10),
      ordnung = ordnung+1;
    elseif (button == '-') & (ordnung > 1),
      ordnung = ordnung-1;
    elseif (button=='e')|(button=='q')|(button=='E')|(button=='Q'),
      % Programm beenden
      running=0;
    elseif (button=='c')|(button=='C'),
      x=[]; y=[]; ordnung=1; koeff=[0;0];
    end   
end % Der Endlosschleife

close;




