% Nebenrechnungen zu Kapitel 4

%% Standardbeispiele
F1 = @(x) tan(x) - x.*log(0.1*x);
x0 = 4.8;
x1 = 5.5;

F2 = @(x) sign(x - 2).*sqrt(abs(x - 2));
x02 = 0.5;
x12 = 3.5;

% Berechnen der Ableitung mit der Symbolic Toolbox
% auskommentieren, falls Toolbox vorhanden ist
%syms x  
%f1 = tan(x) - x.*log(0.1*x);
%diff(f1)


%% Bisektionsverfahren
a = x0;
b = x1;
sa = sign(F1(a));
sb = sign(F1(b));
fprintf("\nBisektion\n")
fprintf("%f  %f  %f  %f\n\n", a, b, F1(a), F1(b));

while b - a > eps*abs(a)
  xm = (a + b)/2;
  fprintf("%18.15f  %18.15f  %18.15f  %+9.2e\n", a, b, xm, F1(xm));
 
  sm = sign(F1(xm)); 
  if sm == sa
    a = xm;
  else
    b = xm; 
  end
end

%% Newtonverfahren

F1diff = @(x) tan(x)^2-log(1/10*x);
F2diff = @(x) 1./(2*sqrt(abs(x - 2)))
xLast = 0;
x = x0;

fprintf("\nNewton\n")
fprintf("Beispiel1\n")
fprintf("%18.15f\n", x);
while abs(x - xLast) > eps*abs(x)
  xLast = x;
  x = x - F1(x)/F1diff(x);
  fprintf("%18.15f\n", x);
end

fprintf("Beispiel2\n")
x = x02;
for k=1:5
  xLast = x;
  x = x - F2(x)/F2diff(x);
  fprintf("%18.15f\n", x);
end

%% Sekantenverfahren
xl = x0;
xll = x1;

fprintf("\nSekantenverfahren\n")
fprintf("Beispiel1\n")
fprintf("%18.15f\n", xll);
fprintf("%18.15f\n", xl);
while abs(xl - xll) > eps*abs(xl)
  m = (F1(xll) - F1(xl))/(xll - xl);
  x = xl - F1(xl)/m;  
  xll = xl;
  xl = x;
  fprintf("%18.15f\n", x);
end

%% Inverse quadratische Interpolation
xlll = x0;
xll  = x1;
xl   = (x0 + x1)/2;

fprintf("\nIQI\n")
fprintf("Beispiel1\n")
fprintf("%18.15f\n", xlll);
fprintf("%18.15f\n", xll);
fprintf("%18.15f\n", xl);
while abs(xl - xll) > eps*abs(xl)
  xi = [xlll xll xl]';
  yi = F1(xi);
  A = [yi.^2, yi, ones(3,1)];
  para = A \ xi;
  xlll = xll;  
  xll = xl;
  xl = para(3);
  fprintf("%18.15f\n", para(3));
end

%% und schließlich mit fzero
fzero(F1, 4.8)

options = optimset("Display", "iter");
fzero(F1, 5.5, options)


