function [f1,f2] = tfunc3b(varargin) 
% Funktion mit vier Input-Variablen und zwei Output-Variablen.
% Die Variable varargin ist eine Zelle, die alle übergebenen
% Input-Variablen enthält.
% 
% Berechnet die Funktionen f1(x) = a * x^2 * f(x)
%                          f2(x) = a * x^2 * f(x) + b * x
%  
% Aufruf: [f1,f2] = tfunc3b(f,x,a,b)
% Input:  f   char   array,  {'sin', 'cos', 'tan', 'cot'}, 
%                    default 'sin'
%         x   double array 
%         a   double scalar, optional, default a=1
%         b   double scalar, optional, default b=2
% Output: f1  double array   f1 = a * x.^2 .* f(x)
%         f2  double array   f2 = a * x.^2 .* f(x) + b * x

  if nargin<1, error('Aufruf: [f1,f2]=tfunc3b(f,x,a,b)'); end
  if ~ischar(varargin{1}) % Erstes Element kein String
    % Rekursiver Aufruf von tfunc3b
    [f1,f2] = tfunc3b('sin',varargin{:}); 
    % Übergabe von 'sin' und aller Parameter vom ersten Aufruf.	
    return % Beendet ersten Aufruf der Funktion
  end
  
  f = varargin{1}; % Erster Übergabeparameter
  if nargin<2, 
    error('Aufruf mit [f1,f2] = tfunc3b(f,x,a,b)');
  else
    x = varargin{2}; % Zweiter Übergabeparameter
  end
  
  if nargin<3, a = 1; else, a = varargin{3}; end
  if isempty(a), a = 1; end
  if nargin<4, b = 2; else, b = varargin{4}; end
  if isempty(b), b = 2; end
    
  % Die String-Variable f wird nun einerseits als Schalter, 
  % aber auch zur Konstruktion der Funktion verwendet.
  switch f
   case {'sin', 'cos', 'tan', 'cot'}
    % Zusammensetzen einer Zeichenkette [s1,s2,s3]
    e_string = ['a * x.^2 .* ',f,'(x)'];
    disp(['Berechnung mit: ',e_string]);
    % Mit eval kann man den Inhalt einer Zeichenkette als 
    % Kommando ausführen. 
    % z.B.: f = eval('3*x+2'); equivalent mit f = 3*x+2;
    f1 = eval(e_string);
   otherwise
    error(['Fall ',f,' nicht erlaubt!']);
  end
  if nargout>1, f2 = f1 + b * x; end